Page MenuHomeFreeBSD

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
Index: stable/11/contrib/subversion/CHANGES
===================================================================
--- stable/11/contrib/subversion/CHANGES (revision 309510)
+++ stable/11/contrib/subversion/CHANGES (revision 309511)
@@ -1,6325 +1,6409 @@
+Version 1.9.5
+(29 Nov 2016, from /branches/1.9.x)
+http://svn.apache.org/repos/asf/subversion/tags/1.9.5
+
+ User-visible changes:
+ - Client-side bugfixes:
+ * fix accessing non-existent paths during reintegrate merge (r1766699 et al)
+ * fix handling of newly secured subdirectories in working copy (r1724448)
+ * info: remove trailing whitespace in --show-item=revision (issue #4660)
+ * fix recording wrong revisions for tree conflicts (r1734106)
+ * gpg-agent: improve discovery of gpg-agent sockets (r1766327)
+ * gpg-agent: fix file descriptor leak (r1766323)
+ * resolve: fix --accept=mine-full for binary files (issue #4647)
+ * merge: fix possible crash (issue #4652)
+ * resolve: fix possible crash (r1748514)
+ * fix potential crash in Win32 crash reporter (r1663253 et al)
+
+ - Server-side bugfixes:
+ * fsfs: fix "offset too large" error during pack (issue #4657)
+ * svnserve: enable hook script environments (r1769152)
+ * fsfs: fix possible data reconstruction error (issue #4658)
+ * fix source of spurious 'incoming edit' tree conflicts (r1770108)
+ * fsfs: improve caching for large directories (r1721285)
+ * fsfs: fix crash when encountering all-zero checksums (r1759686)
+ * fsfs: fix potential source of repository corruptions (r1756266)
+ * mod_dav_svn: fix excessive memory usage with mod_headers/mod_deflate
+ (issue #3084)
+ * mod_dav_svn: reduce memory usage during GET requests (r1757529 et al)
+ * fsfs: fix unexpected "database is locked" errors (r1741096 et al)
+ * fsfs: fix opening old repositories without db/format files (r1720015)
+
+ - Client-side and server-side bugfixes:
+ * fix possible crash when reading invalid configuration files (r1715777)
+
+ - Bindings bugfixes:
+ * swig-pl: do not corrupt "{DATE}" revision variable (r1767768)
+ * javahl: fix temporary accepting SSL server certificates (r1764851)
+ * swig-pl: fix possible stack corruption (r1683266, r1683267)
+
+ Developer-visible changes:
+ - General:
+ * add zlib discovery through pkg-config (issue #4655)
+ * fix potential build issue with invalid SVN_LOCALE_DIR (issue #4653)
+ * ruby: fix test failures with ruby >= 2.2 (r1766621)
+ * fix link error with --disable-keychain on OS X (r1765385)
+ * swig: enable building with SWIG >= 3.0.6 (r1721488 et al)
+ * swig: fix building with -Wdate-time in $CPPFLAGS (r1722164)
+ * update serf download URI in build scripts (r1700130 et al)
+ * raise minimal httpd version from 2.0 to 2.2 (r1754193)
+
+
Version 1.9.4
(28 Apr 2016, from /branches/1.9.x)
http://svn.apache.org/repos/asf/subversion/tags/1.9.4
User-visible changes:
- Client-side bugfixes:
* diff: support '--summarize --ignore-properties' (part of issue #4567)
* checkout: fix performance regression on NFS (r1710167)
* gpg-agent: properly handle passwords with percent characters (issue #4611)
* svn-graph.pl: fix assertion about a non-canonical path (r1729060 et al)
* hot-backup.py: better input validation (r1721174, r1721175)
* commit: abort on Ctrl-C in plaintext password prompt (issue #4624)
* diff: produce proper forward binary diffs with --git (r1704292, r1704573)
* ra_serf: fix deleting directories with many files (issue #4557)
- Server-side bugfixes:
+ * mod_authz_svn: fix crash in COPY/MOVE authorization check (CVE-2016-2168)
+ * svnserve/sasl: fix authenticating users with wrong realm (CVE-2016-2167)
* improve documentation for AuthzSVNGroupsFile and groups-db (r1730856)
* fsfs: reduce peak memory usage when listing large directories (r1725180)
* fsfs: fix a rare source of incomplete dump files and reports (r1717876)
- Client-side and server-side bugfixes:
* update INSTALL documentation file (r1703470 et al)
* fix potential memory access bugs (r1722860 et al)
* fix potential out of bounds read in svn_repos_get_logs5() (r1738259)
- Bindings bugfixes:
* ignore absent nodes in javahl version of svn status -u (r1720643)
Developer-visible changes:
- General:
* fix ruby test suite to work with test-unit gem (r1714790)
* allow building against KDE4 without conflict with KDE5 (r1734926)
* fix update_tests.py#76 with SVNPathAuthz short_circuit (r1736432)
- * build system tweaks:
- * tweak how symbolic error names in maintainer mode (r1735179)
+ * tweak getting symbolic error names in maintainer mode (r1735179)
* fix inconsistent behavior of inherited property API (r1717874 et al)
- API changes:
* properly interpret parameters in svn_wc_get_diff_editor6() (r1728308)
Version 1.9.3
(15 Dec 2015, from /branches/1.9.x)
http://svn.apache.org/repos/asf/subversion/tags/1.9.3
User-visible changes:
- Client-side bugfixes:
* svn: fix possible crash in auth credentials cache (r1705328)
* cleanup: avoid unneeded memory growth during pristine cleanup (r1706241)
* diff: fix crash when repository is on server root (r1705060 et al)
* fix translations for commit notifications (r1709389, r1709562)
* ra_serf: fix crash in multistatus parser (r1706323, r1706324)
* svn: report lock/unlock errors as failures (r1701598 et al)
* svn: cleanup user deleted external registrations (r1705843, r1710558)
* svn: allow simple resolving of binary file text conflicts (r1703581)
* svnlook: properly remove tempfiles on diff errors (r1711346)
* ra_serf: report built- and run-time versions of libserf (r1704847)
* ra_serf: set Content-Type header in outgoing requests (r1715224 et al)
* svn: fix merging deletes of svn:eol-style CRLF/CR files (r1703689 et al)
* ra_local: disable zero-copy code path (r1718167)
- Server-side bugfixes:
* mod_dav_svn: fix heap overflow with skel-encoded requests (CVE-2015-5343)
* mod_authz_svn: fix authz with mod_auth_kerb/mod_auth_ntlm (issue #4602)
* mod_dav_svn: fix display of process ID in cache statistics (r1709553)
* mod_dav_svn: use LimitXMLRequestBody for skel-encoded requests (r1687812)
* svnadmin dump: preserve no-op changes (r1709388 et al, issue #4598)
* fsfs: avoid unneeded I/O when opening transactions (r1715793)
- Client-side and server-side bugfixes:
* fix heap overflow in svn:// protocol parser (CVE-2015-5259)
- Bindings bugfixes:
* javahl: fix ABI incompatibilty with 1.8 (r1710104)
* javahl: allow non-absolute paths in SVNClient.vacuum (r1710215, r1710290)
Developer-visible changes:
- General:
* fix patch filter invocation in svn_client_patch() (r1706783)
* add @since information to config defines (r1706983, r1706999)
* fix running the tests in compatibility mode (r1706375)
* clarify documentation of svn_fs_node_created_rev() (r1717154)
- API changes:
* fix overflow detection in svn_stringbuf_remove and _replace (r1714358)
* don't ignore some of the parameters to svn_ra_svn_create_conn3 (r1714314)
Version 1.9.2
(30 Sep 2015, from /branches/1.9.x)
http://svn.apache.org/repos/asf/subversion/tags/1.9.2
User-visible changes:
- Client-side bugfixes:
* svn: fix crash when saving credentials in kwallet (r1700740, r1700951)
* checkout/update: fix "access denied" error on Windows (r1701064 et al)
* update: fix crash when updating a conflicted tree (r1702198, r1702200)
* commit: fix possible crash (r1702231)
* ra_serf: do not crash on unexpected 'X-SVN-VR-Base' headers (r1702288)
* merge: fix crash when merging to a local add (r1702299 et al)
* svnmucc: fix error during propset+put for existing file (r1702467 et al)
* update: fix crash without .svn/tmp folder (r1701838, r1702203)
* checkout: remove unnecessary I/O operation (r1701638)
* merge: fix possible crash (r1701997)
* update: fix crash with some of the incoming deletes (r1702247)
* upgrade: fix crash for pre-1.3 wc with externals (r1702218 et al)
* revert: fix crash when reverting the root of a move (r1702237 et al)
* svn: do not crash upon specific database corruptions (r1702974, r1702991)
* svn: show utf8proc version in svn --version --verbose (r1702533, r1702891)
- Server-side bugfixes:
* fix reporting for empty representations in svnfsfs stats (r1698312 et al)
Developer-visible changes:
- General:
* fix svnfsfs_tests.py in fsfs-v4 and fsfs-v6 modes (r1700215 et al)
- API changes:
* disable unsupported operations for standard streams (r1701633 et al)
Version 1.9.1
(02 Sep 2015, from /branches/1.9.x)
http://svn.apache.org/repos/asf/subversion/tags/1.9.1
User-visible changes:
- Client-side bugfixes:
* Fix crash with GPG-agent with non-canonical $HOME (r1691928, issue #4584)
* Fix checkout errors with svn+ssh:// on Windows (r1696222, r1696225)
* svn: expose expat and zlib versions in svn --version --verbose (r1696387, r1697664)
* svn: improve help text for 'svn info --show-item' (r1698106)
- Server-side bugfixes:
* svnserve: fixed minor typo in help text (r1694023)
* Enable caching with memcached on Windows (1674626, r1674785)
* Fix an error leak in FSFS verification (r1693886)
* Fix incomplete membuffer cache initialization (r1695022)
* svnfsfs: fix some bugs and inconsistencies in load-index (r1697381 et al.)
- Client-side and server-side bugfixes:
* Fix alignment fault in ra_svn on 32 bit SPARC machines (r1697914)
- Bindings bugfixes:
* Fix memory corruption in copy source SWIG bindings (r1694929)
Developer-visible changes:
* Better configure-time detection of httpd version and authz fix (r1687304 et al.)
* Correct a parameter name in svn_repos_get_fs_build_parser5 (r1694194)
* Resolve circular library reference in libsvn_fs_x (r1696695)
* Fix Unix build on systems without GPG agent (r1694481, r1697824)
Version 1.9.0
(5 Aug 2015, from /branches/1.9.x)
http://svn.apache.org/repos/asf/subversion/tags/1.9.0
User-visible changes:
- General:
* make all commands provide brief description in help output (r1522518)
* flush stdout before exiting to avoid information being lost (r1543868)
- Major new features:
* fsfs: new format 7 with more efficient on-disk layout (r1547045 et al)
* blame: support showing prospective as well as previous changes
* info: support printing of individual values with --show-item (r1662620)
* svn auth: new subcommand to manage cached credentials and certs
* svnserve: cache config and authz to lower resource usage and be able to
serve large numbers of connections with a limited number of threads
* membuffer: quadruple the maximum cacheable directory size (r1545948 et al)
* new filesystem fsx (faster, smaller); experimental - see release notes
- Minor new features and improvements:
* new 'diff-ignore-content-type' runtime configuration option
* new option for 'svnadmin verify': --check-normalization
* new option for 'svnadmin verify': --keep-going
* svnadmin info: new subcommand to print info about a repository
* print summary of conflicts before/after interactive conflict resolution
* import: reduce number of connections to the server needed (r1482962)
* membuffer: rework cache eviction heuristics (r1476664 et at)
* membuffer: improved cache usage statistics (r1489883)
* mergeinfo: new '--log' option (r1492168)
* svnadmin upgrade: progress and cancellation support (r1495545, r1495566)
* cleanup: add '--remove-unversioned' and '--remove-ignored' (issue #3549)
* cleanup: add '--include-externals' option (issue #2325)
* cleanup: add '--quiet' option (r1498661)
* svnadmin load: speedup by setting revprops in one call (r1504079)
* svnadmin load: set svn:date revprop in the initial commit (r1504951)
* reimplement UTF-8 fuzzy conversion using utf8proc (r1511676)
* svnadmin verify: speed up for repos with large directories (r1520419)
* svn merge: interactive conflict resolver tries external tools (r1524145)
* minor speed up in string to time conversion (r1533387)
* windows: speed up console output (r1533994)
* update: optimize wc db usage when obtaining children (r1537065 et al)
* decreased overhead for case-sensitive configuration access (r1538068)
* avoid re-opening repo for in-repo authz if already open (r1538120)
* svnserve: output errors in a more standard way (r1544250)
* faster parsing of config file comments (r1544716)
* avoid trying to open the hooks-env file when it doesn't exist (r1544721)
* svnserve: provide the same logging detail in "run once" mode as provided
in the log file (r1544731)
* svnserve: reduce connection latency (r1544732)
* wc: reduce the number of locks and transactions required (r1545127 et al)
* cat: add '--ignore-keywords' option (r1547517)
* merge and mergeinfo: use fewer RA sessions (r1552265)
* fsfs: limit delta chains from crossing too many shards (r1554942)
* fsfs: option to configure compression level in deltas (r1559748)
* fsfs: enable dir and prop deltas by default for formats that support
it (r1555286)
* fsfs: avoid out of date errors from files in a directory changing when
you change a property on the directory (issue #2118)
* fsfs: temporary transaction properties are preserved when commit is
interrupted (r1549907 et al)
* fsfs: speed up transaction creation (r1544719)
* fsfs: avoid trying to open lock digest files that don't exist (r1544721)
* fsfs: reduce internal overhead by using sorted array instead of hash for
directory representation (r1554711)
* fsfs: skip decoding txdelta windows that are already cached (r1555284)
* fsfs: avoid constructing fulltext when delta we need is stored (r1555297)
* fsfs: improvements to format 6 reading/writing (r1517479)
* fsfs: reduce overhead of parsing noderev structures (r1544717)
* fsfs: speed up node relation comparison (r1554807)
* fsfs: speed up critical open_path() call (r1483301 et al)
* fsfs: speed up node verification (r1520421 et al)
* fsfs: speed up serialization into cache buffer format (r1505056)
* fsfs: avoid caching intermediate fulltexts (r1565100)
* fsfs: reduce lock contention on txn-list-lock (r1569549)
* svnadmin: don't display warnings as errors (r1556297)
* ra_serf: avoid caching properties in the update editor (r1557538)
* ra_serf: decrease latency of requests to get directory contents by
pipelining requests, speeds up 'svn ls --include externals' and
some cases of multi-url diff, including merge (r1557548)
* ra_serf: spool small update reports in memory to avoid making temp files
for small requests (r1557599)
* ra_serf: allow the reuse of serf connections after an error (r1553341)
* ra_serf: improve many error messages (r1551910 et al)
* ra_serf: pipeline lock/unlock requests (r1551918, r1551993, r1552008)
* ra_serf: pipeline requests for inherited properties against old servers
that don't support the faster REPORT (r1552455, r1552475)
* ra_serf: allow reuse of sessions after a canceled request (r1557686)
* ra_serf: reduce memory usage when retrieving revision props (r1557689)
* mod_dav_svn: make out of date error message consistent with generic repos
logic (r1558247)
* allow SQLite to optimize functions that are deterministic (r1559352)
* speed up delta calculations on non-deltifyable sections (r1559767)
* ra_serf: improve memory usage in commit processing (r1520028)
* report progress as cumulative across all sessions (issue #3260)
* ra_serf: don't send DAV headers with GET requests (r1517472)
* mod_dav_svn: SVNCacheTextDeltas defaults to on (r1517479)
* fs: improve scalability of fs_open and similar functions (r1523450 et al)
* svnserve: improve performance and scalability (r1523465 et al)
* svnadmin verify: output progress messages to stdout (r1471095)
* svnadmin crashtest: make output less misleading (r1486046)
* mod_dav_svn: discover copy to src earlier in some cases (r1537440)
* speed up mergeinfo parsing (r1483292, r1483309 et al)
* optimize hash lookups used in mergeinfo and caching (r1483434 et al)
* log: optimize string handling in repos layer (r1483570, r1483572)
* ask disk hardware to sync instead of only syncing to hardware buffers
when OS supports it (r1484439, r1484445)
* optimize diff code to avoid unneeded comparisons (r1485488)
* optimize check if relpaths are canonical (r1485496, r1489828)
* ra_svn: reduce protocol implementation overhead (r1485499, r1485504 et al)
* optimize file translation without keyword substitution (r1486058)
* optimize config file parsing by using unbuffered I/O (r1486897)
* patch: apply ignore settings when deciding to delete dirs (r1490378)
* use a cheaper RA operation for common client calculation (r1496468 et al)
* ra_svn: avoid unnecessary work when doing a blame (r1503046)
* optimize reading files into memory if size is known (r1505068)
* copy: do not error on properties when doing a foreign copy (r1563361)
* membuffer: reduce memory usage by using shorter lived pools (r1564217)
* svnadmin load: add '--ignore-dates' option (r1564789)
* update: reduce sessions used with '--parents' option (r1565920)
* diff: report properties on deleted nodes (r1569320, r1570055)
* diff: switch to diff processor APIs instead of old style callbacks, step
towards resolving long standing bugs and feature requests (r1569551 et al)
* diff: use the proper revision in headers for addition and deletion
of files (r1570053)
* svnadmin lslocks: add cancellation (r1571992)
* svn --version: list available authentication credential caches (r1572106)
* fs: improved detection of changes between two nodes, this should reduce
the number of out of date errors clients see (r1572336)
* allow the use of libmagic to be configured via subversion configuration
file or SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE env variable (r1572916)
* new '--pin-externals' option for svn copy (issue #1258)
* the '--strict' option was renamed '--no-newline' (r1662224)
* merge/update: switch to three-way text conflict markers
(r1591951, r1595522)
* patch: handle renames in git formatted patches (r1594636)
* svnfsfs: new expert tool (r1594860)
* mod_dav_svn: allow server admin to GET the FSFS global cache stats
(r1595160)
* diff: support git-like binary file diffs with '--git' (r1599552)
* diff: support arbitrary context size for internal diff tool with
'-U' option (r1603847, 1603871)
* commit: print progress notification between client finishing
transmitting text deltas and asking server to commit (r1604179)
* fsfs: optimize log commands for repos on Windows by not
using a locale specific function to parse ids (r1605123)
* fsfs: reduce memory usage of reading/writing changed paths caches
(r1605188 et al)
* mod_dav_svn: log post-commit errors to httpd error log as well
as returning them to client (r1606004)
* make server config groups work with svn:// URLs (issue #4512)
* svnadmin hotcopy: report progress when copying revisions and packed
shards for FSFS repositories (r1613339)
* info: show revisions for missing tree conflicts (r1617932)
* fsfs: avoid shared data clashes due to multiple distinct repositories
having identical UUIDs (r1618138 et al)
* status: ignore thumbs.db files by default (r1620955)
* fsfs: harden parsers against data corruption (r1622931, r1622937,
r1622942)
* diff: respect svn:keywords and svn:eol-style when doing arbitrary
diffs (r1623820)
* ra_serf: reduce size of XML generated for reports (r1627333)
* replace generic --trust-server-cert with more specific options to
override specific certificate failures (r1630117 et al)
* commit: improve speed of commits with many files (r1630312 et al)
* svnadmin setrevprop: add '--transaction' option (r1631435)
* svnadmin delrevprop: new subcommand (1592723)
* svnadmin verify: validate the index data against checksums (r1631598)
* svnadmin verify: new option '--metadata-only' (r1593753)
* cp: improve performance of local copies (r1632284, et al)
* fsfs: speed up operations that use revision properties (r1634875,
r1634879)
* checkout/update: use fewer RA sessions (r1635753 et al)
* log: do less work when '--with-no-revprops' is used (r1642231)
* patch: improve command to be more capable as compared to GNU patch
(issue #4533)
* limit server caches to avoid running out of memory if server admin
configured caches larger than supported by the platform (r1645572)
* mod_authz_svn: log implicit read access failures with INFO log level;
Explicit read access failures are still logged with ERROR log level
(r1653032)
* ra_serf: reduce memory usage by removing some extra intermediary state
(r1654681, r1654690)
* revert: improve performance on large working copies without changes
(r1657083)
* ra_svn: improve efficiency of editor processing (r1658194 et al)
* merge: provide different conflict reasons for local additions and
unversioned obstructions (r1659381)
* windows: improve checkout performance on windows by using sqlite truncate
journal mode rather than delete (r1659426)
* status: now accept '-r' argument (r1671164, 1672578, 1673228)
* ls: improve performance of '-v' on tag directories (r1673153)
* resolve: improve conflict prompts for binary files (r1667228 et al)
* fsfs: improve error messages for parsing errors (r1678147, r1678149)
* warn when the '--config-option' FILE:SECTION:OPTION combination may
be invalid. (r1674301 et al)
* ensure full key matching in membuffer cache (r1678950 et al)
* mod_dav_svn: expose cache statistics via HTTP (r1595160)
- Client-side bugfixes:
* export: fix problem exporting symlinks on windows (r1476093)
* fix non-ascii character handling of command line options (r1476461)
* log: strip EOL marker only after converting to UTF-8 (r1476608)
* ra_serf: avoid dropping errors when making a lock request (r1489526)
* ra_serf: fix an error leak in update logic (r1499686)
* windows: fix issues with wcs in symlinked folders (r1501251)
* fix regression that broke parallel nested checkouts (issue #4390)
* svnmucc: ignore leading r in revision number arguments to -r (r1502636)
* mkdir: use absolute paths to avoid Windows path length limits (r1516816)
* avoid encoding support code when C runtime doesn't support it (r1530582)
* ra_svn: add check against dirents with path separators (r1533812)
* properly delete temporary files when atomic write fails (r1537466)
* wc: fix corner cases in move-update tree conflicts (r1538639 et al)
* windows: fix crash report indentation for x64 reports (r1543589)
* mergeinfo: allow to work on a moved target (issue #4301)
* windows: avoid delay when no homedir is available (r1546814)
* status: report externals in a deterministic way (r1550200)
* copy: avoid an unneeded extra RA session for wc to repo case (r1551564)
* ra_serf: show pre-revprop-change failure on revprop delete (issue #3086)
* svnsync: avoid extra request at end of every revision sync (r1553370)
* ra_serf: fix replace + propset of locked file failures (issue #3674)
* ra_serf: prevent overwriting directory during copy (issue #3314)
* commit: limit number of temporary files open at same time (issue #4172)
* ra_serf: verify incoming integers are really integers (r1557709 et al)
* log: -g --xml doesn't differentiate between forward and reverse merges
(issue #4463)
* windows: improve update and checkout speed (issue #4450)
* log: reduce performance penalties of using -g (r1559912)
* blame: reduce performance penalties of using -g (r1560112)
* ra_local: set svn:txn-user-agent for consistency (r1498608)
* ra_svn: use the stream API properly for communications (r1562072)
* update: provide error when none of targets are wcs (r1565388)
* wc: reduce dependence on unspecified SQLite behavior (r1567080 et al)
* diff: fix diffing directory without permissions to read parent (r1569265,
r1569290)
* diff: improve resolving peg revisions (r1570205 et al)
* diff: fix bug in calculating header paths (r1570584)
* ra_serf: add SSL certificate issuers common name to output (r1573728)
* updates keywords in files not modified during 'svn switch' (issue #1975)
* svnmucc: Normalize line endings with '-F' and '-m' options
(r1592148, r1592150)
* fix problems with read-only authentication caches (issue #4504)
* commit: don't bump just locked files (r1603617)
* log: reduce memory with '-v' (r1604569 et al)
* diff: fix diffing locally deleted nodes under copied directories
(r1605832)
* diff: fix missing node error when diffing a replaced node (r1605866)
* propget: forbid using 'show-inherited-properties' with 'strict' (r1611698)
* windows: avoid delay when user profile isn't writable (r1617926)
* merge: display the correct node kinds for tree conflicts (r1618024,
r1619418, r1619717)
* diff: show the correct revisions in the header (r1619452)
* diff: fix missing header for files with only property changes (r1619476)
* update: raise a tree conflict rather than an obstruction when an
incoming server-excluded node conflicts with a locally added node
(r1619495)
* update: improve tree conflict reason and action descriptions (r1619777)
* ra_serf: fix stalls during checkout/update over http/https (r1621596)
* svnmucc: don't crash when '--version' is used with other arguments
(r1625496)
* checkout: report svn:externals failures via the exit code as other
commands already do (r1628398)
* svn & svnlook: use the right error code when fputs() fails (r1630369)
* export: reject peg specifiers on local destination path (r1635085)
* don't reject command-line arguments in the form of ".@abc", where
"abc" is a peg specifier that may be empty (r1635118)
* fix directory externals not following history (issue #4529)
* remove 'df' and 'm' options from the interactive conflict resolver for
binary files (r1645578)
* mergeinfo parsing: allow source path to be empty (issue #4537)
* mkdir: when using '--parents' don't add entire contents recursively if
target already exists (r1649951)
* resolve errors with move of a nested delete (r1651980, r1651997)
* update: prevent breaking a working copy when a directory is replaced
with an external to a foreign repository (issue #4550)
* update: prevent an invalid wc state when applying a move (r1652184 et al)
* resolve: fix a segfault when breaking a move inside a delete (issue #4491)
* ra_serf: don't handle a commit that didn't produce a new revision as
a successful commit (r1653532)
* export: fix the lack of notifications when starting to handle externals
(issue #4527)
* update: fix a case where we reported an error rather than a tree conflict
(r1655017)
* info: Use local platform style paths in all cases (r1659283)
* handle lack of a configuration file properly (r1660369)
* update: resolve issues with tree conflicts caused by an incoming
delete removing a mixed revision tree (r1660742)
* don't hold onto locks of deleted paths in the client on commit (r1661363)
* info: fix url calculation for a few statuses (r1661476)
* update: when using '--set-depth' avoid removing local changes (r1661585)
* update: fix tree conflict detection on unversioned nodes that exist where
there used to be a deleted node (r1661664)
* status: display tree conflicts even if the node with the tree conflict is
shadowed by a file (r1662331)
* pre-1.6 wc compatibility: fix with obstructed working copies (r1662412)
* resolve: allow directly resolving tree conflicts (r1658435)
* copy: when copying from a wc to a url show all the changes (r1655729)
* info: provide results in a stable order (r1662030)
* revert: allow depth limited reverts of nodes that only have not-present
and/or excluded child nodes (r1662091)
* wc: fix calculating repo path after commits of nodes that shadow a
switched (not-present) node (r1663991, r1666258, r1674032)
* update: resolve assertion on bad update report involving incomplete
status (r1663671, r1666832)
* update: allow a real file to replace a file external (r1664035)
* merge: raise a tree conflict on root of obstructing dir (r1666690)
* cp: fix 'svn cp ^/A/D/H@1 ^/A' to properly create A (r1674455, r1674456)
* status: fix incorrect output with file externals (issue #4580)
* merge: fix part of issue #4582 (r1686175, r1687029, r1688258)
- Server-side bugfixes:
* svnserve: don't ignore socket initialization errors (r1544253)
* svnserve: don't hide fatal errors in inetd and tunnel modes (r1544256)
* fsfs: log repo path in local style for cache init failure (r1494314)
* fsfs: fix potential transaction corruption (r1519624)
* svnserve: fix logging in multi-threaded servers (r1523502)
* fsfs: don't report out of date errors due to FS corruption (r1527084)
* svnadmin verify: detect inconsistencies that prevent loading (r1536854)
* mod_dav_svn: use 404 status for errors caused by invalid URIs (r1542063)
* mod_dav_svn: use 404 when the repository doesn't exist (r1544259)
* mod_dav_svn: use 'dav_svn:' prefix for filename instead of 'svn:'
(r1544711)
* mod_dav_svn: XML escape lock tokens (r1547427)
* hotcopy: don't create config files when copying pre-1.5 repos (r1547454)
* hotcopy: preserve the rep-cache.db permissions when hotcopying (r1547877)
* mod_dav_svn: fix SVNCacheTextDeltas and SVNAdvertisV2Protocol directive
merging (r1548124)
* mod_dav_svn: always produce an error text even when text specifies
the default message to make diagnosing issues easier (r1553441)
* mod_dav_svn: fix some pool lifetime issues with error messages (r1553868)
* mod_dav_svn: avoid setting option headers multiple times (r1557103)
* fsfs: prevent some commits that could cause future corruption (r1560673)
* cache: fix premature eviction due to 64-bit underflows (r1567996 et al)
* svnserve: fix potential integer overflow in Cyrus SASL support (r1570434)
* bdb: fix potential integer overflow and underflow (r1570701)
* bdb: prevent silent propogation of some corruption (r1570778)
* svnadmin hotcopy: do not corrupt db/current contents when copying old
FSFS repos (r1603485)
* svnadmin hotcopy: don't produce broken copies when a concurrent pack
happens (r1605633)
* log: reduce memory consumption of '-v' (r1605195)
* mod_dav_svn: fix performance issue on Windows with named atomics
(r1611379)
* log: fix a segfault in handling changed paths (r1615364)
* mod_dav_svn: properly forward post-lock/post-unlock failures (r1622235)
* diff: fix handling of depth empty in added directories (r1622024)
* fix a segfault with corrupted changed path lists that try to add root
nodes (r1622944)
* svnadmin verify: report errors nicely rather than possibly aborting
(r1622955)
* svnlook propget: report transaction name rather than revision number in
errors if run with '-t' option (r1623317)
* svnadmin verify: prevent stack overflow conditions in corrupted
repositories (r1623398)
* fsfs upgrade: fix an issue that could block an upgraded format 1 or 2
repository from being committed to (r1624011)
* fs backends: fix memory lifetime issue (r1632646)
* bdb: output correct checksum in error message about corruption (r1640707)
* fsfs: fix a pool lifetime error related to transaction local caches
(r1643139, 1643233)
* fsfs: avoid "random DAG walks" during checkout over ra_serf (r1645567)
* fsfs/bdb: reduce memory use during tree deletions (r1647820, r1655022)
* mod_authz_svn: fix unbounded memory use when SVNPathAuthz short_circuit
is used (r1647887)
* fsfs: reduce memory use when walking back in history (r1648230)
* dump: remove incorrect kind header on replaced nodes (issue #4553)
* dump: remove duplicate headers for replace-with-copy (issue #4552)
* mod_dav_svn: don't send XML-unsafe characters in svn:author
(issue #4415)
* dump: don't write broken dump files in some ambiguously encoded fsfs
repositories (issue #4554)
* mod_dav_svn: provide a more intuitive error message to the client when
trying to create a directory that already exists (issue #2295)
* fsfs: fix uninitialized memory use in lock/unlock code (r1657525)
* fix a segfault executing a pre-commit hook with legacy locks (r1657893)
* mod_dav_svn: do not ignore skel parsing errors (r1658168)
* fsfs: fix multiple reporting of the same lock (r1658482)
* fsfs: fix pool lifetime issue in lock handling (r1659314)
* mod_dav_svn: properly log assertions and malfuctions (r1660480)
* svnadmin load/dump: preserve deletion of svn:date from r0 (issue #4563)
* svnrdump: don't provide HEAD+1 as base revision when loading deletes
(r1664684)
* mod_dav_svn: improve error message sent with a 405 status code
(r1665195, r1666096, r1666379)
* make detection of invalid base revision on commit behave the same on
all RA layers (r1664664, r1664672, r1664674)
* mod_dav_svn: emit the first few log items as soon as they are available
(r1666965, r1667120)
* mod_dav_svn: prevent a tree walk on copy sources (issue #4351)
* fsfs: fix 'EOF found' error when reading repo (issue #4577)
* svnadmin freeze: unlock rep-cache.db as part of unfreezing
(r1679169, r1679287)
* fsfs: improve stability in the presence of power or network
disk failures during 'svnadmin pack' (r1683378)
* detect invalid svndiff data earlier (r1684077)
- Client-side and server-side bugfixes:
* use less memory when retrieving extension from filename (r1548480)
* use more optimal code path with old txdelta v1 data (r1485480)
* windows: allow opening SQLite databases on long paths (r1564338)
* fix an out-of-bounds read in the delta combiner (r1569415)
* fix a number of cases of undefined behavior when passing invalid
arguments to memcpy() (r1632530, et al)
* windows: avoid a 12 second delay due to a retry loop in some error
conditions when opening a file (r1657583)
- Other tool improvements and bugfixes:
* windows: add build-svn-deps-win.pl tool to build dependencies (r1467715)
* svnpubsub: add support for revprop changes (r1486463)
* svnpubsub: do not pass svn commands through shell (r148466, r1486467)
* svnpubsub: hooks exit with an error if they fail (r1486500, r1486597)
* svnpubsub: hooks use "--" to signal end of arguments (r1486513)
* mailer: properly encode mail headers per RFC2047 (r1487532)
* svnwcsub: add a pre-update hook, which can deny update (r1494542 et al)
* fsfs-stats: count file nodes that are added without history (r1519283)
* fsfs-stats: replaced by 'svnfsfs stats' (r1594860)
* fsfs-access-map: count empty reads and unnecessary seeks (r1523441)
* fsfs-access-map: generate scaled/rectangular heatmaps (r1505065)
* fsfs-access-map: deal with strace format issues (r1505065)
* fsfs-access-map: update to know about index files (r1505065)
* svnbench: renamed from svn-bench (r1659226)
* svnbench: add null-info command (r1532196)
* svnlook.py: made usable as a library by adding getter methods (r1541558)
* svnbench, svnraisetreeconflict, svnauthz, svn-rep-sharing-stats: More
consistent error reporting, following pattern of core command-line
programs (r1544194)
* which-error.py: allow which-error.py to be run from symlink (r1547977)
* bash_completion: add svnlook filesize command and options to svn cat,
info, and mergeinfo commands (r1569021)
* new '--conflict-style' option to standalone diff3 tool (r1591750)
* update standalone diff3 tool so it can be used with --diff-cmd
directly (r1591871, r1591876)
* bash_completion: support for auth command (r1596841)
* diff: support '-U' option (r1618618)
* svn-rep-sharing-stats: replaced by 'svnfsfs stats' (r1618861)
* add svn-vendor.py as an alternative to svn_load_dirs.pl that can
auto-detect renames and copies (r1623660)
* svnpredumpfilter.py: fix a scalability problem that made run time
increase greatly on large repositories (r1625674 et al)
* svnpredumpfilter.py: detect copies of copies and handle properly
(r1626182)
* bash_completion: add svnadmin delrevprop (r1631473)
* showchange.pl: removed, obsoleted by 'svn log --diff' (r1631686)
* bash_completion: add new trust options (r1660373)
* bash_completion: add '--pin-externals' (r1662250)
* bash_completion: stop offering deprecated options (r1662291)
* bash_completion: add '--show-item' and '--no-newline' (r1662622)
* svnbench: add null-blame command (r1673785, r1673803, r1674015)
* svnbench: install with default 'make install' (r1685085)
Developer-visible changes:
- General:
* require Python 2.7+ for development and testing (r1691712, r1691713, r1692448)
* include symbolic names for error codes in maintainer mode (r1467643)
* include symbolic names for warning codes in maintainer mode (r1469855)
* support YouCompleteMe vim plugin (r1476374 et al)
* cache: add pretend_empty mode for maintainers (r1461689, et al)
* allow tests to be run with exclusive wc locks (r1496475)
* fix check for Microsoft C/C++ compiler (r1503148)
* improve windows build to use pre-built dependencies
* optimize ramdrive usage in the windows test runner (r1504511)
* SVN_CMDLINE_DISABLE_CRASH_HANDLER env var added for Windows (r1506507)
* gen-make.py: support Visual Studio 2013 by --vsnet-version=2013 (r1533907)
* windows: don't require APR source when building (r1534037, et al)
* don't compile SQLite amalgamation twice (r1536364)
* make C tests use same temp path as Python tests (r1536700)
* davautocheck: access log logs the r->filename now (r1538048)
* added test to detect duplicate SQL queries (r1538962)
* windows test runner: copy additional apr dlls (r1539300)
* support for debug logging that should be available in serf 1.4.0 (r1541561)
* OS X: fix build when Gnome is installed (r1541698)
* properly detect if expat is libexpat.lib or xml.lib on windows (r1541981)
* doc-clean target works properly with separate build dir (r1542303)
* don't break entire test run if cleaning temp directory failed but return
an error anyway (r1542817)
* windows tests: find java.exe via the sdk if not found via PATH (r1543876)
* fix davautocheck with httpd 2.3.x+ and worker/prefork MPMs (r1544302-3)
* add parallel mode for C tests (r1545334 et al)
* use --bin path for svnrdump when running Python tests (r1548706)
* remove unused --with-openssl option from configure (r1548714)
* tests: stop rewriting shared authz file for every sandbox (r1552064 et al)
* fix unnecessary aborts in maintainer mode on sqlite errors (r1536325)
* new --sqlite-logging option for C tests (r1560409)
* allow building with APR-2 (r1560586)
* remove support for ASM Zlib from Windows build system (r1560864)
* gen-make.py: new -D option (r1567046)
* improve how we fetch the version of Windows (r1568798, 1568806)
* move common code in python tests to library files to avoid side effects of
having tests depending on each other (r1570654)
* disable compiling on platforms where int is shorter than 32-bits and add
the SVN_ALLOW_SHORT_INTS compile definition to override (r1570882)
* disable building *.sbr files with Visual C++ 2010 or later (r1571020)
* require serf 1.3.4 (r1572261)
* require APR and APR-Util 1.3.x (r1572261)
* add mod_dontdothat to davautocheck.sh (r1572312)
* require Apache httpd 2.2.x (r1572339)
* support pkg-config for serf when using a prefix (r1572762)
* don't depend on stdbool.h and inttypes.h for utf8proc (r1573069 et al)
* avoid non-portable find extensions so the build works on Solaris (r1573780)
* Allow PARALLEL value to specify the number of threads to run tests with,
PARALLEL=1 means to use the default (r1573320)
* pkg-config support for libsvn_* libraries (issue #4435)
* binaries built on Mac OS X 10.6+ will not run on older versions (r1651549)
* fix random failure of Makefile-based parallel builds on Unix
when the amalgamated SQLite is being used (r1658357)
* C tests only run with ra_local to avoid duplicate testing (r1609477)
* allow skipping the C tests for any RA method (r1609489)
* new tools for benchmarking on Windows (r1610264)
* svnbench: no longer part of tools but main subversion (r1618860)
* improve detection for libtool (r1627276)
* check the runtime version of the fs_util library in the fs backends
(r1651567)
* properly initialize the src_kind value to avoid problems for other API
users during a copy (r1655723)
* try to improve reliability of applications that do not call
svn_dso_initialize2() right after apr_initialize() (r1659604)
* add svn-wc-db-tester tool for testing working copies (r1660874)
* fix bugs and performance issues using svn_wc_walk_entries3() (r1661110)
* support using Python 3 for building (r1661247)
* don't add -lstdc++ on FreeBSD 10 (r1662329)
* add build support for Visual Studio 2015 (r1663183, r1663184, r1689721 et al.)
* fix test failures when running from a directory whose name contains
characters that must be escaped when used in a URL. (r1664997)
* fix breakage of the serf ra session with svn_ra_get_dir2() and
svn_ra_get_log2(). (r1665213, r1665259, r1665609)
* resolve a race condition in some test suite cleanup code (r1683303)
* fix some tests on non-US default locale on Windows (r1684034)
* document the meaning of "XFAIL" for users building from source (r1683071)
- API changes:
* new RA callbacks for managing ra_svn tunnels:
svn_ra_callbacks2_t::check_tunnel_func,
svn_ra_callbacks2_t::open_tunnel_func and
svn_ra_callbacks2_t::close_tunnel_func
* new API for retrieving info about a file system: svn_fs_info()
* new API svn_io_file_flush() that wraps apr_file_flush()
* new API svn_io_write_atomic(), that writes, sync and renames a file
* new API svn_compat_log_revprops_out_string()
* deprecate unused datatype svn_ra_get_latest_revnum_func_t
* new API svn_client_cleanup2() (r1496954 et al)
* new API svn_stringbuf_create_wrap() (r1502248)
* new API svn_io_file_aligned_seek() (r1502539)
* ra_svn: fix svn_ra_get_log*() to apply limit when server can't (r1503043)
* svn_client_commit6: notify which path prevents a mv commit (r1503662)
* new APIs svn_io_file_create_empty() and svn_io_file_create_bytes()
(r1505006)
* new API svn_ver_check_list2() (r1502267)
* new API svn_stringbuf_from_stream() (r1532193)
* svn_auth_get_platform_specific_client_providers() now includes ssl
providers (r1534153)
* change dav_svn_split_uri() repos_path argument (r1537812)
* new API svn_repos_fs_type() returns filesystem type (r1538585)
* svn_client__get_inheritable_props() clears wcroot_iprops when revision is
not valid (r1538602)
* SVN_VA_NULL: New macro which is null-pointer constant (r1536307)
* SVN_NEEDS_SENTINEL_NULL: New macro to mark functions that require final
NULL sentinel value, so compilers can warn when missing (r1543394)
* platform specific svn_auth_get_* functions are deprecated, use the
svn_auth_get_platform_specific_provider() function instead (r1543992)
* SVN_INT_ERR macro is deprecated; use svn_handle_error2() or
svn_cmdline_handle_exit_error() instead (r1544142)
* new API svn_client_cat3() allow disabling keyword expansion and retrieving
props (r1544182)
* svn_auth_first_credentials(): provides an error rather than crashing if
auth_baton is NULL (r1544320)
* svn_auth_set_parameter(): Do nothing if auth_baton is NULL (r1544320)
* new API svn_relpath_prefix which returns a relpath with a maximum number
of path components (r1545123, r1673282)
* svn_fs_initialize() is now threadsafe (r1546409)
* svn_checksum_kind_t has two new FNV-1a checksums (r1546699)
* svn_fs_lock: control characters are not allowed in lock tokens (r1547445)
* new API svn_wc_cleanup4() makes some functionality optional and adds
notifications (r1548075 et al)
* new API svn_client_info4() supports walking externals (r1550206 et al)
* new flag for svn_fs_begin_txn2() SVN_FS_TXN_CLIENT_DATE to allow client
to set the final svn:date (r1550228)
* new APIs for easier RA commits svn_client_mtcc_* (r1550758 et al)
* new API svn_ra_session_dup() (r1552324 et al)
* svn_ra_stat() now handles compatibility with 1.0-1.1 svnserve (r1552441)
* new error code SVN_ERR_COMPOSED_ERROR added to allow detection of
composed errors by API consumers (r1553266)
* new error code SVN_ERR_RA_DAV_PRECONDITION_FAILED (r1553668)
* new error code SVN_ERR_RA_CANNOT_CREATE_SESSION (r1554027)
* new API svn_fs_node_relation() (r1554800)
* SVN_EXPERIMENTAL to mark functions that might change in future (r1526012)
* fix bug in svn_client_get_merging_summary() with some params (r1532396)
* new error code SVN_ERR_XML_UNEXPECTED_ELEMENT (r1498938)
* extend stream API to also support incomplete reads (r1561688 et al)
* new API svn_wc_add_from_disk3() (r1563361)
* new API svn_client_revert3() to allow clearing changelists and to have
a metadata_only flag (r1568635, r1657026)
* svn_rangelist_inheritable2(): don't change inheritabilty of remaining
ranges (r1569731)
* svn_rangelist_inheritable2() and svn_mergeinfo_inheritable2(): fix a
pool lifetime issue (r1569764)
* new APIs to support cancelation during unified diff output and
allow the context size to be specified (r1570149 et al)
* APIs related to retrieving logs are now documented to be unlimited when
a negative value is passed for the limit (r1570330, 1570335)
* new APIs: svn_fs_props_different() and svn_fs_contents_different()
(r1572363, r1573111)
* expose SVN_CONFIG_AUTHN_* macros in public API (r1572640)
* add SVN_CONFIG_OPTION_SQLITE_TIMEOUT to allow SQLite busy timeout
to be configured by clients (r1592093)
* add new notification between transmitting deltas and finalizing
commit as svn_wc_notify_commit_finalizing (r1603388)
* svn_client_cat3() API no longer returns entry or WC props (r1603501)
* properly handle canonical paths in svn_io_start_cmd3() (r1604761)
* add SVN_FS_CONFIG_FSFS_BLOCK_READ to control FSFS format 7 block
read feature (r1604933)
* new API svn_cstring_skip_prefix() (r1612823)
* new API svn_diff_mem_string_output_merge3() (r1618599)
* extend svn_wc_info_t with conflicts2 (r1618643)
* new API svn_diff_mem_string_output_unified3() (r1618839)
* new API svn_diff_file_output_merge3() (r1618857)
* svn_fs_props_changed() and svn_fs_contents_changed() no longer return
false positives (r1618880)
* new API svn_wc_conflict_description2_dup() (r1618883)
* extend svn_wc_conflict_description2_t with prop_reject_abspath field
(r1619096)
* extend svn_wc_conflict_description2_t with property values as
svn_string_t's (r1619122)
* fix svn_client_import5() to use absolute paths (r1623974)
* fix a few cases of invalid filling of svn_client_commit_item3_t (r1623981)
* add SVN_FS_CONFIG_FSFS_SHARD_SIZE to allow creation of repositories with
a custom shard size (r1624512)
* new API svn_cmdline_create_auth_baton2 (r1630117)
* make svn_string_*() and svn_stringbuf_*() functions handle C strings
of NULL with 0 length (r1632530, et al)
* fix svn_stream_compressed() for streams without partial read support
(r1639626)
* do not segfault on svn_stream_read_full() or svn_stream_skip() are called
for a no-op stream created via svn_stream_create() (r1639637)
* add SVN_FS_CONFIG_FSFS_LOG_ADDRESSING to control logical addressing
feature of fsfs format 7 (r1640915)
* rename the 'parent_directory' parameter of
svn_wc_parse_externals_description3() to 'defining_directory' and improve
the documentation (r1642690)
* new API svn_repos_get_fs_build_parser5() (r1647563)
* SVN_VERSION_BODY changed so that it is embedded into libraries, ultimately
allowing SVN_VER_TAG constant to be modified by patches (r1651565)
* rename repos_url to repos_url_deocded argument to
svn_repos_get_commit_editor5() to clairfy usage (r1653609)
* make svn_io_set_file_read_only() and svn_io_remove_dir2() ignore
ENOTDIR when ignore_enoent argument is set so the behavior is consistent
across platforms (r1653680)
* make svn_ra_open4() return the documented error when a repository
should be opened in a different location (r1655648)
* no longer return an error when using svn_ra_get_lock() and the path does
not exist (r1656875)
* svn_string_dup() will accept a NULL pointer and return a NULL (r1657254)
* svn_ra_get_file_revs2() now handles SVN_INVALID_REVNUM as HEAD (r1660463)
* new API svn_error_quick_wrapf() (r1662668)
* new API svn_fs_node_has_props() (r1673170, r1673172, r1673692, r1673746)
* new API svn_repos_verify_fs3() (r1492651 ... r1687769)
- Bindings:
* javahl: add support for the RA layer (r1494650 et al)
* javahl: add ignore-keywords knob to ISVNCLient.doExport (r1494936)
* javahl: improve performance of rev_range_vector_to_apr_array (r1496243)
* javahl: provide whole stack of errors from native exceptions (r1496353)
* javahl: new framework for manipulating in-memory config data (r1497746)
* javahl: add methods to set config change handler callback (r1497753)
* javahl: add inheritance info to JavaHL's RevisionRange type (r1499308)
* swig-rb: fixes to building on Windows (1505406 et al)
* libsvn_swig_*libraries now work as proper shared librares (r1506520 et al)
* swig-py: 'import svn.core.*' imports libsvn_subr public symbols (r1507860)
* javahl: expose the svn_rangelist operations (r1509025)
* javahl: new utility class SVNUtil (r1512354)
* javahl: serialize init of native library (r1519803)
* javahl: fix value truncation checks (r1519913)
* javahl: add ISVNClient.info which exposes svn_client_info4 (r1603481)
* javahl: include name of exception class in error messages (r1532117)
* javahl: simplify JNI environment handling (r1533804)
* javahl: Revsion.UNSPECIFIED added as alias to Revision.START (r1533928)
* javahl: do not require JUnit to build javahl; only to test (r1535603)
* javahl: update Action enum with new entries added in 1.9 (r1536319)
* javahl: expose node property validation utility (r1538133)
* javahl: new style JNI wrapper (r1539114 et al)
* javahl: new utility API to parse/unparse svn:externals (r1539130 et al)
* javahl: allow tests to be run from a RAM disk (r1539215 et al)
* javahl: expose and use the url member of svn_wc_notify_t (r1539601)
* javahl: expose a utility API to resolve relative externals (r1540921)
* javahl: new utility API for file content translation (r1542401)
* javahl: throw NullPointerException when sources is empty (r1543328)
* swig-pl: fix compilation against perl 5.18 on Windows (r1543980)
* javahl: implement streamed file contents translation (r1543985)
* javahl: enable warnings with javac (r1544163, r1544169)
* javahl: cleanup warnings (r1544578 et al)
* javahl: add common utilities for new-style map iterations (r1545925)
* javahl: add an API to get runtime version of native libs (r1545945)
* javahl: use default cache size instead of no cache (r1547248)
* swig-py: add typemap for hunks field of svn_patch_t (r1548379)
* javahl: don't ignore difference between NULL and empty changelist in
ISVNClient.getChangelists (r1553254)
* swig-pl: fix pool issues with setting dates as revisions (r1553822)
* swig-pl: make svn_auth_set_parameter() usable (r1553823)
* javahl: expose inheritiable property names (r1560338)
* javahl: fix bug in parsing single revision merginfo data (r1563140)
* javahl: create JVM crashlogs from svn malfunctions (r1563927, r1564252)
* javahl: avoid problems when building without NLS support (r1566578 et al)
* javahl: expose --alow-mixed-revisions merge option (r1567602)
* javahl: support incomplete reads from streams (r1569631)
* javahl: allow revert API to take a set of paths (r1571461)
* javahl: improve authentication callback (r1597758 et al)
* javahl: load (most) classes on demand (r1602822)
* javahl: expose confg file keys in JavaHL (r1604448)
* javahl: update ISVNClient.info, ISVnClient.cleanup and add
ISvnClient.vacuum (r1604449)
* javahl: update ISVNRepos.hotcopy (r1618894)
* swig-py: Add close to the core.Stream class (r1619077)
* javahl: add example clients that use the authn API (r1640533)
* swig-py: implement dump stream parser (r1642813)
* swig-pl: remove some unneded cleanup code that triggered a cleanup
failure on windows (r1643072)
* swig-pl: make cancel_func, cancel_baton parameter pairs work (r1648852)
* javahl: expose whitespace diff parameters to blame method (issue #4475)
* javahl: update ConflictDescriptor (r1655842)
* javahl: update FileRevision to provide textDelta (r1656911)
* swig-pl: install into prefix (r1658459)
* javahl: expose the metadataOnly option to copy support (r1661451)
* swig-py: add support for svn_fs_lock_many(), svn_fs_unlock_many(),
svn_repos_fs_lock_many() and svn_repos_fs_unlock_many() (r1662867)
* swig-py: fix support for svn_ra_lock() and svn_ra_unlock() (r1662891)
* javahl: allow java callbacks to throw errors back to the svn code
(r1664938, r1664939, r1664940, r1664978, r1664984)
* swig-pl: fix some stack memory problems (r1668618, 1671388)
* swig: warn on using SWIG 3.x as we have compatibility problems
with newer versions of SWIG (1675149)
* javahl: requires Java 1.6 (r1677003)
* javahl: on OS X use /usr/libexec/java_home to find the JDK (r1675774)
* javahl: allow compiling with a C++11 compiler (r1684412)
+Version 1.8.17
+(29 Nov 2016, from /branches/1.8.x)
+http://svn.apache.org/repos/asf/subversion/tags/1.8.17
+
+ User-visible changes:
+ - Client-side bugfixes:
+ * fix handling of newly secured subdirectories in working copy (r1724448)
+ * ra_serf: fix deleting directories with many files (issue #4557)
+ * svnlook: properly remove tempfiles on diff errors (r1711346)
+ * gpg-agent: properly handle passwords with percent characters (issue #4611)
+ * merge: fix crash when merging to a local add (r1702299 et al)
+
+ - Server-side bugfixes:
+ * fsfs: fix possible data reconstruction error (issue #4658)
+
+ - Client-side and server-side bugfixes:
+ * fix potential memory access bugs (r1722860 et al)
+
+ - Bindings bugfixes:
+ * javahl: fix temporary accepting SSL server certificates (r1764851)
+ * swig-pl: do not corrupt "{DATE}" revision variable (r1767768)
+ * swig-pl: fix possible stack corruption (r1683266)
+
+ Developer-visible changes:
+ - General:
+ * fix inconsistent behavior of inherited property API (r1717875, r1717878)
+ * fix patch filter invocation in svn_client_patch() (r1706783)
+ * fix potential build issue with invalid SVN_LOCALE_DIR (issue #4653)
+
+
Version 1.8.16
(28 Apr 2016, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.16
User-visible changes:
- Server-side bugfixes:
+ * mod_authz_svn: fix crash in COPY/MOVE authorization check (CVE-2016-2168)
+ * svnserve/sasl: fix authenticating users with wrong realm (CVE-2016-2167)
* mod_authz_svn: fix authz with mod_auth_kerb/mod_auth_ntlm (issue #4602)
* dump: don't write broken dump files in some ambiguously encoded fsfs
repositories (issue #4554)
- Client-side and server-side bugfixes:
* update INSTALL documentation file (r1703470, r1703475)
Developer-visible changes:
- General:
* fix javahl test suite to work on a symlinked RAM disk (r1539230)
* fix ruby test suite to work with test-unit gem (r1714790)
Version 1.8.15
(15 Dec 2015, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.15
User-visible changes:
- Client-side bugfixes:
* gpg-agent: fix crash with non-canonical $HOME (r1691928, issue #4584)
- Client-side and server-side bugfixes:
* fix a segfault with old style text delta (r1618472 et al)
- Server-side bugfixes:
* mod_dav_svn: fix heap overflow with skel-encoded requests (CVE-2015-5343)
* fsfs: reduce memory allocation with Apache (r1591005 et al)
* mod_dav_svn: emit first log items as soon as possible (r1666965 et al)
* mod_dav_svn: use LimitXMLRequestBody for skel-encoded requests (r1687812)
- Bindings bugfixes:
* swig: fix memory corruption in svn_client_copy_source_t (r1694929)
Developer-visible changes:
- General:
* better configure-time detection of httpd authz fix (r1687304 et al)
* fix compilation with apr 1.2.x (r1701237)
Version 1.8.14
(5 Aug 2015, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.14
User-visible changes:
- Client-side bugfixes:
* document svn:autoprops (r1678494 et al.)
* cp: fix 'svn cp ^/A/D/H@1 ^/A' to properly create A (r1674455, r1674456)
* resolve: improve conflict prompts for binary files (r1667228 et al.)
* ls: improve performance of '-v' on tag directories (r1673153)
* improved Sqlite 3.8.9 query performance regression on externals (r1672295 et al.)
* fixed issue #4580: 'svn -v st' on file externals reports "?" instead
of user and revision after 'svn up' (r1680242)
- Server-side bugfixes:
* mod_authz_svn: do not leak information in mixed anonymous/authenticated
httpd (dav) configurations (CVE-2015-3184)
* do not leak paths that were hidden by path-based authz (CVE-2015-3187)
* mod_dav_svn: do not ignore skel parsing errors (r1658168)
* detect invalid svndiff data earlier (r1684077)
* prevent possible repository corruption on power/disk failures (r1680819)
* fixed issue #4577: Read error with nodes whose DELTA chain starts with
a PLAIN rep (r1676667, r1677267)
* fixed issue #4531: server-side copy (over dav) is slow and uses
too much memory (r1674627)
Developer-visible changes:
- General:
* support building on Windows with Visual Studio 2015 (r1692785)
* avoid failing some tests on versions of Python with a very old sqlite (r1674522)
* fix Ruby tests so they don't use the users real configuration (r1597884)
- Bindings:
* swig-pl: fix some stack memory problems (r1668618, 1671388)
Version 1.8.13
(31 Mar 2015, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.13
User-visible changes:
- Client-side bugfixes:
* ra_serf: prevent abort of commits that have already succeeded (r1659867)
* ra_serf: support case-insensitivity in HTTP headers (r1650481, r1650489)
* better error message if an external is shadowed (r1655712, r1655738)
* ra_svn: fix reporting of directory read errors (r1656713)
* fix a redirect handling bug in 'svn log' over HTTP (r1650531)
* properly copy tree conflict information (r1658115, r1659553, r1659554)
* fix 'svn patch' output for reordered hunks (issue #4533)
* svnrdump load: don't load wrong props with no-deltas dump (issue #4551)
* fix working copy corruption with relative file external (issue #4411)
* don't crash if config file is unreadable (r1590751, r1660350)
* svn resolve: don't ask a question with only one answer (r1658417)
* fix assertion failure in svn move (r1651963 et al)
* working copy performance improvements (r1664531, r1664476, et al)
* handle existing working copies which become externals (r1660071)
* fix recording of WC meta-data for foreign repos copies (r1660593)
* fix calculating repository path of replaced directories (r1660646)
* fix calculating repository path after commit of switched nodes (r1663991)
* svnrdump: don't provide HEAD+1 as base revision for deletes (r1664684)
* don't leave conflict markers on files that are moved (r1660220, r1665874)
* avoid unnecessary subtree mergeinfo recording (r1666690)
* fix diff of a locally copied directory with props (r1619380 et al)
- Server-side bugfixes:
* fsfs: fix a problem verifying pre-1.4 repos used with 1.8 (r1561419)
* svnadmin freeze: fix memory allocation error (r1653039)
* svnadmin load: tolerate invalid mergeinfo at r0 (r1643074, issue #4476)
* svnadmin load: strip references to r1 from mergeinfo (issue #4538)
* svnsync: strip any r0 references from mergeinfo (issue #4476)
* fsfs: reduce memory consumption when operating on dag nodes (r1655651)
* reject invalid get-location-segments requests in mod_dav_svn and
svnserve (r1667233)
* mod_dav_svn: reject invalid txnprop change requests (r1667235)
- Client-side and server-side bugfixes:
* fix undefined behaviour in string buffer routines (r1650834)
* fix consistency issues with APR r/w locks on Windows (r1611380 et al)
* fix occasional SEGV if threads load DSOs in parallel (r1659013, r1659315)
* properly duplicate svn error objects (r1651759)
* fix use-after-free in config parser (1646785, r1646786, r1646797)
Developer-visible changes:
* add lock file config for testing against HTTPD 2.4+ (r1544302, r1544303)
* make sqlite amalgamated build work with sqlite 3.8.x+ (r1659399)
* fix build with Ruby 2 (r1596882)
* process 'svnadmin dump' output as binary in the test suite (r1592987)
* simplify Windows resource compilation to avoid warnings (r1532287)
Version 1.8.12
(Not released, see changes for 1.8.13.)
Version 1.8.11
(15 Dec 2014, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.11
User-visible changes:
- Client-side bugfixes:
* checkout/update: fix file externals failing to follow history and
subsequently silently failing (issue #4185)
* patch: don't skip targets in valid --git difs (r1592014, r1592034)
* diff: make property output in diffs stable (r1589360)
* diff: fix diff of local copied directory with props (r1619380, r1619393)
* diff: fix changelist filter for repos-WC and WC-WC (r1621978, r1621981)
* remove broken conflict resolver menu options that always error out
(r1620332)
* improve gpg-agent support (r1600331, r1600348, 1600368, r1600563,
r1600781)
* fix crash in eclipse IDE with GNOME Keyring (issue #3498)
* fix externals shadowing a versioned directory (issue #4085)
* fix problems working on unix file systems that don't support
permissions (r1612225)
* upgrade: keep external registrations (issue #4519)
* cleanup: iprove performance of recorded timestamp fixups (r1633126)
* translation updates for German
- Server-side bugfixes:
* disable revprop caching feature due to cache invalidation problems
(r1543594, r1619774, r1619105, r1619118, r1619153, r1619802)
* skip generating uniquifiers if rep-sharing is not supported (r1561426)
* mod_dav_svn: reject requests with missing repository paths (r1643409)
* mod_dav_svn: reject requests with invalid virtual transaction names
(r1643437)
* mod_dav_svn: avoid unneeded memory growth in resource walking
(issue #4531)
Developer-visible changes:
- General:
* make sure all members of the repos layer notify struct are valid,
fixes crashes in API users using all members (r1616131)
* properly generate a version resource when building on Windows (r1542610,
r1564576, r1568180)
* fix LIBTOOL_M4 and LIBTOOL_CONFIG variable not be evaluated properly
during a unix build (r1637826)
* allow the use of libtool 2.4.3 (r1640862, r1640873, r1643793)
Version 1.8.10
(11 Aug 2014, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.10
User-visible changes:
- Client-side bugfixes:
* guard against md5 hash collisions when finding cached credentials
(r1550691, r1550772, r1600909)
* ra_serf: properly match wildcards in SSL certs. (r1615211, 1615219)
* ra_serf: ignore the CommonName in SSL certs where there are Subject Alt
Names (r1565531, r1566503, r1568349, r1568361)
* ra_serf: fix a URI escaping bug that prevented deleting locked paths
(r1594223, r1553501, r1553556, r1559197, issue #3674)
* rm: Display the proper URL when deleting a URL in the commit log editor
(r1591123)
* log: Fix another instance of broken pipe error (r1596866, issue #3014)
* copy: Properly handle props not present or excluded on cross wc copy
(r1589184, r1589188)
* copy: Fix copying parents of locally deleted nodes between wcs
(r1589460, r1589486)
* externals: Properly delete ancestor directories of externals when
removing the external by changing svn:externals. (r1600311, 1600315,
r1600323, r1600393)
* ra_serf: fix memory lifetime of some hash values (r1606009)
- Server-side bugfixes:
* fsfs: omit config file when creating pre-1.5 format repos (r1547454,
r1561703)
Developer-visible changes:
- General:
* fix improper linking when serf is in the same prefix as existing svn
libraries. (r1609004)
* use proper intermediate directory when building with VS 2003-2008
(r1595431)
* support generating VS 2013 and later project files.
- Bindings:
* ruby: removing warning about Ruby 1.9 support being new. (r1593992)
* python: fix notify_func callbacks (r1594794, r1594814, r1594834, r1595061)
Version 1.8.9
(07 May 2014, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.9
User-visible changes:
- Client-side bugfixes:
* log: use proper peg revision over DAV (r1568872)
* upgrade: allow upgrading from 1.7 with exclusive locks (r1572102 et al)
* proplist: resolve inconsitent inherited property results (r1575270 et al)
* increase minimal timestamp sleep from 1ms to 10ms (r1581305 et al)
* merge: automatic merge confused by subtree merge (issue #4481)
* propget: report proper error on invalid revision for url (r1586255)
* commit: fix an assertion when committing a deleted descendant
(r1571747, r1571787, r1571795)
* merge: resolve segfault when '--force' merges a directory delete
(r1577812, r1577813, r1579429)
* resolve: prevent interactive conflict resolution when nothing has been
done to resolve the conflict (r1577294)
* update: fix locks lost from wc with pre-1.6.17 servers (issue #4412)
* merge: honor the 'preserved-conflict-file-exts' setting (r1577151)
* list: fix '--verbose' against older servers (r1591111)
* unlock: fix ability to remove locks with timeouts (r1579588)
* copy: fix 'svn copy URL WC' on relocated working copies
(r1580626, r1580650)
* export: allow file externals to be exported (issue #4427)
* move: fix working copy db inconsistency in cert scenarios (issue #4437)
* commit: fix an issue where mixed revision copy with non copy descendants
that shadow a not present node couldn't be committed (r1518942 et al)
* delete: properly remove move_to info when the node in its original
location is removed (r1538812 et al)
* status; fix an issue where output would vary based on if the target
was the node itself or its parent (r1544597 et al)
- Server-side bugfixes:
* ensure proper access synchronization in fsfs on Windows (r1568953 et al)
* svnadmin dump: don't let invalid mergeinfo stop dump (r1574868 et al)
* svnserve: resolve performance regression caused by iprops (r1578853 et al)
* reduce size of memory buffer when reading config files (r1581296)
* remove dead transaction if commit was blocked by hook (r1583977)
* svnrdump load: fix crash when svn:* normalization (issue #4490)
* fix memcached support (issue #4470)
* svndumpfilter: fix order of node record headers (r1578670 et al)
* mod_dav_svn: blacklist building with broken versions of httpd; 2.2.25,
2.4.5 and 2.4.6 (r1545835)
* mod_dav_svn: allow generic DAV clients to refresh locks (issue #3515)
* mod_dav_svn: detect out of dateness correctly during commit (issue #4480)
Developer-visible changes:
- General:
* improve consistency checks of DAV inherited property requests (r1498000)
* fix ocassional failure in autoprop_tests.py (r1567752)
* avoid duplicate sqlite analyze information rows (r1571214)
* add Mavericks to our sysinfo output (r1573088)
* bump copyright years to 2014 (r1555403)
* unbreak test suite when running as root (r1583580)
* resolve buffer overflow in testcode (r1481782)
* fix libmagic detection with custom LDFLAGS (r1577200)
* fix an out of scope variable use in merge (r1587946)
* javahl: fix crash from resolve callback throwing an exception (r1586439)
* ruby: fix two memory lifetime bugs (r1586052, r1586467)
* fix a missing null byte when handling old pre-1.4 deltas (r1587968)
* fix building with APR 0.9.x (r1585499)
* make svn_ra_get_locks() and svn_ra_get_lock() report not locked nodes
with a NULL svn_lock_t *, as documented (r1578273, r1578311, r1578326)
* fix tests for compiler flags (r1573106)
Version 1.8.8
(19 Feb 2014, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.8
User-visible changes:
- Client-side bugfixes:
* use CryptoAPI to validate intermediary certificates on Windows (r1564623)
* fix automatic relocate for wcs not at repository root (r1541638 et al)
* diff: fix when target is a drive root on Windows (r1541635)
* wc: improve performance when used with SQLite 3.8 (r1542765)
* copy: fix some scenarios that broke the working copy (r1560690)
* move: fix errors when moving files between an external and the parent
working copy (r1551524, r1551579)
* log: resolve performance regression in certain scenarios (r1553101 et al)
* merge: decrease work to detect differences between 3 files (r1548486)
* checkout: don't require flush support for symlinks on Windows (r1547774)
* commit: don't change file permissions inappropriately (issue #4440)
* commit: fix assertion due to invalid pool lifetime (r1553376 et al)
* version: don't cut off the distribution version on Linux (r1544878 et al)
* flush stdout before exiting to avoid information being lost (r1499470)
* status: fix missing sentinel value on warning codes (r1543145)
* update/switch: improve some WC db queries that may return incorrect
results depending on how SQLite is built (r1567109)
- Server-side bugfixes:
* reduce memory usage during checkout and export (r1564215)
* fsfs: create rep-cache.db with proper permissions (issue #3437)
* mod_dav_svn: prevent crashes with SVNListParentPath on (CVE-2014-0032)
* mod_dav_svn: fix SVNAllowBulkUpdates directive merging (r1548105)
* mod_dav_svn: include requested property changes in reports (r1557522)
* svnserve: correct default cache size in help text (r1563110)
* svnadmin dump: reduce size of dump files with '--deltas' (r1554978)
* resolve integer underflow that resulted in infinite loops (r1567985)
Developer-visible changes:
- General:
* fix ocassional failure of check_tests.py 12 (r1496127 et al)
* fix failure with SQLite 3.8.1-3.8.3 when built with
SQLITE_ENABLE_STAT3/4 due to bug in SQLite (r1567286, r1567392)
* specify SQLite defaults that can be changed when SQLite is built
to avoid unexpected behavior with Subversion (r1567064)
- API changes:
* numerous documentation fixes
* svn_client_commit_item3_dup() fix pool lifetime issues (r1550803)
* ra_serf: properly ask multiple certificate validation providers for
acceptance of certificate failures (r1535532)
* release internal fs objects when closing commit editor (r1555499)
* svn_client_proplist4() don't call the callback multiple times for
the same path in order to deliver inherited properties (r1549858 et al)
- Bindings:
* javahl: make test suite run without installing on OS X (r1535115)
* swig: fix building out of tarball on OS X (r1555654)
* swig-pl: fix with --enable-sqlite-compatibility-version (r1559009)
* swig: fix building bindings on OS X when APR has the -no-cpp-precomp
flag in the apr-config --cppflags output. (r1535610)
* swig: fix building from tarball with an out-of-tree build (r1543187)
Version 1.8.7
(Not released, see changes for 1.8.8.)
Version 1.8.6
(Not released, see changes for 1.8.8.)
Version 1.8.5
(25 November 2013, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.5
User-visible changes:
- Client-side bugfixes:
* fix externals that point at redirected locations (issues #4428, #4429)
* diff: fix assertion with move inside a copy (issue #4444)
- Server-side bugfixes:
* mod_dav_svn: Prevent crashes with some 3rd party modules (r1537360 et al)
* mod_dav_svn: canonicalize paths properly (r1542071)
* mod_authz_svn: fix crash of mod_authz_svn with invalid config (r1541432)
* hotcopy: fix hotcopy losing revprop files in packed repos (issue #4448)
- Other tool improvements and bugfixes:
* mod_dontdothat: Fix the uri parser (r1542069 et al)
Developer-visible changes:
- General:
* fix compilation with '--enable-optimize' with clang (r1534860)
* fix compilation with debug build of BDB on Windows (r1501656, r1501702)
* fix '--with-openssl' option when building on Windows (r1535139)
* add test to fail when built against broken ZLib (r1537193 et al)
- Bindings:
* swig-rb: fix tests to run without installing on OS X (r1535161)
* ctypes-python: build with compiler selected via configure (r1536537)
Version 1.8.4
(29 October 2013, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.4
User-visible changes:
- Client- and server-side bugfixes:
* fix assertion on urls of the form 'file://./' (r1516806)
* stop linking against psapi.dll on Windows (r1534102)
* translation updates for Swedish
- Client-side bugfixes:
* revert: fix problems reverting moves (issue #4436)
* update: fix assertion when file external access is denied (issue #4422)
* merge: reduce network connections for automatic merge (r1468980 et al)
* merge: fix path corruption during reintegration (r1523666)
* mergeinfo: fix crash (r1519955)
* ra_serf: verify the result of xml parsing (r1501199 et al)
* ra_serf: improve error messages during commit (r1526439)
* ra_local: fix error with repository in Windows drive root (r1518184)
* fix crash on windows when piped command is interrupted (r1522892)
* fix crash in the crash handler on windows (r1532023)
* fix assertion when upgrading old working copies (r1520529)
- Server-side bugfixes:
* hotcopy: cleanup unpacked revprops with '--incremental' (r1512300 et al)
* fix OOM on concurrent requests at threaded server start (r1527103 et al)
* fsfs: improve error message when unsupported fsfs format found (r1534158)
* fix memory problem in 3rd party FS module loader (r1519615 et al)
Developer-visible changes:
- General:
* allow compiling against serf 1.3 and later on Windows (r1517123)
- Bindings:
* javahl: canonicalize path for streamFileContent method (r1524869)
Version 1.8.3
(29 August 2013, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.3
User-visible changes:
- Client- and server-side bugfixes:
* translation updates for Swedish
* enforce strict version equality between tools and libraries (r1502267)
* consistently output revisions as "r%ld" in error messags (r1499044 et al)
- Client-side bugfixes:
* status: always use absolute paths in XML output (issue #4398)
* ra_serf: 'svn log -v' fails with a 1.2.x server (issue #4044)
* ra_serf: fix crash when committing cp with deep deletion (issue #4400)
* diff: issue an error for files that can't fit in memory (r1513119 et al)
* svnmucc: generate proper error for mismatched URLs (r1511353)
* update: fix a crash when a temp file doesn't exist (r1513156)
* commit & update: improve sleep for timestamps performance (r1508438)
* diff: continue on missing or obstructing files (issue #4396)
* ra_serf: use runtime serf version for User-Agent (r1514315, r1514628)
* ra_serf: ignore case when checking certificate common names (r1514763)
* ra_serf: format distinguished names properly (r1514804)
* ra_serf: do not retry HTTP requests if we started to parse them (r1503318)
* ra_serf: output ssl cert verification failure reason (r1514785 et al)
* ra_serf: allow session reuse after SVN_ERR_CEASE_INVOCATION (r1502901)
* ra_serf: include library version in '--version' output (r1514295 et al)
* info: fix spurious error on wc root with child in conflict (r1515366)
- Server-side bugfixes:
* svnserve: fix creation of pid files (r1516556)
* svnadmin: fix output encoding in non-UTF8 environments (r1506966)
* svnsync: fix high memory usage when running over ra_serf (r1515249 et al)
* mod_dav_svn: do not map requests to filesystem (r1512432 et al)
* svnauthz: improve help strings (r1511272)
* fsfs: fixed manifest file growth with revprop changes (r1513874)
* fsfs: fix packed revprops causing loss of revprops (r1513879 et al)
- Other tool improvements and bugfixes:
* svnwcsub/irkerbridge: fix symlink attack via pid file (r175 from upstream)
Developer-visible changes:
- General:
* describe APR unimplemented errors as coming from APR (r1503010 et al)
* mod_dav_svn: update INSTALL to reflect configure defaults (r1515141)
* davautocheck: use the correct apxs binary by default (r1507889, r1507891)
- API changes:
* svn_config_walk_auth_data() config_dir arg: permit NULL (r1507382 et al)
- Bindings:
* swig-pl: fix SVN::Client not honoring config file settings (r150744)
* swig-pl & swig-py: disable unusable svn_fs_set_warning_func (r1515119)
Version 1.8.2
(Not released, see changes for 1.8.3.)
Version 1.8.1
(23 July 2013, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.1
User-visible changes:
- Client- and server-side bugfixes:
* translation updates for German and Simplified Chinese
* improve sqlite error message output (r1497804)
* support platforms lacking mmap (r1498136)
* allow configuration files to start with UTF-8 BOM (r1499100 et al)
* don't fail on UTF-8 data when encoding conversion not available (r1503009)
* improve error messages when encoding conversion fails (r1503010)
- Client-side bugfixes:
* merge: rename 'automatic merge' to 'complete merge' (r1491432)
* mergeinfo: reduce network usage for '--show-revs' (r1492005)
* ra_serf: improve http status handling (r1495104)
* merge: avoid unneeded RA session (r1493475)
* merge: reduce network usage (r1478987)
* merge: remove duplicated ancestry check (r1493424, r1495597)
* ra_serf: fix 'Accept-Encoding' header for IIS interoperability (r1497551)
* svn status: improve documentation for lock columns (r1497318, r1497319)
* ra_serf: fix support for 'get-file-revs-reversed' capability (r1498456)
* log: reduce network usage on repository roots (r1496957)
* diff: avoid temporary files when calling external diff (issue #4382)
* upgrade: fix notification of 1.7.x working copies (r1493703, r1494171)
* fix crash during tree conflict resolution (issue #4388)
* interactive file merge: add two additional choices (r1491816, r1494089)
* diff: use local style paths in error messages (r1500680)
* resolve: improve the interactive conflict resolution menu (r1491739 et al)
* switch: use local style path in error message (r1500074)
* ra_serf: improve error output when receiving invalid XML (r1498851)
* svn cleanup: explain what the command does in help output (r1497310)
* blame: error on -r M:N where M>N unless server supports (r1498449 et al)
* gpg-agent auth: don't try to use agent when unavailable (r1500762 et al)
* gpg-agent auth: don't require GPG_TTY or TERM env vars (r1500801)
* update: fix some tree conflicts not triggering resolver (r1491868 et al)
* commit: remove stale entries from wc lock table when deleting (r1491756)
* merge: fix --record-only erroring out on renamed path (issue #4387)
* svnmucc: fix 'make install' symlink to work when DESTDIR is set (r1501072)
* wc: fix crash when target is symlink to a working copy root (issue #4383)
* ra_serf: change "internal malfunction" errors to normal errors (r1502577)
* ra_serf: handle proxies not supporting chunked requests (r1502401 et al)
- Server-side bugfixes:
* fsfs: resolve endless loop problem when repos/db/uuid has \r\n (r1492145)
* fsfs: remove revision property buffer limit (r1491770)
* mod_dav_svn: better status codes for anonymous user errors (r1495918)
* mod_dav_svn: better status codes for commit failures (r1490684)
* fix performance regression in 'svn log' against root (r1494913)
* allow deleting non-user-visible 'svn:' properties (r1495432)
* fsfs: fix crash on strict-alignment architectures (r1495806, r1495985)
* svnadmin upgrade: fix error of non-sharded fsfs repositories (r1494287)
* svnadmin create: deny '--fs-type=fsfs --compatible-version=1.0' (r1494223)
* svnadmin upgrade: fix data loss when cancelling in last stage (r1494298)
* mod_dav_svn: fix incorrect path canonicalization (r1503528)
See CVE-2013-4131, and descriptive advisory at
http://subversion.apache.org/security/CVE-2013-4131-advisory.txt
- Other tool improvements and bugfixes:
* fsfs-stats (tool): resolve segfault when passing invalid path (r1492164)
* svn-bench: fix help output (r1493951)
* svnpubsub: add version header to server (r1491707)
Developer-visible changes
- General:
* ra_serf: fix some test runner issues on Windows (r1490679)
* fix two issues in reverse svn_ra_get_file_revs() (r1492148, et al)
* handle --compatible-version=1.8 in the C tests (r1494342)
* improve clang compatibility (r1480080 et al)
* use proper cancel baton when handling conflicts (r1495850)
* fs: BDB: provide proper error value from BDB (r1495428)
* ra_serf: tweak connection failed error value (r1496132, et al)
* svn_client_log5: resolve possible segfault (r1496110)
* fix metadata_only move to work when target is unversioned node (r1498564)
* ra_svn: fix segfault with a NULL commit message (r1498550, r1499727)
* Ev2: correctly initialize node kind in shims' change table (r1501058)
* Ev2: fix copyfrom URL construction in shims (r1500226)
* fs: improve test against newlines in filenames (r1498483 et al)
* make building with BDB 6 an opt-in feature (r1499438)
* sqlite: allow placing amalgamation in build dir (r1499034, r1500175)
* ra_svn: make sessions usable after log callback early out (r1503554)
- Bindings:
* swig-rb: fix tests with out-of-tree-builds (r1492295)
* javahl: fix encoding of error messages produced by javahl (r1492264)
* swig-pl: silence compiler warnings (r1487094)
* swig-pl: improve documentation (r1488693, r1490721, r1500904)
Version 1.8.0
(18 Jun 2013, from /branches/1.8.x)
http://svn.apache.org/repos/asf/subversion/tags/1.8.0
User-visible changes:
- General:
* require serf as client-side http library (neon support removed) (r1349694)
* deprecate the Berkeley DB FS backend (libsvn_fs_base) (r1464985 et al)
- Major new features:
* working copy records moves as first-class operation (issue #3631, #4232)
* merge uses reintegrate mode automatically when needed (r1369896 et al)
* FSFS: Packing of revision property shards (issue #3944)
* support inheritable properties (r1395109)
* repository can suggest config for autoprops and ignores (r1401908)
* support gpg-agent for password caching (r1151069)
* authz rules can be stored inside the repository (r1424780)
- Minor new features and improvements (client-side):
* doubled svn:// protocol throughput (r1325899)
* optimize file/dir truename checks on Windows (r1435527)
* new 'commit --include-externals' option (related to issues #1167, #3563)
* new --include-externals option for 'svn list' (issue #4225)
* remove extraneous externals output from 'svn status -q' (issue #1935)
* reject some attempts to merge between unrelated branches (r1215273)
* new --ignore-properties option for 'svn diff' (r1239553, -617)
* new --properties-only option for 'svn diff' (r1336110)
* new --patch-compatible option for 'svn diff' (r1239561)
* new --no-diff-added option for 'svn diff' (r1433958)
* new w/c subtree duplication tool (tools/client-side/detach.py)
* new mergeinfo fixup tool (tools/client-side/mergeinfo-sanitizer.py)
* 'svn diff' can compare arbitrary files and directories (r1310291, et al)
* ra_serf avoids re-downloading content present in pristine store (r1333936)
* 'svn mergeinfo' now honors the --revision (-r) option (issue #4199)
* 'svn mergeinfo' now shows a summary graph by default (issue #4239)
* new --search and --search-and options for 'svn log' (r1354666, -83518)
* 'svn log' reports the node kind even for pre-1.6 revision files (r1242958)
* sort path list generated by "svn log -v --xml" (r1299323)
* new built-in interactive text conflict merge tool (r1357864, et al)
* 'svn --version' shows build system info (r1368662)
* 'svn --version --verbose' shows runtime environment info (r1370813 et al)
* 'svn' is now non-interactive when not run in a terminal device (r1424037)
* 'svn propset' checks spelling of reserved property names (r1470781)
* improve working copy performance on network disks (issue #4176)
* support for custom keyword definitions in svn:keywords (issue #890)
* svn:ignore __pycache__ directories by default (r1150073)
* 'svn diff --git' include copyfrom revision in "copied" headers (r1155279)
* svn:mergeinfo related operations now use much less memory (r1149519 et al)
* get list of supported schemes for RA libraries (r1148134)
* 'svn checkout' skips file externals from other repositories (r1153110)
* 'svn resolve' exits non-zero if conflicts could not be resolved (r1150439)
* let HTTPv2-aware clients fetch v2-style resources (r1161202)
* 'svn status' with better NLS support (r1157537, -682)
* better tracking of shallow-yet-complete merges (issues #4056, #4057)
* make 'svn status --quiet' w/ externals quieter still (issue #1935)
* ensure that conflict paths are shown relative-ized (r1337520)
* improve performance of local multi-target deletions (r1195873)
* various interactive conflict resolver improvements in 'svn' (r1440421 etc)
* improved tree diff implementation for diff and merge (r1440599 et al)
* tree conflicts on directories detected better during merges (issue #3150)
* allow reverting unmodified copies with 'svn remove' (r1442611)
* make 'svn diff' with mixed URL and local path targets work (r1442640)
* make 'svn patch' re-add deleted directories if needed (r1445333)
* make repos-wc diffs fully ancestry-aware (r1445904)
* 'svn diff --git' now implies 'svn diff --show-copies-as-adds' (r1446279)
* 'svn diff --show-copies-as-adds' now implies --notice-ancestry (r1446279)
* improved tree-conflict detection for 'svn switch' (r1449413, r1450582)
* allow up to 8 revision number digits in 'svn status -v' output (r1428637)
* show node kind (file or dir) in tree conflict descriptions (r1429907)
* restore deleted switched paths upon next update (issue #4295)
* add support for copying paths from foreign repositories (issue #3590)
* fix merge -cA,B with --accept option aborts if rA conflicts (issue #4238)
* 'svn resolve' interactive support; no longer requires --accept (r1336929)
* notify when removing externals leaves behind modified files (r1366021)
* new 'http-max-connections' configuration option for serf (r1421559)
* new 'http-bulk-updates' configuration option for serf (r1421490)
* 'svn cleanup' now runs SQLite "vacuum" to reclaim space (r1418459)
* 'svn info' displays repository-relative URL (r1415365)
* fix serf memory leak on checkout (issue #4194)
* detect duplicate paths setting svn:externals (issue #4227)
* make ra_serf work over HTTP/1.0 proxies (issue #3979)
* make ra_serf accept gzip compression for all responses (r1407454)
* double ra_serf performance for checkout and export (r1407545)
* improve network and disk i/o interleaving in ra_serf (r1407934)
* avoid assert in ra_serf when REPORT response was truncated (r1407935)
* rewrite ra_serf XML parser (r1409259 et al)
* ra_serf can create transaction with inline txnprops (r1375167)
* partially fix replace+propset of locked file fails over DAV (issue #3674)
* fix ra_serf doesn't handle bad baseline error from server (issue #4127)
* decreased default http timeout for ra_serf (issue #3968)
* prevent ra_serf from corrupting the working copy (issue #3993)
* ra_serf transmits property changes inline to reduce requests (r1378927)
* by default avoid SSL certificate prompts in client (issue #2410)
* improve interactive resolution of property conflicts (r1387678 et al)
* make ra_serf raise an error upon delta-base mismatch (issue #4235)
* tune ra_svn transmit buffer handling (r1391788)
* make 'svnrdump' work with serf (issue #4116)
* fix 'svnrdump' on path below repository root (issue #4101)
* support ipv6 in URLs (e.g. http://[::1]/svn/repos) (r1454047)
* conflict resolver now iterates paths in a sorted order (r1461820)
* mod_dav_svn does keyword expansion with 'kw=1' query arg (r1466055)
- Minor new features and improvements (server-side):
* improve performance of config file parsing (r1344347 et al)
* new 'svnadmin load --revision' load filtering support (issue #3734)
* new 'svnadmin hotcopy --incremental' support for FSFS (issue #3815)
* new 'svnadmin lock' / 'svnadmin unlock' subcommands (issue #3942, #4092)
* new SVNUseUTF8 configuration option for mod_dav_svn (issue #2487)
* new SVNHooksEnv configuration option for mod_dav_svn (r1239966)
* new SvnPubSub distributed commit hooks (tools/server-side/svnpubsub)
* new light-weight benchmarking client (tools/client-side/svn-bench)
* svndumpfilter dependency analysis (tools/server-side/svnpredumpfilter.py)
* new automatic working copy updater (tools/server-side/svnpubsub)
* new 'svnadmin freeze' subcommand (r1376228)
* 'svndumpfilter' now supports --delta dumpfiles (r1351009, -3745)
* new --drop-all-emtpy-revs option for 'svndumpfilter' (issue #3681)
* client version info now reported to commit hooks (issue #4124)
* txn name now reported to post-commit hooks (r1240856)
* support for server-side keyword expansion in mod_dav_svn (r1466055)
* FSFS now able to cache revision properties (r1326307)
* FSFS cache for changed-paths increases 'svn log' performance (r1378358)
* FSFS cache mergeinfo requested during 'log -g' (r1395439)
* many FSFS caching improvements (r1390435, r1390447)
* directory and property deltification option in FSFS (issue #4084)
* fine-grained control deltification behavior via fsfs.conf (r1311476)
* FSFS de-duplication ("rep sharing") now works within a revision (r1397773)
* FSFS de-duplication now works for properties as well (r1243312)
* read FSFS data using fewer fopen calls (issue #3372)
* 'svnadmin verify' will now check meta data (issues #3956, #4211)
* 'svnadmin verify' now checks for issue #4129 style corruption (r1304656)
* new --client-speed option for svnserve (r1391788)
* new --single-threaded option in svnserve (r1296018)
* hook script templates are now marked as executable (r1153414)
* error out on non-canonical fspaths in the authz file (r1166111)
* improve path lookup performance in FSFS (r1442088)
* svnserve now logs explicit path and reason for authz failures (r1446542)
* validate offsets from rep-cache to prevent FSFS corruption (issue #4277)
* new AuthzSVNGroupsFile option to store authz groups separately (r1438407)
* new 'SVNAllowBulkUpdates prefer' option for mod_dav_svn (r1417642, et al)
* new 'SVNMasterVersion' option for mod_dav_svn (r1398962)
* added virtual-host support to 'svnserve' (r1401296)
* new fsfs-stats tool which prints FSFS repository stats (r1410995)
* new fsfs-reorg tool to optimize FSFS packing (r1383214, r1385395)
* new --compatible-version option for 'svnadmin create' (r1407279 )
* new --ignore-properties option for 'svnlook diff' (r1407905)
* new --properties-only option for 'svnlook diff' (r1407905)
* new --diff-cmd option for 'svnlook diff' (r1413449)
* allow leading "r"'s in http: ?p= and ?r= query parameters (r1221463)
* faster 'svn ls' for large directories (r1296627)
* mod_dav_svn now advertises supported POST types (r1375123)
* mod_dav_svn can create transaction with inline txnprops (r1375167)
* run start-commit hook after transaction creation (r1376201)
* avoid byte-for-byte comparison where it can be avoided (r1390641)
* various server-side performance improvements for 'log -g' (r1395442 et al)
* allow up to 10Gbit throughput with svnserve (r1391788)
* install mod_dontdothat correctly (r1454450)
* svnadmin verify can now verify transactions (r1462353)
* FSFS verifies revisions as they are added (r1462409)
- Client-side bugfixes:
* fix inconsistent 'svn log' output for empty revisions (issue #3964)
* fix mis-ordered text output of 'svn log --diff' on Windows (r1220783)
* fix 'svn log --diff' on moved file (issue #4153).
* fix 'svn revert' of 'svn move' (issue #876)
* fix file externals wrongly "resurrecting" a deleted file (#4017)
* fix reporting of corrupted 1.6 w/cs by 'svn upgrade' (r1182904, -9)
* fix bug caused by URI-decoding local merge source paths (r1210539)
* fix properties out of sync with repos after merge and revert (issue #4305)
* fix merge of replacement on local delete fails (issue #4011)
* fix replacements on deletes produce wrong tree conflicts (issue #3806)
* made ra_serf handle location headers that are not RFC-compliant (r1443906)
* merge no longer errors out after resolving all conflicts (issue #4316)
* fix svn blame mis-categorizing file type as binary (issue #2089)
* fix externals not removed when working copy is made shallow (issue #3741)
* fix update under add with not-present parent (issue #4111)
* fix revert of files with svn:needs-lock under copied dirs (r1343168)
* fix repos->wc diff of local copied/moved-here directories (r1341927)
* fix repos->wc diff of local copied/moved-here files (r1341544)
* fix "svn diff -cN PATH" where PATH was deleted in rN (r1338708)
* fix dependency on APR hash order in several logic paths (r1338350 et al)
* fix path inconsistencies in 'svn diff' output (r1338291)
* fix misleading error message printed by 'svn switch' (issue #2337)
* fix bug in mergeinfo recording during foreign-repos merge (r1430310)
* fix spurious merge conflicts for binary files with keywords (issue #4221)
* fix patching symlinks with 'svn patch' (issue #4273)
- * make 'svn switch' refresh lock information (issue #3376)
+ * make 'svn switch' refresh lock information (issue #3378)
* fix 'svn diff' output doesn't apply as patch without fuzz (issue #3362)
* fix mergeinfo recording for multiple-revision-range merge (issue #4306)
* fix diffs shown by 'show-diff' conflict prompt option (r1438879)
* don't print an update summary header with no content (r1439480)
* make 'svn rm' remove externals registrations below its targets (r1361256)
* fix crashes in ra_serf where AVG 2012 Surf-Shield is in use (issue #4175)
* don't raise conflicts on identical binary files (issue #4128)
* improve error messages when wc.db missing (issue #4118)
* fix 'svn diff' showing wrong text change (issue #4270)
* fix 'svn diff -rN' failing to show local replace (issue #3797)
* fix 'svn diff' showing wrong revision (issue #4010)
* fix 'svn merge' showing spurious notifications (issue #2910)
* parse '.@HEAD' correctly (issue #3606)
* fix 'svn revert' after conflict in sparse working copy (issue #4168)
* fix bug in global/per-server config handling in serf (r1421516)
* properly display errors from serf (r1398742)
* fix crash in ra_serf (r1408291)
* fixed svnmucc propset and propdel on repository root (issue #3663)
* fix 'svn info' output with ancient svnserve servers (pre-1.2) (r1409732)
* ra_serf shows error message for 408 Request Timeout response (r1410983)
* fix handling of "\ No newline ..." in diff/patch (r1411723, r1412382)
* allow infinite http timeout in ra_serf (r1411976)
* using unknown svn: property names now requires --force (issue #4261)
* fix handling of case insensitive configuration files (r1215089)
* properly handle errors during password caching (r1380695)
* fix svnversion output not always a number (issue #4226)
* fix conflict resolver losing executable bit of a file (r1391019)
* fix redundant notifications when merging with ra_serf (issue #3802)
* fix 'svn add --force /path/to/wcroot' should work (issue #4241)
* fix file permissions changed after commit (issue #4331)
* improve handling of http errors in ra_serf (1452792, 1452870)
* include checksum of missing pristines in error message (r1452800)
* fix an assert when merging against a replaced source (issue #4132)
* fix replacement in merge source has incorrect notification (issue #4138)
* improve performance of checkout (r1453791)
* fixed documentation regarding merge source (issue #3247)
* fix merge errors out after resolving conflicts (issue #4316)
* fix delete/move with file external in unversioned dir (issue #4293)
* fix resolving tree conflict with local node missing (r1461848)
* fix invalid read during diff suffix scanning (issue #4339)
* fix assertion when running 'svn log <SOME_URL>@PREV' (r1462134)
* optimize enumerating configuration options (r1464478)
* revert will now sleep for timestamps if using commit times (r1464769)
* don't allow externals to be deleted with 'svn rm' (r1464992)
* improved memory usage in ra_serf and ra_local (r1465280)
* replace some assertions with more helpful error messages (r1465975)
* fixed long keyword expansion truncated (issue #4349)
- Server-side bugfixes:
* SVNParentPath / repository listing now authz-filtered (r1408184)
* user/group names in the authz config file are case-sensitive (r1475772)
* limit commit runtime for nodes with very deep histories (r1224836)
* 'svnadmin recover' truncates rep-cache at the right point (issue #4077)
* fix crashes in dumpstream loading with skipped revs (r1214202, r1214216)
* fix 'svn log -g' incorrectly treating rename as merge (issue #4022)
* fix bug where fsfs file-hinting fails (issue #4320)
* don't leak path of repository on server's disk to clients (r1330906)
* remove spurious is-fresh-txn-root from empty revision files (issue #4031)
* fix a stdout handling problem in 'svnlook diff' (r1411971)
* fix erratic behaviour in 'svnlook diff' showing property diffs (r1412224)
* fix inconsistent authz error messages in 'svn log' in svnserve (r1292462)
* fix svndumpfilter for empty paths in included or excluded lists (r1294583)
* make fsfs packing threadsafe (r1376011)
* don't error out on intermittent memcached failures (r1394470)
* fix a ra_svn deadlock with zero-copy server option (r1465622)
- Other tool improvements and bugfixes:
* 'svnmucc' promoted to first-class supported utility (issue #3308, #4279)
* make 'svnmucc' prompt for log messages (issue #3418)
* rename 'svnauthz-validate' to 'svnauthz' (issue #4284)
* make 'svnauthz' optionally validate user/path access (r1197588)
* fix mailer.py test suite problems (r1449582)
* fix mailer.py not showing dirs with property deletions (r1449582)
* make mailer.py generate Date and Message-ID headers (r1449592)
* new '-?' option support for 'svnmucc' (r1339428)
* provide the repository name to mailer.py (r1439592)
* add '--force-interactive' to svnmucc (r1457789)
* add '--trust-server-cert' to svnmucc (r1458995)
Developer-visible changes:
- General:
* now require Python 2.5 for tests and dev tools (r1243627)
* now require bzip2 for tests and dev tools (r1148512)
* configure defaults to --without-apache-libexecdir (r1469862)
* support builds with APR pool debugging (r1176894)
* 'make extraclean' is more thorough now (r1149460)
* support for Serf 2 (r1147538)
* introduction of editor v2 (via private APIs only) (r1166332 et al)
* improve SQLite setup for compatibility with OS X 10.7. (r1181666)
* rework switch statement to accommodate OWC compiler limitations (r1204407)
* new --enable-sqlite-compatibility-version configure option (r1201421)
* make test suite LD_LIBRARY_PATH include just-built auth plugins (r1200474)
* packages/ directory removed, contents were outdated and unused (r1442167)
* rename 'makefile.ezt' to 'build-outputs.mk.ezt' (r1444822)
* use expensive compiler optimizations with --enable-optimize (r1445063)
* in Visual C++ builds, move temp files to different directory (r1446416)
* remove --with-ssl and --with-gssapi configure options (r1449023)
* require at least serf 1.2.0 as build dependency (issue #4296)
* fix error tracing to record file/line properly (r1331242)
* add --log-level argument to win-tests.py (r1335461)
* improve GDB pretty-printing of svn types (r1351336, r1364750, r1365035)
* load third-party FS modules (if --enable-runtime-module-search) (r1362434)
* enable running the regression tests over https (r1349699)
* support 'make davautocheck' on OS X (r1421583)
* new '--enable-gcov' configure option (r1416646)
* fix build with Apache HTTPD 2.5 (r1408985)
* allow running the test suite through a http proxy (r1410195)
* don't use non-constant initializers in struct variables (r1412911)
* allow generation of Visual Studio 2012 compatible projects (r1245152)
* nicer pretty-printing of Subversion data types in gdb (r1367262 et al)
* teach serf build on Windows to use static APR/Util and OpenSSL (r1371338)
* add --ssl-cert option to win-tests.py to run tests over https (r1372760)
* don't strip Content-Type header form .po files on Windows (r1380056)
* configure now script auto-detects GNOME keyring (r1387230)
* allow configure to detect BDB on Debian-based Linux distros (r1390633)
* auto-detect serf via pkg-config (r1391662)
* improve queries for compatibility with SQLite 3.7.16 (r1455239)
* remove support for in-tree apr, apr-util and apr-memcache (r1456924)
* FSFS caching supports prefixes now (r1462436)
* maintainer mode now prints symbolic error codes (r1465157)
* don't require NLS support for kwallet support (r1466445)
* make Julian happy (r1413030)
- API changes:
* fix inconsistent handling of log revs without changed paths (issue #3694)
* deprecated SVN_ERR_SQLITE_UNSUPPORTED_SCHEMA (r1173240)
* provide API to clear cached auth credentials (issue #2775)
* improve repository location information in various APIs (issue #4170)
* major rewrite of conflict storage and handling APIs (r1354973 et al)
* hide (deprecate) svn_wc APIs that use editors (r1243339)
* svn_stringbuf_ensure() allocates an extra byte for terminator (r1308966)
* switch and update apis are now more consistent (r1465292)
* deprecated svn_client_merge_reintegrate (r1466742)
* deprecated low level ra_svn apis (r1466907)
- Bindings:
* star-imports in swig-py only import 'svn_*' symbols (r1303375)
* fix compilation of Perl bindings on Mandriva 2007 (issue #2617)
* new JavaHL testing targets (r1182983)
* enable returning an error on malfunctions for JavaHL (r1366215)
* MacOS X build fix to cope with missing GNOME keyring (r1397844)
* fix swig bindings tests on MacOS X (r1397846)
* fix assertion failure in JavaHL error reporting (r1405922)
* support ruby 1.9 (r1407206)
* JavaHL: Include OSGI Manifest information in svn-javahl.jar (r1234864)
* new svn_auth_set_gnome_keyring_unlock_prompt_func function (r1241554)
* fix svn_txdelta window ops for python bindings (r1389054)
* fix build of Perl bindings with newer versions of SWIG (r1389658)
* add missing API functions to Perl bindings (issue #2646)
* add missing API functions to Python bindings (r1392038 et al)
* add missing API functions to JavaHL bindings (issue #4326)
* fix some reference counting bugs in swig-py bindings (r1464899, r1466524)
Version 1.7.22
(12 Aug 2015, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.22
Developer-visible changes:
- General:
* fix the regression test suite which was broken in 1.7.21 (r1694012)
Version 1.7.21
(5 Aug 2015, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.21
User-visible changes:
- Client-side bugfixes:
* cp: fix 'svn cp ^/A/D/H@1 ^/A' to properly create A (r1674455, r1674456)
* fix issue #4551: svnrdump load commits wrong properties, or fails, on a
non-deltas dumpfile (r1652182 et al.)
- Server-side bugfixes:
* mod_authz_svn: do not leak information in mixed anonymous/authenticated
httpd (dav) configurations (CVE-2015-3184)
* do not leak paths that were hidden by path-based authz (CVE-2015-3187)
* fix 'svnadmin recover' for pre-1.4 FSFS repositories (r1561419)
Developer-visible changes:
- General:
* support building on Windows with Visual Studio 2012, 2013 and 2015 (r1687158, r1692783)
- Bindings:
* swig-pl: fix some stack memory problems (r1668618, 1671388)
Version 1.7.20
(31 Mar 2015, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.20
User-visible changes:
- Client-side bugfixes:
* fix 'svn patch' output for reordered hunks (issue #4533)
- Server-side bugfixes:
* reject invalid get-location-segments requests in mod_dav_svn and
svnserve (r1667233)
* mod_dav_svn: reject invalid txnprop change requests (r1667235)
- Client-side and server-side bugfixes:
* properly duplicate svn error objects (r1651759)
* fix use-after-free in config parser (1646785, r1646786, r1646797)
Developer-visible changes:
* add lock file config for testing against HTTPD 2.4+ (r1544302, r1544303)
* fix build with absolute path to neon install (r1664789)
Version 1.7.19
(15 Dec 2014, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.19
User-visible changes:
- Client-side bugfixes:
* rm: display the proper URL in commit log editor (r1591123)
* diff: fix invalid read during suffix scanning (issue #4339)
* fix crash in eclipse IDE with GNOME Keyring (issue #3498)
* checkout/update: fix file externals failing to follow history and
subsequently silently failing (issue #4185)
- Server-side bugfixes:
* svnadmin dump: don't let invalid mergeinfo prevent a dump (issue #4476)
* mod_dav_svn: reject requests with missing repository paths (r1643409)
* mod_dav_svn: reject requests with invalid virtual transaction names
(r1643437)
* mod_dav_svn: avoid unneeded memory growth in resource walking
(issue #4531)
Developer-visible changes:
- General:
* properly generate a version resource when building on Windows (r1542610,
r1564576, r1568180)
* fix a problem with the unix build that could result in linking to the
wrong Subversion libraries at build or at run time (r1594157)
* use a proper intermediate directory when building with Visual Studio
2003-2008 (r1595431)
* fix LIBTOOL_M4 and LIBTOOL_CONFIG variable not be evaluated properly
during a unix build (r1637826)
* allow the use of libtool 2.4.3 (r1640862, r1640873, r1643793)
Version 1.7.18
(11 Aug 2014, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.18
User-visible changes:
- Client-side bugfixes:
* guard against md5 hash collisions when finding cached credentials
(r1550691, r1550772, r1600909)
* ra_serf: properly match wildcards in SSL certs. (r1615211, 1615219)
* ra_serf: ignore the CommonName in SSL certs where there are Subject Alt
Names (r1565531, r1566503, r1568349)
Developer-visible changes:
- General:
* fix ocassional failure in checkout_tests.py test 12. (r1496127)
* disable building ZLib's assembly optimizations on Windows.
Version 1.7.17
(07 May 2014, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.17
User-visible changes:
- Client-side bugfixes:
* log: use proper peg revision over DAV (r1568872)
* move: fix errors when moving files between an external and the parent
working copy (r1551579)
* copy: fix 'svn copy URL WC' on relocated working copies
(r1580626, r1580650)
- Server-side bugfixes:
* mod_dav_svn: blacklist building with broken versions of httpd; 2.2.25,
2.4.5 and 2.4.6 (r1545835)
* mod_dav_svn: detect out of dateness correctly during commit (issue #4480)
Developer-visible changes:
- General:
* fix libmagic detection with custom LDFLAGS (r1577200)
* fix a missing null byte when handling old pre-1.4 deltas (r1587968)
* support building with Serf 1.3.x (r1517123, r1535139)
- Bindings:
* javahl: fix crash from resolve callback throwing an exception (r1586439)
Version 1.7.16
(26 Feb 2014, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.16
User-visible changes:
- Client-side bugfixes:
* copy: fix some scenarios that broke the working copy (r1560690)
* diff: fix regressions due to fixes in 1.7.14 (issue #4460)
- Server-side bugfixes:
* mod_dav_svn: prevent crashes with SVNListParentPath on (CVE-2014-0032)
* reduce memory usage during checkout and export (r1564215)
Developer-visible changes:
- General:
* fix failure in checkout_tests.py
* support compiling against Cyrus sasl 2.1.25 (r1404912, r1413402)
* support compiling against neon 0.30.x (r1566320)
Version 1.7.15
(Not released, see changes for 1.7.16.)
Version 1.7.14
(25 Nov 2013, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.14
User-visible changes:
- Client- and server-side bugfixes:
* fix assertion on urls of the form 'file://./' (r1516806)
- Client-side bugfixes:
* upgrade: fix an assertion when used with pre-1.3 wcs (r1530849)
* ra_local: fix error with repository in Windows drive root (r1518184)
* fix crash on windows when piped command is interrupted (r1522892)
* fix externals that point at redirected locations (issues #4428, #4429)
* diff: fix incorrect calculation of changes in some cases (issue #4283)
* diff: fix errors with added/deleted targets (issues #4153, #4421)
- Server-side bugfixes:
* mod_dav_svn: Prevent crashes with some 3rd party modules (r1537360 et al)
* fix OOM on concurrent requests at threaded server start (r1527103 et al)
* fsfs: limit commit time of files with deep change histories (r1536790)
* mod_dav_svn: canonicalize paths properly (r1542071)
- Other tool improvements and bugfixes:
* mod_dontdothat: Fix the uri parser (r1542069 et al)
Developer-visible changes:
- Bindings:
* javahl: canonicalize path for streamFileContent method (r1524869)
Version 1.7.13
(29 Aug 2013, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.13
User-visible changes:
- General
* merge: fix bogus mergeinfo with conflicting file merges (issue #4306)
* diff: fix duplicated path component in '--summarize' output (issue #4408)
* ra_serf: ignore case when checking certificate common names (r1514763)
- Server-side bugfixes:
* svnserve: fix creation of pid files (r1516556)
* mod_dav_svn: better status codes for commit failures (r1490684)
* mod_dav_svn: do not map requests to filesystem (r1512432 et al)
Developer-visible changes:
- General:
* support linking against gssapi on Solaris 10 (r1515068)
* don't use uninitialized variable to produce an error code (r1482282)
- Bindings:
* swig-pl: fix SVN::Client not honoring config file settings (r150744)
* swig-pl & swig-py: disable unusable svn_fs_set_warning_func (r1515119)
Version 1.7.12
(Not released, see changes for 1.7.13.)
Version 1.7.11
(23 Jul 2013, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.11
User-visible changes:
- General
* translation updates for Simplified Chinese
- Server-side bugfixes:
* mod_dav_svn: fix incorrect path canonicalization (r1503528)
See CVE-2013-4131, and descriptive advisory at
http://subversion.apache.org/security/CVE-2013-4131-advisory.txt
- Other tool improvements and bugfixes:
* fix argument processing in contrib hook scripts (r1485350)
See CVE-2013-2088, and descriptive advisory at
http://subversion.apache.org/security/CVE-2013-2088-advisory.txt
Developer-visible changes:
- Bindings:
* javahl: fix bug in error constructing code (r1405922)
Version 1.7.10
(30 May 2013, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.10
User-visible changes:
- Client-side bugfixes:
* fix 'svn revert' "no such table: revert_list" spurious error (issue #4168)
* fix 'svn diff' doesn't show some locally added files (issue #3797)
* fix changelist filtering when --changelist values aren't UTF8 (r1475724)
* fix 'svn diff --git' shows wrong copyfrom (issue #4294)
* fix 'svn diff -x-w' shows wrong changes (issues #4133 and #4270, r1427278)
* fix 'svn blame' sometimes shows every line as modified (issue #4034)
* fix regression in 'svn status -u' output for externals (r1434750)
* fix file permissions change on commit of file with keywords (issue #4331)
* improve some fatal error messages (r1465975)
* fix externals not removed when working copy is made shallow (issue #3741)
- Server-side bugfixes:
* fix FSFS repository corruption due to newline in filename (issue #4340)
See CVE-2013-1968, and descriptive advisory at
http://subversion.apache.org/security/CVE-2013-1968-advisory.txt
* fix svnserve exiting when a client connection is aborted (r1482759)
See CVE-2013-2112, and descriptive advisory at
http://subversion.apache.org/security/CVE-2013-2112-advisory.txt
* fix svnserve memory use after clear (issue #4365)
* fix repository corruption on power/disk failure on Windows (r1483781)
Developer-visible changes
- General:
* make get-deps.sh compatible with Solaris /bin/sh (r1451678)
* fix infinite recursion bug in get-deps.sh (r1421541, r1424977)
* fix uninitialised output parameter of svn_fs_commit_txn() (r1461743)
- Bindings:
* fix JavaHL thread-safety bug (r1476359)
Version 1.7.9
(04 Apr 2013, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.9
User-visible changes
- Client-side bugfixes:
* improved error messages about svn:date and svn:author props. (r1440620)
* fix local_relpath assertion (issue #4257)
* fix memory leak in `svn log` over svn:// (r1458341)
* fix incorrect authz failure when using neon http library (issue #4332)
* fix segfault when using kwallet (r1421103)
- Server-side bugfixes:
See CVE-2013-1845, CVE-2013-1846, CVE-2013-1847, CVE-2013-1849,
and CVE-2013-1884, and descriptive advisories at
http://subversion.apache.org/security/
* svnserve will log the replayed rev not the low-water rev. (r1461278)
* mod_dav_svn will omit some property values for activity urls (r1453780)
* fix an assertion in mod_dav_svn when acting as a proxy on / (issue #4272)
* improve memory usage when committing properties in mod_dav_svn (r1443929)
* fix svnrdump to load dump files with non-LF line endings (issue #4263)
* fix assertion when rep-cache is inaccessible (r1422100)
* improved logic in mod_dav_svn's implementation of lock. (r1455352)
* avoid executing unnecessary code in log with limit (r1459599)
Developer-visible changes:
- General:
* fix an assertion in dav_svn_get_repos_path() on Windows (r1425368)
* fix get-deps.sh to correctly download zlib (r13520131)
* doxygen docs will now ignore prefixes when producing the index (r1429201)
* fix get-deps.sh on freebsd (r1423646)
- Bindings:
* javahl status api now respects the ignoreExternals boolean (r1435361)
Version 1.7.8
(17 Dec 2012, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.8
User-visible changes
- Client- and server-side bugfixes:
* Fix typos in pt_BR, es and zh_TW translations (r1402417, r1402421)
- Client-side bugfixes:
* fix crash with --username option on Windows (r1396285)
* add missing attributes to "svn log -v --xml" output (r1398100)
* fix svn patch ignoring hunks after no trailing newline (r1399174)
* fix hang with ra_serf during error processing (r1403583)
* ignore file externals with mergeinfo when merging (r1401915)
* fix "svnmucc cp" segfault with a missing last argument (issue #4079)
* fix conflict handling on symlinks (issue #4091)
- Server-side bugfixes:
* properly detect threading availability (r1398325)
* fix "svnadmin load --bypass-prop-validation" (r1237779)
* fix parsing of [groupsfoo] sections in authz file (issue #3531)
* add Vary: header to GET responses to improve cacheability (r1390653)
* fix fs_fs to cleanup after failed rep transmission (r1403964, et al)
* fix mod_dav_svn to complain about revisions > HEAD (r1403588)
Developer-visible changes:
- General:
* fix incorrect status returned by 1.6 API (r1403258)
* fix compilation with g++ 4.7 (r1345740)
* fix svn_uri_get_file_url_from_dirent on Windows (r1409146)
Version 1.7.7
(09 Oct 2012, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.7
User-visible changes
- Client- and server-side bugfixes:
* fix memory read bug (r137614)
* update Chinese translation
- Client-side bugfixes:
* fix issues with applying Git patch files (r1374800, et al)
* fix status does not descend into dir externals after upgrade (issue #4016)
* fix file externals don't update with old mod_dav_svn (issue #4224)
* fix external diff tool duplicates Index: lines with 'svn diff' (r1380697)
* fix GNOME keyring library fails with very old glib (r1378847)
* fix unknown password stores in config file cause error (r1375052)
* fix assertions in ra_serf running against server root (r1365519, et al)
* fix ra_serf checkout/export aborts early on Windows (issue #4174)
- Server-side bugfixes:
* fix an assert with SVNAutoVersioning in mod_dav_svn (issue #4231)
* fix unbounded memory use with SVNPathAuthz short_circuit (r1387943)
* fix svndumpfilter exclude --targets requires leading slash (issue #4234)
* fix connection ttl for memcache should be 50 seconds (r1391641)
* stabilize order of paths in dumpfiles with APR 1.4.6 (r1344864, et al)
Developer-visible changes:
- General:
* print "All tests successful" at the end of 'make check' (r1375089)
* fix sandbox violation in a test (r1371282)
* fix tests fail when running within a format 30 WC (r1391188, et al)
* fix return value of svn_client_update4() incorrect (r1380295)
* fix make check summary missing test failures (r1390965)
* fix build does not fail when apache httpd is not available (r1374198)
- Bindings:
* fix swig-pl build fails with swig 2.0.7 and newer. (r1389658)
* fix swig-py runtime problems with swig 2.0.5 and newer (r1351117)
Version 1.7.6
(15 Aug 2012, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.6
User-visible changes:
- Client- and server-side bugfixes:
- Client-side bugfixes:
* Fix "svn status -u --depth empty FILE" (r1348822, r1349215)
* Fix example output of 'svn help status' (issue #3962)
* propset of svn:eol-style might not notice related text changes (r1353572)
* sort output of 'svn propget -R' (r1355699)
* sort output of 'svn proplist' (r1355698)
* sort output of 'svn status' (r1341012)
* avoid a filestat per working copy find operation (r1340556)
* optimize 'svn upgrade' performance on large working copies (r1342984)
* allow 'file:///C:\repos' style arguments on Windows, like 1.6 (r1346765)
* fix ra_serf against Subversion 1.2 servers (r1349367)
* fix 'svn upgrade' on working copies with certain tree conflicts (r1345482)
* avoid workqueue references to system temp dir (r1367854)
* allow non-existent canonical paths (r1367853)
* fix 'svn revert --depth files' to operate on files (r1365554)
* fix ra_serf XML namespace handling against malicious server (r1337441)
* fix relocate with server-relative externals (issue 4216)
* change two asserts into errors for TortoiseSVN (r1368128, r1368065)
* don't attempt to anchor an operation outside a wc root (r1361341)
- Server-side bugfixes:
* partial sync drops properties when converting to adds (issue #4184)
* replaying a copy and delete of an unreadable child fails (issue #4121)
* allow svnlook to operate on r0 (r1362508)
* make FSFS revision files independent of APR hash order (r1367498)
- Other tool improvements and bugfixes:
* move mod_dontdothat to install-tools (r1307177)
Developer-visible changes:
- General:
* fix running tests against httpd 2.4 (r1291594)
* use constant struct initialisers for C89 compatibility (r1352068)
- Bindings:
* JavaHL: Don't assert on some invalid input (r1354626, r1354652)
* JavaHL: Add missing new in 1.7 notifications (r1351772)
Version 1.7.5
(17 May 2012, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.5
User-visible changes:
- Client- and server-side bugfixes:
* http: report deleted-revision upon delete during update (r1327474)
- Client-side bugfixes:
* avoid potential segfault when canonicalizing properties (r1296369)
* improve memory and file-handle management with externals (issue #4130)
* serf: convert assertions to "MERGE failed" errors (r1302417)
* fix undefined behaviour during multi-segment reverse merges (issue #4144)
* fix potential use of already freed memory during diff operation (r1311935)
* improve performance of scan for the working copy root (r1306334)
* cmdline: fix segfault during 'svn diff' argument processing (r1311702)
* fix regression from 1.6 in update with --depth option (issue #4136)
* propset: avoid undefined behaviour in error path (r1325361)
* reset sqlite statements, partly for sqlite-3.7.11 compat (r1328846, et al)
* fix assertion during 'svn diff -r BASE:HEAD ^/trunk' (issue #4161)
* notify upon 'update' just removing locks on files (r1329876)
* neon: fix potential use of freed memory during commits (r1329388)
* 'status --xml' doesn't show repository deletes correctly (issue #4167)
* fix assert on svn:externals with drive letter on Windows (issue #4073)
* fix 'svn update --depth=empty' against 1.4 servers (issue #4046)
* handle missing svn:date reported by svnserve gracefully (r1306111)
* fix merges which first add a subtree and then delete it (issue #4166)
* fix a regression with checkout of file externals (issue #4087)
* don't add spurious mergeinfo to subtrees in edge-case merge (issue #4169)
* improve performance of status on large working copies (issue #4178)
- Server-side bugfixes:
* fix non-fatal FSFS corruption bug with concurrent commits (issue #4129)
* mod_dav_svn: raise an error on MERGE of non-existent resource (r1298343)
* mod_dav_svn: support compiling/running under httpd-2.4 (r1232267)
* mod_dav_svn: forbid BDB repositories under httpd's event MPM (issue #4157)
- Other tool improvements and bugfixes:
* emacs support: updates to dsvn.el and vc-svn.el (r1200896, et al)
Developer-visible changes:
- General:
* windows example distribution scripts: include svnrdump (r1295007)
* fix running the test suite with jsvn (r1335555)
- Bindings:
* swig-py tests: avoid FAILs on APR hash order (r1296137, r1292248)
* swig-rb tests: avoid FAILs on APR hash order (r1310535, r1310594)
* swig-pl: Improved perl detection in gen-make.py (r1291797, r1291810)
Version 1.7.4
(08 Mar 2012, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.4
User-visible changes:
* fix 'svn log --diff' for moved paths (r1210147, et al)
* fix ra_serf problem with reading directory entries via HTTPv2 (r1238121)
* prepend "sqlite:" to error messages from SQLite (r1245738, -817)
* fix randomly missing "Merged via" notifications in 'svn log -g' (r1293229)
* fix spurious conflict when merging deleted symbolic link (issue #4052)
* fix URL-to-WC copy of externals on Windows (issue #4123)
* improve an FSFS sanity-check error message (r1294470)
* fix regressions with symlinks pointing at externals (issue #4102)
* fix 'svn log --diff' output ordering issue on Windows (r1295671)
Developer-visible changes:
* don't build mod_dontdothat if not building with httpd (r1243976)
* fix the testsuite to avoid FAILs on APR hash order (r1230714, et al)
Version 1.7.3
(14 Feb 2012, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.3
General:
* ship mod_dontdothat with the standard release
User-visible changes:
* fix segfault on 'svn rm $ROOT_URL' (issue #4074)
* replace a couple of assertions in favor of errors (r1207858, -949)
* fix a server assert after being upgraded (r1210195)
* fix segfault on 'svn mkdir svn://localhost' (r1211483)
* make 'svnadmin recover' prune the rep cache (r1213331, et al)
* make svnmucc use values from --config-dir option
* update and clarify the merge help text (r1154121, et al)
* replace wc assertion with informative error (r1222521, -693)
* copy permissions correctly for FSFS dirs (r1229252)
* improve 'svn log --with-all-revprops' over ra-dav (issue #4082)
* fix segfault when remapping a file external (issue #4093)
* fix segfault caused by obstructing unversioned dir (r1229677)
* fix regression on first update of external dir with '-r' (issue #4053)
* fix various EOL-handling problems in 'svn patch' (issues #3814, #3991)
* fix segfault in 'svn revert' (r1229303)
* improve correctness of 'svn patch --dry-run' (r1231944, -5)
* enforce revisions given in 'svn:externals' (issue #4053)
* fix potential corruption on 32-bit FSFS with large files (r1230212)
* make 'svn status --xml' show new files (issue #4097)
* fix 'svn mergeinfo' correctness (issue #4050)
* return the correct status for non-present nodes (r1232202, -07, -21, -22)
* improve SASL error messages (r1236343, et al)
* improve server cert error code for ra_serf (r1232413)
* fix SVNParentPath listings for parent path symlinks (r1221767, -80)
* fix mod_dav_svn's handling of POST errors (issue #4086)
* log some mod_dav_svn errors, rather than ignoring them (r1237720, -9596)
* relax requirements for canonicalization in mod_dav_svn (r1236173)
* fix a rare source of FSFS corruption (r1240752)
* allow committing the result of some copy operations (issue #4059)
* prevent one-byte buffer overflow in base64 decoding (r1242337)
Developer-visible changes:
* JavaHL: Add missing notify action, fixing an exception (r1221793)
* fix swig-py memory leak (r1235264, -296, -302, -736)
* fix spurious test suite failure (r1220742, -50)
* allow running tests on UNC shares (r1225491)
* bindings: see platform-specific password providers (r1242660, -1)
* skip 'svnrdump dump' tests over ra_serf (r1242537)
* convert a few ra_serf assertions to errors (r1242607)
Version 1.7.2
(02 Dec 2011, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.2
User-visible changes:
* fix working copy corruption after interrupted update/switch (issue #4040)
* avoid segfaults against pre-1.5 servers (r1186928)
* improve configure error message if apr-util uses old or no bdb (r1186784)
* make 'svn patch' ignore '/dev/null' targets for compat with git (r1197998)
* fix 'svn patch' segfault on patch that skips and deletes files (r1199950)
* omit "Committed revision N." output from 'svn commit --quiet' (r1200837)
* fix authz denial when svnserve root is a repository (issue #4060)
* fix uninitialized memory read in client diff code (r1201002)
* avoid potential segfault during merges (r1202807)
* fix an assertion failure when a symlink is updated (r1186944, -81, -83)
* make working copy operations fail if nodes have no base checksum (r1202630)
* fix nested <Location>s when using v2 protocol (r1203546, -651, -653)
* make mod_dav_svn ignore non-Subversion POST requests (r1187695)
* avoid reading freed memory (r1204478)
* recognize empty (only byte order mark) UTF-8 files as text (issue #4064)
* fix 1.7 client regression when operating against a 1.0.x server (r1199876)
* remove empty parent dirs of removed externals on update (issue #4044)
* make 'svn diff -c N' work for files added in rN (issue #2873)
* plug a memory leak in the bdb backend (r1205726)
* fix 'svn import' with native eol-style and inconsistent EOLs (r1205193)
* fix reading beyond the end of a string in bdb backend (r1205839, -48)
* don't assert when committing an incomplete directory (issue #4042)
Developer-visible changes:
* JavaHL: allow 'status -u' to function properly (r1189190, -395)
* don't put '\r' characters in our generate sql headers (r1189580)
* properly define WIN64 on Windows x64 builds (r1188609)
* better adherence to C89 in enum definitions (r1189665)
* bump copyright year in Windows DLLs (r1189261)
* log a better error when opening rep-cache.db fails (r1204610, -73)
Version 1.7.1
(24 Oct 2011, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.1
User-visible changes:
* improve performance of 'svn info' (r1164386)
* improve hash table sorting performance (r1167659)
* update bash completion for 1.7 (r1177001)
* make 'svn ls' continue to work with 1.0-1.3 repos (r1154278, -379, -82)
* improve handling of error messages generated by Cyrus SASL (r1179767)
* update INSTALL documentation file (r1182115, and others)
* error instead of assert when upgrading corrupt WCs (r1182904, -9)
* improve memory usage in merge (r1176915)
* fix an invalid assertion in merge (r1149103, -35)
* improve performance of 'merge --reintegrate' in edge-case (r1167681)
* fixed: 'svn mergeinfo' shows wrong revisions for added nodes (issue #3791)
* make 'svn add --parents D/file' work if D is deleted (r1185222)
* improve performance of trivial text file merges (issue #4009)
* add FSFS sanity check to prevent corruption seen in the wild (r1178280)
* improve correctness/performance of recursive info and proplist (r1164426)
* fix memory leak in 'merge --reintegrate' (r1180154)
* fix handling of directories after 'update --set-depth=empty' (r1185911)
* fix 'checksum != NULL' assertions in some upgraded WCs (r1177732)
* fix upgrading of WCs containing authz-restricted dirs (r1185738)
* make the server tolerate svn:mergeinfo with malformed paths (r1182771)
* fix some erroneous warning messages from the svn client (r1185746)
* fix WC upgrade with replaced nodes in edge-case (issue #4033)
Developer-visible changes:
* fix object lifetime issues in the JavaHL bindings (r1175888)
* fix org.tigris JavaHL wrappers to avoid double finalize (r1179680)
* don't write to const memory (r1177492)
* improve zlib configuration (r1174761, -98, -806)
* improve SQLite runtime init for OS X 10.7 compat (r1181666)
* improve test suite correctness (r1174111)
* fix potential segfault seen by TSVN (r1183263)
* fix backward compat crashes in JavaHL (r1183054, -347)
* fill in repos_* fields of svn_wc_status3_t for repos-only nodes (r1181609)
* disable the SQLite shared process cache (r1185242, r1185280)
Version 1.7.0
(11 Oct 2011, from /branches/1.7.x)
http://svn.apache.org/repos/asf/subversion/tags/1.7.0
See the 1.7 release notes for a more verbose overview of the changes since
the 1.6 release: http://subversion.apache.org/docs/release-notes/1.7.html
User-visible changes:
- General:
* No longer including contrib/ in the release tarballs (r877798)
- Major new features:
* Less verbose HTTP-based repository access protocol (issue #1161, #3371)
* Rewritten working copy metadata storage (issue #3357)
* New 'svn patch' subcommand (issue #511)
* Rewritten FSFS in-memory caching for better performance
* New remote repository dump/load client 'svnrdump'
- Minor new features and improvements:
* Better handling of HTTP redirects (issue #2779)
* Improved and much more consistent path handling (issue #2028, and others)
* 'svnadmin load' rewrites changed revnums in mergeinfo (issue #3020)
* Error message and help text improvements
* 'svn log' can print unidiff of changes made in a revision (issue #2909)
* 'svn diff' can print git-style unidiff annotations
* svnsync can now steal locks on a mirror repository (issue #3309)
* display the wc root in the output of 'svn info' (issue #3355)
* add 'svnlook filesize' (issue #3509)
* add 'svn upgrade' command for upgrading working copies (r877675)
* add 'svnsync --disable-locking' (issue #3545)
* subtree merges don't unconditionally stop reintegrate merge (issue #3577)
* 'svn relocate' replaces 'svn switch --relocate' (r1026475)
* 'svn relocate' updates relative externals (issue #3597)
* allow svnsync users to specify the source repo (issue #3637)
* remove redundant mergeinfo notifications for 2-URL merges (issue #3671)
* 'svn export' into the current directory (issue #3727)
* added '--parents' to 'svn update' (issue #3748)
* allow configurable connection timeout in ra_serf (r876161)
* add digest authentication in ra_serf (r876405)
* add extensive caching support to servers (r1067669, -75, -72302)
* add configurable caching to svnadmin (r1078357)
* make server-side network data compression rate configurable (r1072288)
* added support for auto-detecting mime-types with libmagic (r1131120)
* 'svn rm url1 url2 url3' uses single txn per repo (issue #1199)
* don't leave unversioned files when reverting copies (issue #3101)
- Client-side bugfixes:
* 'svn cp A B; svn mv B C' is equivalent to 'svn cp A C' (issue #756)
* revert fetches missing directories from the server (issue #1040)
* allow subdirs of moved dirs to be moved and committed (issue #1259)
* improved performance of 'svn mv' with whole directories (issue #1284)
* 'svn rm B; svn cp A B' now works (issue #1516)
* 'svn diff URL1 URL2' now reverse of 'svn diff URL2 URL1' (issue #2333)
* error if relocating to an unused URL (issue #2531)
* 'svn blame -rWORKING' is now supported (issue #2544)
* improve correctness of commit on a relocated wc over ra_dav (issue #2578)
* add early error to 'svn add --auto-props' with mixed eols (issue #2713)
* allow 'svn diff' to accept symlinks as targets (issue #2716)
* don't lose props for replaced items (issue #2743)
* handle mergeinfo for subtrees removed outside of svn (issue #2915)
* add ability to force 'svn diff' to use internal diff (issue #3701)
* correctly recover a schedule-for-delete rm'd outside of svn (issue #3106)
* don't create self-referential mergeinfo from own history (issue #3157)
* improve 'svn log -g' handling of bad mergeinfo source paths (issue #3270)
* better conflict stat printing (issue #3342, issue #3594)
* 'svn update' restores excluded files (issue #3544)
* allow reintegrate merges into WCs with missing subtrees (issue #3603)
* more gracefully error when given back cmdline input (issue #3620)
* update exit codes to reflect command failure (issue #3622)
* don't double-update file externals (issue #3665)
* improve output of multi-target update (issue #3693, #3746)
* make 'svn up --set-depth=exclude FILE' work (issue #3736)
* return correct error code for 'svn cat' on nonexisting file (issue #3713)
* support svn:externals on locally added directories (issue #2267)
* use installed GSSAPI lib for Kerberos in ra_serf (r877381)
* allow 'svn info' to run on an excluded item (issue #3792)
* improve 'log -g' output with reverse merges (issue #3176)
* don't print error message if stdout is a pipe and is closed (issue #3014)
* removed special copy-handling during updates added in 1.5.0 (issue #3711)
* fix warning about copies committed with non-infinity depth (issue #3752)
* can now commit multiple wc paths lacking a common parent (issue #2381)
* 'svn export --depth $WC' now works correctly (issue #3800)
* added support for case-only renames on Windows (issue #3702)
* 'svn delete --force' removes tree conflicts (issue #3805)
* don't throw an error when skipping tree conflicts in update (issue #3329)
* don't break commits of wc->wc copies with file externals (issue #3589)
* allow 'svn info' to work on symlinks to working copies (issue #2305)
* allow 'svn st --show-updates' to work across symlinks (issue #3117)
* 'svn revert' shouldn't loop on symlinks (issue #3972)
* fixed: wc-to-wc copy of a switch source (issue #1802)
* fixed: 'svn st' reports symlinks as obstructed items (issue #2284)
* fixed: 'cd e:\; svn up e:\' fails (issue #2556)
* fixed: svn aborts on commiting from root dir on windows (issue #3346)
* fixed: removing a dir scheduled for deletion corrupts wc (issue #2741)
* fixed: 'svn cleanup' fails on obstructed paths (issue #2867)
* fixed: case-only renames resulting from merges don't work (issue #3115)
* fixed: 'svn mergeinfo' ignores peg rev for wc target (issue #3180)
* fixed: unable to merge to wc of deleted branch (issue #3221)
* fixed: move via merge leaves behind versioned move source (issue #3324)
* fixed: ra_serf does not honor http-proxy-exceptions (issue #3428)
* fixed: 'svn mv A B; svn mv B A' loses history (issue #3429)
* fixed: ra_serf doesn't support http-auth-types config (issue #3435)
* fixed: merge sets incorrect mergeinfo on skipped paths (issue #3440)
* fixed: ra_serf inconsistent handling of cached authn creds (issue #3450)
* fixed: ra_serf sefault with using NTLM or Negotiate auth (r876910)
* fixed: excluded subtrees are not detected by svnversion (issue #3461)
* fixed: submitting a changelist while obstructed item exists (issue #3484)
* fixed: crash when changing an external's URL (issue #3530)
* fixed: target moved after branching breaks reintegrate (issue #3640)
* fixed: potential race condition in svnsync (issue #3546)
* fixed: spurious merge conflicts with pre-1.7 mod_dav_svn (issue #3657)
* fixed: repeat merge is not a no-op (issue #3564)
* fixed: inheritance results in self-referential mergeinfo (issue #3668)
* fixed: inheritance results in nonexistent mergeinfo sources (issue #3669)
* fixed: memory leaks in ra_serf (issue #3684)
* fixed: corruption of 'svn pg' output for large properties (issue #3721)
* fixed: 'svnsync copy-revprops' doesn't sync revprop dels (issue #3728)
* fixed: executable flag not correctly set on merge (issue #3686)
* fixed: 'svn rm' fails on multiple URLs with encoded spaces (issue #3839)
* fixed: children of replaced dirs cannot be deleted (issue #3468)
* fixed: executable flag of binary file lost during merge (issue #3686)
* fixed: merging a symlink-turned-regular-file breaks the wc (issue #2530)
* fixed: can't remove file externals (issue #3351)
* fixed: 'svn unlock' attempts to unlock wrong token on DAV (issue #3794)
* fixed: forced DAV 'svn unlock' results in 403, not warning (issue #3801)
* fixed: rm -> ci -> cp = missing directory (issue #2763)
* fixed: 'svn info' returns parent info on missing dirs (issue #3178)
* fixed: spurious prop conflict with 'merge --reintegrate' (issue #3919)
* fixed: 'svn --version' fails with non-existent $HOME (issue #3947)
* fixed: unforced export silently overwites existing file (issue #3799)
* fixed: reverse merge which adds subtree mergeinfo fails (issue #3978)
* fixed: 'svn up -r{R>HEAD}' hangs client over ra_svn (issue #3963)
* fixed: 'svn up' updates file externals in target siblings (issue #3819)
* many other minor bugfixes, optimizations, plugs of memory leaks, etc
- Server-side bugfixes:
* mod_dav_svn is less strict about auto-merging for commits (issue #1704)
* allow SVNListParentPath to be used with authz (issue #2753)
* allow nav to repo list from repo top with SVNListParentPath (issue #3159)
* allow repositories in the root of a drive on windows (issue #3535)
* don't destroy mergeinfo with 'svnadmin load --parent-dir' (issue #3547)
* fixed: 'svnadmin hotcopy' does not duplicate symlinks (issue #2591)
* fixed: post-revprop-change errors cancel commit (issue #2990)
* fixed: mod_dav_svn runs pre-revprop-change hook twice (issue #3085)
* fixed: mod_dav_svn doesn't return stderr to user on failure (issue #3112)
* fixed: hotcopy may corrupt target rep-cache.db (issue #3596)
* fixed: mod_dav_svn can cause spurious merge conflicts (issue #3657)
* fixed: DAV can overwrite directories during copy (issue #3314)
* fixed: 'svn log' returns log of unrelated path (issue #3931)
* match paths against authz rules in case sensitive way (issue #3781)
* svnserve can now force usernames to upper/lower case (issue #3726)
* reduce duplicate log messages in 'log -g' (issue #3650)
* svnserve: don't crash on shutdown with SASL in inetd mode (issue #3664)
* disallow arbitrary HTTP headers from committers (issue #2872)
* limit FSFS memory consumption (issue #3478, #3593)
* many other minor bugfixes too numerous to list here
- Other tool improvements and bugfixes:
* svnsync now takes the '--config-option' argument (issue #2027)
* svnsync can translate non-UTF-8 properties to UTF-8 (issue #3817)
* svnadmin now errors on non-UTF-8 revision properties (issue #3755)
* svnadmin verify now errors on non-UTF-8 paths (r1129641)
Developer-visible changes:
- General:
* improved output of 'make check'
* introduce scratch_pool/result_pool parameter paradigm
* improved error tracing (r877208, -736)
* improve building with sqlite on Windows (issue #3364)
* allow mod_dav_svn to compile against Apache 2.4 (issue #3548)
* support running tests against older servers (r876016)
* notification of unversioned obstructions (r877344)
* removed virtually all abort() calls (issue #2780)
* don't include client-specific suggestions in error msgs (issue #3887)
- API changes:
* don't crash svn_client_copy if ctx->log_msg_func is NULL (issue #3234)
* much improved ra_serf error handling (issue #3375)
* provide clients with old and new revision on update (r876515)
* close both files, even on error in svn_stream_copy3() (r887262)
* added 'work-in-progress' XFail test status (r876549)
* notifications sent when mergeinfo changes (r877588)
* add information on text and property mods in log APIs (r877688)
* fixed: svn_ra_local__get_file() leaks file descriptors (issue #3290)
* svn_ra_neon__get_dir() returns correct dir set for URLs (issue #3093)
* swig-py: always set ChangedPath.path (also for deletes) (issue #2630)
* improve conflict resolver API for a specific direction (issue #3049)
- Bindings:
* New JavaHL package: org.apache.subversion
* Deprecate the SVNClientSynchronized class in JavaHL (issue #2755)
* fixed setting binary properties in JavaHL (issue #3770)
* fix type mapping of svn_txdelta_window_t in python bindings (issue #3688)
Version 1.6.23
(30 May 2013, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.23
User-visible changes
- Server-side bugfixes:
* fix FSFS repository corruption due to newline in filename (issue #4340)
* fix svnserve exiting when a client connection is aborted (r1482759)
See CVE-2013-2112, and descriptive advisory at
http://subversion.apache.org/security/CVE-2013-2112-advisory.txt
- Other tool improvements and bugfixes:
* fix argument processing in contrib hook scripts (r1485350)
Version 1.6.22
(Not released, see changes for 1.6.23.)
Version 1.6.21
(04 Apr 2013, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.21
User-visible changes
- Server-side bugfixes:
* mod_dav_svn will omit some property values for activity urls (r1453780)
* improve memory usage when committing properties in mod_dav_svn (r1443929)
* fix mod_dav_svn runs pre-revprop-change twice (issue #3085)
* fixed: post-revprop-change errors cancel commit (issue #2990)
* improved logic in mod_dav_svn's implementation of lock. (r1455352)
Developer-visible changes:
- General:
* fix a compatibility issue with g++ 4.7 (r1345740)
Version 1.6.20
(04 Jan 2013, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.20
User-visible changes
- Client- and server-side bugfixes:
* Fix typos in pt_BR, es and zh_TW translations (r1402417)
- Server-side bugfixes:
* add Vary: header to GET responses to improve cacheability (r1390653)
* fix fs_fs to cleanup after failed rep transmission (r1403964, et al)
* fix an assert with SVNAutoVersioning in mod_dav_svn (issue #4231)
Version 1.6.19
(10 Sep 2012, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.19
- Client-side bugfixes:
* handle missing svn:date reported by svnserve gracefully (r1306111)
- Server-side bugfixes:
* fix possible server hang if a hook script fails to start (r1330410)
* fix write-through proxy commit regression introduced in 1.6.17 (r1088602)
* partial sync drops properties when converting to adds (issue #4184)
- Developer-visible changes:
* fix the testsuite to avoid FAILs on APR hash order (r1230714, et al)
Version 1.6.18
(29 Mar 2012, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.18
User-visible changes:
* reject invalid svn:mergeinfo at commit time over DAV (issue #3953)
* fix reintegrate merge regression introduced in 1.6.13 (issue #3957)
* make the stderr output of the post-commit hook XML-safe (r893478)
* fix a rare source of FSFS corruption (r1240752)
* plug a memory leak in the bdb backend (r1205726)
* server-side performance fix for "log -g" (r1152282)
* fix description of svndumpfilter's --targets option (r1151911)
* fix datastream corruption during resumed transfer in ra_serf (r1154733)
* fix a crash in ra_svn SASL authentication (r1166555, -678)
* fix potential corruption on 32-bit FSFS with large files (r1230212)
* make website links point to subversion.apache.org (r896893, -901, r915036)
* fix non-fatal FSFS corruption bug with concurrent commits (issue #4129)
Developer-visible changes:
* fix sqlite distfile retrieval in get-deps.sh (r1134734)
* fix swig-py memory leak (r1235264, -296, -302, -736)
* allow passing --with-jdk to gen-make.py on Windows (r966167)
Version 1.6.17
(01 Jun 2011, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.17
User-visible changes:
* improve checkout speed on Windows (issue #3719)
* make 'blame -g' more efficient with large mergeinfo (r1094692)
* avoid some invalid handle exceptions on Windows (r1095654)
* preserve log message with a non-zero editor exit (r1072084)
* fix FSFS cache performance on 64-bit platforms (r1103665)
* make svn cleanup tolerate obstructed directories (r1091881)
* fix deadlock in multithreaded servers serving FSFS repositories (r1104093)
* detect very occasional corruption and abort commit (issue #3845)
* fixed: file externals cause non-inheritable mergeinfo (issue #3843)
* fixed: file externals cause mixed-revision working copies (issue #3816)
* fix crash in mod_dav_svn with GETs of baselined resources (r1104126)
See CVE-2011-1752, and descriptive advisory at
http://subversion.apache.org/security/CVE-2011-1752-advisory.txt
* fixed: write-through proxy could directly commit to slave (r917523)
* detect a particular corruption condition in FSFS (r1100213)
* improve error message when clients refer to unknown revisions (r939000)
* bugfixes and optimizations to the DAV mirroring code (r878607)
* fixed: locked and deleted file causes tree conflict (issue #3525)
* fixed: update touches locked file with svn:keywords property (issue #3471)
* fix svnsync handling of directory copyfrom (issue #3641)
* fix 'log -g' excessive duplicate output (issue #3650)
* fix svnsync copyfrom handling bug with BDB (r1036429)
* server-side validation of svn:mergeinfo syntax during commit (issue #3895)
* fix remotely triggerable mod_dav_svn DoS (r1130303)
See CVE-2011-1783, and descriptive advisory at
http://subversion.apache.org/security/CVE-2011-1783-advisory.txt
* fix potential leak of authz-protected file contents (r1130303)
See CVE-2011-1921, and descriptive advisory at
http://subversion.apache.org/security/CVE-2011-1921-advisory.txt
Developer-visible changes:
* fix reporting FS-level post-commit processing errors (r1104098)
* fix JVM recognition on OS X Snow Leopard (10.6) (r1028084)
* allow building on Windows with recent Expat (r1074572)
Version 1.6.16
(02 Mar 2011, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.16
User-visible changes:
* more improvement to the 'blame -g' memory leak from 1.6.15 (r1041438)
* avoid a crash in mod_dav_svn when using locks (r1071239, -307)
See CVE-2011-0715, and descriptive advisory at
http://subversion.apache.org/security/CVE-2011-0715-advisory.txt
* avoid unnecessary globbing for performance (r1068988)
* don't add tree conflicts when one already exists (issue #3486)
* fix potential crash when requesting mergeinfo (r902467)
* don't attempt to resolve prop conflicts in 'merge --dry-run' (r880146)
* more fixes for issue #3270.
Developer-visible changes:
* ensure report_info_t is properly initialized by ra_serf (r1058722)
* locate errors properly on a malfunction (r1053208)
* fix output param timing of svn_fs_commit_txn() on fsfs (r1051751)
* for svn_fs_commit_txn(), set invalid rev on failed commit (r1051632, -8)
* fix sporadic Ruby bindings test failures (r1038792)
* fix JavaHL JVM object leak when dumping large revisions (r947006)
* use Perl to resolve symlinks when building swig-pl (r1039040)
* allow Perl bindings to build within a symlinked working copy (r1036534)
* don't overwrite the LD_LIBRARY_PATH during make check-swig-pl (r946355)
* improve unit tests for some fs functions (r1051744, -5, -3185, -241)
Version 1.6.15
(26 Nov 2010, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.15
User-visible changes:
* hide unreadable dirs in mod_dav_svn's GET response (r996884)
* make 'svnmucc propsetf' actually work (r1005446)
* limit memory fragmentation in svnserve (r1022675)
* fix 'svn export' regression from 1.6.13 (r1032970)
* fix 'svn export' mistakenly uri-encodes paths (issue #3745)
* fix server-side memory leaks triggered by 'blame -g' (r1032808)
This has been tracked as CVE-2010-4644
* prevent crash in mod_dav_svn when using SVNParentPath (r1033166)
This has been tracked as CVE-2010-4539
* allow 'log -g' to continue in the face of invalid mergeinfo (issue #3270)
* filter unreadable paths for 'svn ls' and 'svn co' (r997026, -070, -474)
* fix abort in 'svn blame -g' (issue #3666)
* fix file handle leak in ruby bindings (issue #3512)
* remove check for 1.7-style working copies (issue #3729)
Developer-visible changes:
* improve some swig parameter mapping (r984565, r1035745)
* improve test accuracy over dav (r991534, r877814)
* create fails.log for test runs (r964349)
* improve detection of 'svnversion' when building (r877219, et al)
* don't violate API layering in dumpstream logic (issue #3733)
* don't report working copy installs as switched (r1033921)
Version 1.6.14
(Not released, see changes for 1.6.15.)
Version 1.6.13
(01 Oct 2010, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.13
User-visible changes:
* don't drop properties during foreign-repo merges (issue #3623)
* improve auto-props failure error message (r961970)
* improve error message for 403 status with ra_neon (r876615)
* don't allow 'merge --reintegrate' for 2-url merges (r959004)
* improve handling of missing fsfs.conf during hotcopy (r980811, -1449)
* escape unsafe characters in a URL during export (issue #3683)
* don't leak stale locks in FSFS (r959760)
* better detect broken working copies during update over ra_neon (r979045)
* fsfs: make rev files read-only (r981921)
* properly canonicalize a URL (r984928, -31)
* fix wc corruption with 'commit --depth=empty' (issue #3700)
* permissions fixes when doing reintegrate merges (related to issue #3242)
* fix mergeinfo miscalculation during 2-url merges (issue #3648)
* fix error transmission problems in svnserve (r997457, -66)
* fixed: record-only merges create self-referential mergeinfo (issue #3646)
* fixed: 'SVNPathAuthz short_circuit' unsolicited read access (issue #3695)
See CVE-2010-3315, and descriptive advisory at
http://subversion.apache.org/security/CVE-2010-3315-advisory.txt
* make 'svnmucc propset' handle existing and non-existing URLs (r1000607)
* add new 'propsetf' subcommand to svnmucc (r1000612)
* warn about copied dirs during 'svn ci' with limited depth (r1002094)
Developer-visible changes:
* make ruby bindings compatible with Ruby 1.9 (r957507)
* use the repos verify API in JavaHL (r948916)
* teach ra_serf to parse md5 checksums with update editors (r979429)
* let ra_serf work with current serf releases (r879757, r880320, r943796)
Version 1.6.12
(21 Jun 2010, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.12
User-visible changes:
* further improvements for issue #3242
* allow deletion of uris which need character escaping (issue #3636)
* fix errors with 'svn mkdir --parents' (issue #3649)
* update address to which crash reports are sent (r901304)
* check for server certificate revocation on Windows (r898048)
* disable custom file mutexes on Windows (r879902, -16)
* fix handling of peg revision'd copy targets (issue #3651)
* more improvements to 'svn merge --reintegrate' (r935631)
* allow copying of broken symlinks (issue #3303)
* improve rep-sharing performance on high-concurrency repos (issue #3506)
* fixed: added subtrees with mergeinfo break reintegrate (issue #3654)
* fixed: assertion triggered by tree-conflicted externals (issue #3469)
Developer-visible changes:
* give windows devs more flexibility with sqlite versions (r944635)
* allow the pack tests to work with low file descriptor limits (r937610)
* improve exception handling on Windows Vista and 7 (r878447, -910, -916)
Version 1.6.11
(19 Apr 2010, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.11
User-visible changes:
* fix for repositories mounted via NFS (issue #3501)
* enable TCP keep-alives in svnserve (r880552)
* tighten restrictions on revprops for 'svnadmin verify' (r904594)
* make ra_serf give better out-of-date information (issue #3561)
* improve error message upon connection failure with svn+ssh:// (r922516)
* allow 'svn log' on an uncommitted copy/move destination (r901752)
* make 'svnadmin hotcopy' copy the fsfs config file (r905303)
* mergeinfo improvements with non-inheritable mergeinfo (issue #3573)
* make mergeinfo queries not require access to the repo root (issue #3242)
* update URLs to refer the new apache.org repository (r904301, -94)
* update relative externals during a switch (issue #3390)
* fix 'merge --reintegrate' with self-referential mergeinfo (r892050, -85)
* improve wc-ng working copy detection (r929382)
* improve handling of mergeinfo when using serf (r880461)
* fixed: 'svnlook plist --revprop' with '-t TXN_NAME' (r917640, -8211)
* fixed: file external from URL cannot overwrite existing item (issue #3552)
* fixed: potential memory error in 'svn status' (r923674, -9)
* fixed: merge records mergeinfo from natural history gaps (issue #3432)
* fixed: theoretical possibility of DB corruption (r926151, -67)
Developer-visible changes:
* disable checks for wc-ng working copies when running the test suite
* on Windows, don't ignore move operation error codes (r896915)
* more precise reporting of errors occuring with sqlite init (r927323, -8)
* ensure rangelist APIs are commutative (r923389, -91)
Version 1.6.10
(Not released, see changes for 1.6.11.)
Version 1.6.9
(25 Jan 2010, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.9
User-visible changes:
* allow multiple external updates over ra_svn (issue #3487)
* fix a segmentation fault when using FSFS (r881905)
* support Berkeley DB 4.8 (r879688)
* various autoprop improvements (r880274, -5)
* improve usage of svn+ssh:// on Windows (issue #2580)
* teach 1.6.x to recognize 1.7 working copies (1.6.x-future-proof branch)
* update help text for 'svn update' and 'svn switch' (r886164, -97)
* make 'svnadmin load --parent-dir' create valid mergeinfo (r888979, -9081)
* tolerate relative merge source paths in mergeinfo (r889840)
* teach mod_dav_svn to support the Label header (issue #3519)
* fixed: svnsync leaves stale sync-locks on mirrors (r884842)
* fix applicability of 'svn resolve --accept=theirs-conflict' (r880525, -6)
* fixed: segfault in 'svn resolve' (r896522, -47)
* fix commit failure against an out-of-date mirror (r900797)
Developer-visible changes:
* update ruby bindings test expectation (r880162)
* don't allow rangelist and mergeinfo API to modify input args (r879093)
Version 1.6.8
(Not released, see changes for 1.6.9.)
Version 1.6.7
(Not released, see changes for 1.6.9.)
[ Note: All revision numbers for versions prior to 1.6.7 reference the
original repository on svn.collab.net. For more information see:
http://svn.apache.org/repos/asf/subversion/README ]
Version 1.6.6
(22 Oct 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.6
User-visible changes:
* fix crash during 'svn update' (r39673)
* respect Apache's ServerSignature directive (r40008, -21, -31)
* don't add a file with mixed line endings, and then abort (issue #2713)
* support Neon 0.29.
* fix a crash in 'svn rm --force' (r37953)
* handle tree conflicts involving replacements (issue #3486)
* allow non-threadsafe sqlite if APR has no threads (r39301)
* print newline before plaintext SSL cert / password prompts (r38982, r39302)
* improve merge performance with implicit subtree mergeinfo (issue #3443)
* fix "libsvn_ra_svn/marshal.c assertion failed (opt || cstr)" (issue #3485)
* make file externals work for binary files (issue #3368)
* perform MIME type matching case-insensitively (issue #3479)
* do not treat non-existent revisions as HEAD in 'svn export' (issue #3400)
* revert r36720's default MIME type change back to "text/plain" (issue #3508)
* improve "tree conflict already exists" error message (r38872)
* fix failure to commit replacement of a directory (issue #3281)
* fix mod_dav_svn parent dir links to preserve peg revisions (issue #3425)
Developer-visible changes:
* fix 2 failing tests in ruby bindings (r38886)
* do not require GNU grep for build (issue #3453)
* use '$SED' instead of 'sed' in build scripts (issue #3458)
* add svn.client.{log5,merge_peg3} to python bindings (r39635, -6, -7)
* include the time of a test run in tests.log (r39887)
Version 1.6.5
(22 Aug 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.5
User-visible changes:
* fix mod_dav_svn directory view links to preserve peg revisions (r38021)
* do not error on Windows when ALLUSERPROFILE dir nonexistent (r38053, -5, -7)
* properly escape lock comments over ra_neon (r38101, -2)
* allow syncing copies of '/' over ra_neon and ra_serf (issue #3438)
* make 'svnlook diff' show empty added or deleted files (r38458)
* fix building with Apache 2.4 (r36720)
* fix possible data loss on ext4 and GPFS filesystems (issue #3442)
* resolve symlinks when checking for ~/.subversion (r36023)
* don't let svn+ssh SIGKILL ssh processes (issue #2580)
* allow PLAIN and LOGIN mechanisms with SASL in svnserve (r38205)
* fix peg revision parsing in filenames like 'dir/@file.txt' (issue #3416)
* fix detection of Apache <2.0.56 (r38290, -3, -4)
* don't pretend to do tree conflict resolution (r38799, -801, -805)
* fix data corruption when syncing from svnserve to mod_dav_svn (r38686, -7)
* fix GNOME Keyring with '--non-interactive' option (r38222, -3, -61, -410)
* fixed: false "File '...' already exists" error during commit (issue #3119)
Developer-visible changes:
* avoid referencing uninitialized variables (r38388)
* plug a couple of error leaks (r38572)
* improve windows test output (r38616, -7, -9, -49)
Version 1.6.4
(06 Aug 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.4
User-visible changes:
* fixed: heap overflow vulnerability on server and client
See CVE-2009-2411, and descriptive advisory at
http://subversion.apache.org/security/CVE-2009-2411-advisory.txt
Version 1.6.3
(22 Jun 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.3
User-visible changes:
* fix segfault in WC->URL copy (r37646, -56)
* let 'svnadmin load' tolerate mergeinfo with "\r\n" (r37768)
* make svnsync normalize svn:* props to LF line endings (issue #3404)
* better integration with external merge tools (r36178)
* return a friendly error message for 'svn diff' (r37735)
* update dsvn.el for 1.6 (r37774)
* don't allow setting of props on out-of-date dirs under neon (r37745)
* improve BASH completion (r36450, -52, -70, -79, -538)
* always show tree conflicts with 'svn st' (issue #3382)
* improve correctness of 'svn mergeinfo' (issue #3126)
* decrease the amount of memory needed for large commits (r37894, -6)
* work around an APR buffer overflow seen by svnsync (r37622)
* ra_svn clients now use TCP keep-alives if available (issue #3347)
* improve 'svn merge' perf by reducing server contact (r37491, -593, -618)
* stop propagating self-referential mergeinfo in reintegrate merges (r37931)
* fix NLS detection where -liconv is required for bindtextdomain() (r37827)
* don't delete unversioned files with 'rm --keep-local' (r38015, -17, -19)
* bump apr and apr-util versions included in deps to latest. (r37941)
* avoid temp file name collisions with ra_serf, ra_neon (r37972)
* fixed: potential segfault with noop file merges (r37779)
* fixed: incorrect output with 'svn blame -g' (r37719, -23, -41)
* fixed: bindings don't load FS libs when module search enabled (issue #3413)
* fixed: DAV RA layers not properly handling update/switch working copy
directory to revision/place in which it doesn't exist (issue #3414)
* fixed: potential abort() in the working copy library (r37857)
* fixed: memory leak in hash reading functions (r37868, -979)
Developer-visible changes:
* improve memory usage in file-to-stringbuf APIs (r37907)
* reduce memory usage for temp string manipulation (r38010)
Version 1.6.2
(11 May 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.2
User-visible changes:
* vastly improve memory usage with 'svn merge' (issue #3393)
* make default depth for merge 'infinity' (r37156)
* make 'status --quiet' show tree conflicts (issue #3396)
* allow '--set-depth infinity' to expand shallow subtrees (r37169)
* return an error if attempting to reintegrate from/to the repo root (r37385)
* don't store bogus mergeinfo for '--ignore-ancestry', foreign merges (r37333)
* don't allow merge of difference between two repos (r37519)
* avoid potential segfault with subtree mergeinfo (r36613, -15, -31, -41)
* recommend sqlite 3.6.13 (r37245)
* avoid unnecessary server query for implicit mergeinfo (r36509)
* avoid unnecessary server query during reverse merges (r36527)
* set depth=infinity on 'svn add' items with restricted depth (r37607)
* fixed: commit log message template missing paths (issue #3399)
* fixed: segfault on merge with servers < 1.6 (r37363, -67, -68, -79)
* fixed: repeat merge failures with non-inheritable mergeinfo (issue #3392)
* fixed: another memory leak when performing mergeinfo-aware merges (r37398)
* fixed: incorrect mergeinfo on children of shallow merges (issue #3407)
* fixed: pool lifetime issues in the BDB backend (r37137)
Developer-visible changes:
* don't fail if an embedding app has already initialized SQLite (issue #3387)
* resolve naming collisions with static stat() function in svnserve (r37527)
* fix an expectation for a failing dirent windows test (r37121)
Version 1.6.1
(9 Apr 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.1
User-visible changes:
* recommend Neon 0.28.4. (r36388)
* improve performance of 'svn merge --ignore-ancestry' (r36256)
* improve 'svn merge' performance with subtree mergeinfo (r36444)
* correctly proxy LOCK and UNLOCK requests (r36159)
* prevent a crash when updating old working copies (r36751)
* don't let svnmerge.py delete a nonexistent property (r36086, -767, -769)
* don't fail when upgrading pre-1.2 repositories (r36851, -7)
* allow escaping of separator characters in autoprops (r36763, -84)
* improve tempfile creation robustness on Windows (r36442, -3)
* fix change-svn-wc-format.py for 1.6.x working copies (r36874, -5)
* improve configure's detection of Berkeley DB (r36741, -2)
* don't allow foreign merges to add foreign mergeinfo (issue #3383)
* improve performance of 'svn update' on large files (r36389, et. al.)
* fixed: error leak and potential crash (r36860)
* fixed: parent directory handling on Windows (r36049, -50, -51, -131)
* fixed: uninitialized memory errors (r36252, -3)
* fixed: potential working copy corruption (r36714)
* fixed: working copy upgrade error (r36302)
* fixed: pointer dereference error (r36783)
* fixed: error diff'ing large data with ignored whitespace (r36816)
* fixed: potential hang in ra_serf (r36913)
* fixed: problem with merge and non-inheritable mergeinfo (r36879)
* fixed: repeated merging of conflicted properties fails (issue #3250)
* fixed: excluding an absent directory segfaults (issue #3391)
Developer-visible changes:
* ensure svn_subst_translate_cstring2() properly flushes data (r36747)
* make serf report a base checksum to apply_textdelta (r36890)
* syntax updates for strict C89 compilers (r36799)
* update RPM scripts for RHEL4 (r36834)
* allow tests to be run with Python 2.6.1 on Windows (r36149, -50, -51, -56)
* allow building JavaHL with Visual Studio 2008 (r36954)
* stop setting default translation domain in JavaHL (r36955)
* fixed: warning with Python 2.6 and ctypes bindings (r36559)
* fixed: undefined references to svn_fs_path_change2_create() (r36823)
Version 1.6.0
(20 Mar 2009, from /branches/1.6.x)
http://svn.apache.org/repos/asf/subversion/tags/1.6.0
User-visible changes:
- General:
* Now require Windows 2000 or newer on Windows (r33170)
- Major new features:
* identical files share storage space in repository (issue #2286)
* file-externals support for intra-repository files (issue #937)
* "tree" conflicts now handled more gracefully (issue #2282, #2908)
* repository root relative URL support on most commands (issue #3193)
- Minor new features and improvements:
* pre-lock hook can now specify lock tokens via stdout (r32778)
* svnmucc: support '--with-revprop' (r29492)
* merge: log include-descendants in operational log (r30426, r30428)
* improved operational logging for 'svn switch' (r30517)
* new 'Header' keyword, similar to 'Id' but with full URL (r35386)
* warn/disallow when storing plain-text passwords (r31046)
* support KWallet and GNOME keyring for password storage (r31241, -337)
* client now caches SSL client cert passphrases (issue #2489)
* add '--prefix-file' option to 'svndumpfilter' (issue #2697)
* add '--ignore-externals' option to 'svn cp' (issue #3365)
* add '--with-no-revprops' to 'svn log' (issue #3286)
* new 'svnadmin pack' command to compress FSFS filesystems
* new SVNAllowBulkUpdates mod_dav_svn directive (issue #3121)
* new public mod_dav_svn URI syntax: path?[p=PEG][&r=REV] (r34076)
* new 'svnsync info' command to show synchronization information (r35053)
* conflict resolver supports display-conflict, mine-conflict and theirs-conflict
- Client-side bugfixes:
* faulty reflexive merges (issue #2897)
* buffer overflow on a 0 byte string buffer (r35968, -74)
* conflict resolver needed more useful 'diff' option (issue #3048)
* disable username assumption (issue #2324)
* more accurate usage message for 'svn log' (r30449)
* do not repeat merge if target has explicit mergeinfo (issue #2821)
* corruption when filtering self-referential mergeinfo (r30467)
* filter empty mergeinfo with self-referential mergeinfo (r30510)
* pay attention to partial replay from the server in svnsync (r30440)
* improved property name handling in svnsync (r30480)
* properly recognize the file:/// in repository with svnsync (r30482)
* svn+ssh SIGKILLs ssh processes (issue #2580)
* 'svn up'/'svn co' early abort with svn:externals (issue #3148)
* improve tempfile names for conflict resolver (issue #3166)
* ra_serf: 'svn merge' aborts (issue #3212)
* 'svn cleanup' failed on non-ASCII characters (issue #3313)
* 'svn update' fails on moved, modified file with local mods (issue #3354)
* easier use of NTLM for proxy with ra_neon (r29874)
* 2-url merge from DAV-accessed foreign repo makes bad wcprops (issue #3118)
* can't add .svn (and children) to your wc via '--parents' (r35819)
* improved performance removing unversioned directories (r36111)
* 'svn cp --parents' had path URL encoding issues (issue #3374)
* support shell quoting rules in externals definitions (issue #2461)
* new SVN_LOCALE_DIR environment variable for localization (issue #2879)
* scheme and domain name in urls handled case insensitive (issue #2475)
* merge: pick default revisions with peg revision in single url (r30455)
* many other minor bugfixes, optimizations, plugs of memory leaks, etc
- Server-side bugfixes:
* mod_dav_svn runs pre-revprop-change twice (issue #3085)
* mod_dav_svn ignores pre-revprop-change failure on delete (issue #3086)
* mod_dav_svn prevented lock breaks from being propagated to client (r29914)
* non-UTF8 filenames could enter repository (issue #2748)
* 'svnlook proplist' xml output (issue #2809)
* don't let mod_dav_svn hide errors from client (issue #3102)
* ra_serf failure during update (issue #3113)
* ra_serf comply with RFC 2617 in handling authentication headers (r35981)
* use both SHA1 and MD5 in the FS backends (r34388)
* many other minor bugfixes too numerous to list here
- Contributed tools improvements and bugfixes:
* commit-email.pl: Deprecated; use mailer.py instead (r31755, -67)
* svnmerge.py migration tool munged svn:mergeinfo ordering (issue #3302)
* And other random sundry stuff
Developer-visible changes:
- General:
* serf 0.3.0 required, when building with serf (r35586)
* require SQLite 3.4.0 or newer (r33520)
* allow the use of an in-tree SQLite amalgamation (r35263)
* svn_log_changed_path_t now includes a 'kind' field (issue #1967)
* BDB `changes' table inconsistency when APIs are misused (issue #3349)
* configure should prefer apr-1 over apr-0 if both are present (issue #2671)
* make 'Not Found' errors consistent between RA layers (issue #3137)
* fix a potential buffer overrun (r34374)
* many bug fixes and improvements to the test suite
- API changes:
* notification system for properties and revision properties (issue #783)
* make ra_svn's merge commit-revprops public (r30462, r30453)
* mod_dav_svn operational logging compatible with svnserve logging (r30518)
* improve speed of svn_client__get_copy_source() (issue #3356)
* if fsfs commit fails return SVN_INVALID_REVNUM (r35950)
- Bindings:
* new: ctypes python bindings
* many improvements to all bindings (Java, Perl, Python, and Ruby)
* respect CFLAGS in SWIG bindings (r35879)
* fix building Ruby bindings with Ruby 1.9 (r35852, r35883)
Version 1.5.9
(06 Dec 2010, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.9
User-visible changes:
* fix proxying of LOCK and UNLOCK requests with WebDAV proxies (r36159)
* improve performance of --ignore-ancestry merges (r36256)
* avoid crash with when using subtree mergeinfo (r36613, -13, -31, -41)
* improve merge correctness with non-inheritable mergeinfo (r36789)
* fixed: repeated mergeinfo of conflicting properties fails (issue #3250)
* fix segfault in wc->URL copy (r37646, -56)
* make 'svn up --set-depth infinity' expand shallow subtrees (r37169)
* resolve symlinks when checking for ~/.subversion (r36023)
* make default depth of 'svn merge' infinity (r37156)
* don't allow foreign merges to add foreign mergeinfo (issue #3383)
* error if attempting to reintegrate to/from the repo root (r37385)
* let 'svnadmin load' tolerate mergeinfo with "\r\n" (r37768)
* improve memory performance in 'svn merge' (issue #3393)
* fixed: 'SVNPathAuthz short_circuit' unsolicited read access (issue #3695)
See CVE-2010-3315, and descriptive advisory at
http://subversion.apache.org/security/CVE-2010-3315-advisory.txt
* prevent crash in mod_dav_svn when using SVNParentPath (r1033166)
* limit memory fragmentation in svnserve (r1022675)
* fix server-side memory leaks triggered by 'blame -g' (r1032808)
* perform MIME type matching case-insensitively (issue #3479)
* respect Apache's ServerSignature directive (r880082)
* error early if attempting to use Serf >= 0.4.0 (r1041545)
Developer-visible changes:
* fix pointer dereference (r36783)
* fix error leak (r36860)
* make basic_tests 12 compatible with Windows and Python 2.5+ (r35930)
Version 1.5.8
(Not released, see changes for 1.5.9.)
Version 1.5.7
(06 Aug 2009, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.7
User-visible changes:
* fixed: heap overflow vulnerability on server and client
See CVE-2009-2411, and descriptive advisory at
http://subversion.apache.org/security/CVE-2009-2411-advisory.txt
Version 1.5.6
(26 Feb 2009, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.6
User-visible changes:
* allow colons within mergeinfo path names (r35040)
* make it impossible to add .svn to wc via 'svn add --parents' (r35143, -5)
* copy properties of added but uncommitted files (r32448)
* speedup JavaHL bindings on Windows (r35733)
* improve performance of log operation on < 1.5 servers (r35566)
* allow commits over Neon of files >2GB (POSIX only) (r34919, -24)
* allow serf from behind MS ISA proxy servers (r35981)
* prevent svnmerge-migrate-history.py from committing bogus mergeinfo (r35516)
Developer-visible changes:
* fix error handling in mod_dav_svn (r35250, -86)
* support --server-minor-version in windows testsuite (r31393)
* fix depth_tests.py 23 on Windows with a BDB repo (r34875)
* allow svn_mergeinfo_parse() to tolerate unordered mergeinfo (r35297, -367)
* allow overlapping rangelists into svn_mergeinfo_parse() (r35466, -712, -713)
Version 1.5.5
(22 Dec 2008, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.5
User-visible changes:
* allow prop commits on dirs with modified children (r34487, -92, -94)
* make Cyrus auth implementation always prefer EXTERNAL to ANONYMOUS (r33866)
* do not create mergeinfo for wc-wc moves or copies (r34184, -585)
* do not autoupgrade old BDB filesystems to 1.5 or 1.4 format (r34653, -6)
* return mergeinfo to prior state during reverse merges (r30257, r33024, -6)
* remove mergeinfo deleted by merge (issue #3323)
* make proxy slaves pass through txn GET and PROPFIND requests (issue #3275)
* merge can now use targets with inconsistent newlines (issue #3262)
* don't allow empty-string changelists (issue #3344)
* remove false positive ra_neon mergeinfo errors (r34822)
* improve performance of 'svn merge --reintegrate' (r34091, -4, and others)
* fixed: foreign merges keep UUID of foreign repository (r34050, -1, -3)
* fixed: properly encode diff headers used in conflict resolution (r34171)
* fixed: segfault in 'svn cp --parents' (r31311, -4)
* fixed: mergeinfo for '...' maps to empty revision range (issue #3312)
* fixed: segfault in BDB backend node-origins cache (r34506)
* fixed: broken merge if target's history includes resurrections (r34385, -93)
* fixed: invalid mergeinfo created on a subtree during merge (r34560, -2)
Developer-visible changes:
* fixed: svn_repos_get_logs() chokes on some revision arguments (r33873, -4)
Version 1.5.4
(24 Oct 2008, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.4
User-visible changes:
* Properly handle explicit mergeinfo added in merge source (r32968, -75)
* fixed: merging of paths containing spaces (r33641, -44)
* fixed: regression in mergeinfo-aware merges against 1.5.3 (r33693, -704)
Version 1.5.3
(10 Oct 2008, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.3
User-visible changes:
* Allow switch to continue after deleting locally modified dirs (issue #2505)
* Update bash_completion to be compatible with 1.5 (r32900, -11, -12)
* Improve 'svn merge' execution time by 30% on Windows (r33447)
* Reuse network sessions during 'svn merge', improving performance (r33476)
* Improve temp file creation time on Windows (r33464)
* Greatly improve merge performance (r29969, r32463, r33013, -016, -022, -112)
* Improve file IO performance on Windows (r33178, -85)
* fixed: merging files with spaces in name (r33109, -121, -369)
* fixed: incorrect relative externals expansion (r33109, -121, -369)
* fixed: 'svn mv' hangs and consumes infinite memory (r33201, -12)
* fixed: correctness regression in 'svn log -g' (issue #3285)
* fixed: current early bailout of 'svn log -g' (r32977)
Developer-visible changes:
* Allow the tests to run as non-administrator on Windows Vista (r31203)
* Allow out-of-tree build of bindings on BSD (r32409)
* Translate messages in svn_fs_util.h (r32771)
* fixed: bindings test for Perl 5.10 (r31546)
* fixed: building bindings and C API tests with VS2008 (r32012)
* fixed: svn_ra_replay API over ra_serf (r33173)
Version 1.5.2
(30 Aug 2008, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.2
User-visible changes:
* Set correct permissions on created fsfs shards (r32355, -7)
* Pass client capabilities to start-commit hook (issue #3255)
* Disallow creating nested repositories (issue #3269)
* Support Neon 0.28.3
* Properly canonicalize URIs with an empty hostname (issue #2116)
* Improved merge performance for superfluous ranges (r32643)
* Better error message for 'Malformed URL for repository' (r31867, r32365)
* Improved svn:externals parsing (r32672, -673, -674, -739)
* fixed: improper ordering in 'svnlook diff' output (r32019)
* fixed: mod_dav_svn memory leak with 'SVNPathAuthz short_circuit' (r32360)
* fixed: duplicate svn:externals targets fail on co/up (issue #3246)
* fixed: 'svn merge --depth' inconsistencies (issue #2825)
* fixed: ra_serf test failures (1.5.x-ra_serf-backports branch)
* fixed: memory leak and crashes in FS (r32545, -58, -82)
* fixed: core dump with relative externals (issue #3237)
* fixed: 'svn copy' working copy corruption (r32467, -70)
* fixed: perl bindings errors in non-English locale (issue #3258)
* fixed: 'svn merge' incorrectly reverses previous merges (r32494, -522, -523)
* fixed: 'svn merge' errors with subtree mergeinfo (issue #3067)
Developer-visible changes:
* make libsvn_ra_neon initialization thread-safe (r32497, r32510)
* respect LDFLAGS in SWIG bindings (r32416, r32421, r32442)
* fixed: test failures in non-English locales (r32491)
Version 1.5.1
(26 Jul 2008, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.1
User-visible changes:
* mergeinfo on switched subtrees should elide in repos (issue #3188)
* Add support for --config-dir to svnmerge.py (r31727)
* improve performance of bdb post-commit deltification (r31820, -59)
* return faster when there is nothing to be merged (r30748)
* don't commit an add of a missing item (issue #3198)
* don't create unneeded self-referential mergeinfo (issue #3157)
* support 'http-library' (if --enable-runtime-module-search) (r31425, -722)
* support Berkeley DB 4.7 (r32017, -29)
* fixed: make serf usable with root-level authz (r31464)
* fixed: 'svndumpfilter' partial-path matching bug (r31833)
* fixed: crash on invalid dates in 'log' and 'blame' (issue #2721)
* fixed: 'svn status --xml' outputting invalid XML (issue #2887)
* fixed: 'svn merge' prints incorrect range (r30746, -47)
* fixed: using neon/serf, can not replace branch (issue #2939)
* fixed: 'file not found' error when merging to a broken symlink (r31159, -79)
* fixed: using serf, crash or endless loop fetching authn data (r31619)
* fixed: ArrayIndexOutOfBoundsException in JavaHL bindings (r31719, -806)
* fixed: authn password lookup used wrong username (issue #2242)
* fixed: unbounded memory usage in wc-to-wc copy and move (r31868)
* fixed: subtree merges broken for non-intersecting ranges (issue #3199)
* fixed: invalid XML from 'svn log --xml' against pre-1.2 servers (r31875)
* fixed: 'svnlook diff' ignores --diff-copy-from for properties (issue #3248)
* fixed: 'svnlook diff' doesn't report that binary files differ (issue #3249)
* fixed: bogus results from commits to subtrees added by merge (issue #3240)
* fixed: non-existent subtree in destination breaks the merge (issue #3067)
* fixed: serf merge bug too complex to describe here (r32056)
* fixed: 'svn log -g' correctness and speed (issue #3220, issue #3235)
* fixed: merge chokes on renamed subtrees (issue #3174)
Developer-visible changes:
* export svn_path_is_url() to the bindings (r31603)
* don't clobber LDFLAGS in configure when given '--with-zlib' (r31825)
* make libsvn_ra depend on libsvn_delta unconditionally (r31852)
* correctly set the peg revision for copy in JavaHL (r31994)
* 'svn mergeinfo' handles wc paths (r31023, -873, -874, -929, -930, -038)
* fixed: crash when when svn_ra_open3() is passed a bogus URL (r31223)
* fixed: JavaHL compilation on Windows (r31737)
* fixed: crash in calling apr_pstrcat (affects TortoiseSVN) (r32080)
Version 1.5.0
(19 Jun 2008, from /branches/1.5.x)
http://svn.apache.org/repos/asf/subversion/tags/1.5.0
User-visible changes:
- Major new features:
* Merge Tracking [foundational] (issue #820)
* Sparse checkouts (see new '--depth' option) (issue #695)
* Interactive conflict resolution (r25670 et al)
* svn:externals handles relative URLs (issue #1336) and peg URLs
* Changelist support
* WebDAV transparent write-through proxy
* Better support for large FSFS deployments (via sharding & partitioning)
* Cyrus SASL support for ra_svn and svnserve (issue #1144)
- Minor new features and improvements:
* 'svn resolve' (with '--accept' option) replaces "resolved" (issue #2784)
* 'svn move file1 file2 ... dir' now moves the files into dir (issue #747)
* 'svn mkdir' and 'svn copy' now take '--parents' option (issue #1776)
* 'svn delete' now takes '--keep-local' to not remove working copy files
* 'svn copy', 'move' now support peg revisions (issue #2546; also r26484)
* 'svn copy A B ; svn move B C' now the same as 'svn copy A C' (issue #756)
* 'svn copy -rBASE' now works in a working copy (issue #1643)
* 'svn import' now takes '--force' (issue #2806)
* 'svn status -u' now shows of locally deleted directories (issue #2420)
* 'svn switch' now takes '--force' (issue #2392)
* 'svn switch' now takes '--ignore-externals' option (issue #2189)
* 'svn switch' now supports peg revisions (issue #2545)
* 'svn checkout' now takes '--force' option (issue #1328)
* 'svn proplist' and 'svn propget' now support peg revisions (issue #3070)
* 'svn propget' now takes '--xml' option (issue #2696)
* 'svn propedit' now support URLs (issue #2238, but see issue #2923)
* 'svn proplist --quiet' no longer prints extra info (issue #1547)
* 'svn diff --summarize' now takes '--xml' option (issue #2967)
* 'svn diff -x' now takes '-p' extension option (issue #2995)
* 'svn log' now takes '-c' option (r27933)
* 'svn log' now takes '-l' as short form of '--limit' (r25829)
* 'svn log --xml' now takes '--with-revprop' option (issue #2850)
* 'svn diff'/'svnlook diff' now show property actions better (issue #3019)
* 'svn merge' now has informative messages on reverse merges (issue #2848)
* 'svn merge FILE' now honors '--ignore-ancestry' (issue #2853, r25891)
* 'svn merge' handles multiple notifications for single items (issue #2828)
* 'svn merge' handles skipped path better (issue #2829)
* 'svn merge' handles merges from foreign repositories more completely
* 'update', 'checkout', 'switch' now handle obstructions gracefully (r22257)
* 'svn update' now takes '--force' (issue #2392)
* 'svn update' now sometimes copies or moves local files, for efficiency
* 'svnadmin lslocks' now accepts path within repository (issue #2965)
* 'svnadmin recover' now supports FSFS repositories (issue #2992)
* 'svnadmin verify' now has '-q' and '-r' options (r22103)
* 'svnadmin setrevprop' command added (r21736)
* 'svnadmin setuuid' command added (r28511)
* 'svnsync sync' now shows commit progress like 'svn commit'
* 'svnsync' now takes '-q, --quiet' option (r26465)
* 'svnsync' now supports separate authn for source/target (issue #2717)
* 'svnsync copy-revprops' now supports revision ranges (r23498)
* 'svnsync copy-revprops' now supports "HEAD" revision alias (r23500)
* 'svnmucc' is new name for contrib tool formerly called 'mucc'
* 'svnmucc' now has propset and propdel subcommands (issue #2758)
* 'svnmucc' now has more authentication options
* 'svnmucc' now now takes '--non-interactive' option (r25977)
* 'svnmucc' now takes a global base revision, for extra safety (r23764)
* 'svnlook' now takes '--extensions' option (issue #2912)
* 'svnlook' now takes '-N' option (issue #2663)
* 'svnlook history' now takes '-l' / '--limit' option (r25843)
* 'svnserve' now takes '--config-file' option (r24119)
* 'mod_dav_svn' now uses Apache default mime-type for files (issue #2304)
* new '--with-revprop' option on all commands that commit (issue #1976)
* now accept "peg dates" (URL@{DATE}), behaving like peg revs (issue #2602)
* easier to try out experimental ra_serf http:// access module
* select ra_neon vs ra_serf on a site-by-site basis in config (r25535)
* client-side post-commit processing now more efficient (issue #2607)
* windows binaries now use a custom crash handler (issue #1628)
* add vim swap file patterns to default global-ignores (r24348)
* add "*.pyc" and "*.pyo" patterns to default global-ignores (issue #2415)
* add unix/libtool library patterns to default global-ignores (issue #2415)
* naming scheme for conflict files is now configurable (issue #2474)
* removed svn-ref.tex as it's extremely out of date (issue #2762)
* improved cancellation response in many situations
* support Neon up to 0.28
* character set conversion now uses native API on Windows (r25650)
* HTTP authn protocol now configurable (for Neon 0.26 and higher) (r21531)
* http:// (over Neon) supports HTTP redirection / relocation (issue #660)
* support PKCS#11-provided (smartcard) SSL client certs with Neon (r29421)
* authz now supports aliases (r21982)
* authz token rules for authenticated-only, anonymous, and inverse (r23750)
* mailer.py now supports properties in commit messages (r21684)
* ra_serf now supports NTLM/SSPI authentication (issue #2900)
* warn if try to turn off boolean property via propset/propedit (r25486)
* display repository basename in XML and HTML index views (r25837, r25838)
* config 'http-auth-type' can be overridden to force BASIC auth (r23900)
* translation updates for all languages, as usual
* Revamp mod_dav_svn logging; see tools/server-side/svn_dav_log_parse.py
* misleading configure arg --enable-dso now --enable-runtime-module-search
- Client-side bugfixes:
* 'svn revert' of missing scheduled addition broke wc (issue #2425)
* 'svn export' should export svn:externals from local copies (issue #2429)
* 'svn status -uN' should show status of files (issue #2468)
* 'svn update' overwrote if local timestamp unchanged (issue #2746)
* 'svn update -N' errored when receiving a deletion (issue #3039)
* 'svn merge' would delete locally modified props (issue #2857)
* 'svn log --xml' could output invalid XML (issue #2866)
* 'svn copy' on URL with spaces made wrong WC file name (issue #2955)
* 'svn diff' was failing w/ large diffs on Windows (issue #1789)
* 'svn delete' no longer deletes locally-modified files (issue #1808)
* 'svn move' moved files to wrong directory on Windows (issue #1869)
* 'svn revert' mistakenly used leftover .svn-revert files (issue #2927)
* 'svn diff' output now shows relative paths (issue #2723)
* 'svn diff' wasn't ignoring all EOLs (issue #2920)
* 'svn cleanup' no longer fails on a missing .svn/tmp dir (r23370)
* infinite loop in UTF conversion in non-C locale (issue #2577)
* interrupting "svn status" could make svn crash (issue #2623)
* commit-email.pl date header output now RFC2822-compliant (issue #2633)
* authz write access to folder wasn't permitting locking (issue #2700)
* stop complaining just because $HOME is unreadable (issue #2363)
* do not display unescaped characters in error message (issue #2471)
* propchange received on subdir merge causes conflict (issue #2969)
* revert replaced-with-history files should restore checksum (issue #2928)
* catch improper arguments to diff (issue #2996)
* handle URLs like http://hostname (i.e. no path part) (issue #1851)
* config autoprops honored regardless of case of entry (issue #2036)
* "Cannot replace a directory from within" error now rarer (issue #2047)
* handle _svn/.svn as part of a path (issue #3026)
* make permissions changes on symlinks a no-op (issue #2581)
* error usefully if asked to update a URL (r22296)
* fixed infinite loop on Windows if fail to find repository root (r22483)
* 'svn info $REPO_ROOT' now supports pre-1.2 svn:// servers (r26264)
* be more resilient in the face of faulty .svn/entries files (r26482)
* 'svn diff -x --ignore-eol-style' failed to ignore all EOLs (r27094)
* rare property dataloss bug now fixed (issue #2986, see also r29538)
* fixed faulty status reporting for some missing directories (issue #2804)
* 'svn diff --summarize' showed wrong output paths (issue #2765)
* propset and move interaction could cause property weirdness (r25833)
* 'svn propget <propname> .@HEAD' now works (issue #3012)
* 'svnsync' had bug with replaced+modified rev over serf (issue #2904)
* 'svnsync --config-dir' sometimes ignored, thus tunnel agent bug (r27056)
* update/merge safely receives file on top of schedule-add file (r23506)
* http:// (over Neon) reports progress while disk-spooling delta (r26271)
* print "Out of memory" before dying from memory shortage (issue #2167)
* warn when used on old checkout without a repository root entry (r25168)
* merge to missing file target wrongly appeared to succeed (issue #2782)
* 'svn merge URL PATH -cX' could cause property corruption (issue #2781)
* URL parsing now consistently checks for error earlier (issue #2207)
* security hole: files could be created above cwd (r26047, CVE-2007-3846)
* local property mods to replaced-with-history file could be lost (r26364)
* revert of replaced-with-history path left copyfrom info (r23452)
* character encoding translation could hang (r23492)
* un-substituting keywords was buggy ($Id$ vs. $Id:$) (issue #2640)
* ra_neon and ra_serf lost pre-revprop-change hook output (issue #443)
* merge of non-empty subdir could be committed incorrectly (issue #1962)
* many other minor bugfixes, optimizations, plugs of memory leaks, etc
- Server-side bugfixes:
* segfault in svnserve and svnversion commands fixed (issue #2757)
* segfault when stopping httpd (if BDB repository) fixed (issue #2732)
* 'svnadmin dump' had a path ordering bug (issue #2641)
* better FSFS support for NFS v3 and lower (r24470)
* better FSFS support for some buggy NFS clients (r29448)
* authentication and authz bugs w.r.t. anonymous access (issue #2712)
* inconclusive authz result should deny, not allow (r23815)
* better reporting of problems parsing authz files (r22329)
* set svn:date revprop even if dumpstream does not (issue #2729)
* http:// commit can now create empty files properly (r25471, r25474)
* squelch not-a-directory errors in both FS backends (issue #2549)
* segfault on update-report response without base revision (issue #3023)
* 'svnserve --root PATH' checks that PATH exists (r22580, r22701)
* 'svnlook propget -t TXN_NAME' reports errors better (r22772)
* make location of mod_dav_svn activity database configurable (r24873)
* select only paths that are proper children of requested path (r25231)
* http:// commit error could leave empty transactions behind (r23594)
* 'svn switch --relocate' now works against unreadable repos root (r23848)
* many other minor bugfixes too numerous to list here
- Contributed tools improvements and bugfixes:
* svn_load_dirs.pl:
- Support global-ignores list (issue #2470)
- Allow "@" in filenames (r22203, Debian bug 359145)
- Add -no_auto_exe option (r26399)
* svnmerge.py:
- fixed: Always get end_rev from source instead of target (issue #2863)
- fixed: 'init' now chooses a better default revision range (issue #2810)
- fixed: Consider revs changing blocking status as reflected (issue #2814)
- Performance inmprovement (issue #2812)
- initialized revisions can be excluded (issue #2851)
* new 'svn-populate-node-origins-index' tool (issue #3024)
* new 'svn-merge-vendor.py' to assist in merging vendor branches (r23030)
* 'svn2rss.py' is now called 'svn2feed.py'
* svn2cl: New release 0.9 (r24498)
* commit-email.pl: various improvements (r22971, r22589)
* commit-email.rb: various improvements
* psvn.el: too many improvements and new features to list them all here
* dsvn.el: improve XEmacs compatibility (r24337)
* svn-tweak-author.py: make NEWAUTHOR argument optional (r24387)
* And more stuff that we just didn't have time to list. Enjoy.
Developer-visible changes:
* General:
- libsvn_ra_neon is new name for libsvn_ra_dav (to accommodate ra_serf)
- many abort() calls removed, replaced with error returns
- client and server now do capabilities exchange (r29358 et al)
- gen_win.py: auto-detect the path to the JDK on Windows (r24333)
* API changes:
- many, many new APIs and types as part of the new features in 1.5.0
- APIs to allow retrieving multiple revprops in one fetch (issue #2850)
- basic progress reporting for ra_svn (issue #901)
- new APIs for creating and using iterators (r26533)
- svn_fs_node_origin_rev finds line of history origin (issue #3017, #3024)
- svn_revnum_parse for parsing revision numbers (r26195)
- svn_path_is_canonical for validating paths (r26481)
- new API svn_fs_txn_root_base_revision() (r22610)
- pass individual arguments rather than config objects (r25182, r25190)
- clients can now extend HTTP User-Agent header (r28613)
- SVN_ERR_RA_DAV_PATH_NOT_FOUND is deprecated and no longer raised
* Bindings:
- Many improvements to all bindings (Java, Perl, Python, and Ruby)
Version 1.4.6
(21 Dec 2007, from /branches/1.4.x)
http://svn.apache.org/repos/asf/subversion/tags/1.4.6
User-visible changes:
- Client:
* fixed: unbounded memory use in "svn cat" over ra_svn (r26964, -8)
* fixed: 'svn diff --summarize file' displays erroneous output (issue #2765)
* fixed: 'svn status' wrong on previously-reverted deleted dir (issue #2804)
* fixed: 'svn up' can delete unversioned symlinks (issue #1808)
* fixed: use correct properties for locally replaced files (issue #2743)
* fixed: 'svn info -R $REPO_ROOT' w/ pre-1.2 svnserve broken (r26264)
* fixed: svnsync ignores '--config-dir' (r27056)
* datestamps can be localized (r26156)
* fixed: text base not updated when merging a replaced file (issue #2698)
* fixed: inverted 'switch --relocate' error message (r22355)
* fixed: sporadically failing file and directory removal on Windows (r25520)
* fixed: property file handling for schedule-delete files (r25833)
* fixed: allow invalid svn:eol-style values (r28331)
* fixed: 'svnadmin rmlocks' should error when no path provided (r28431)
* support neon 0.26.4 (r26077)
- Server:
* fixed: authz granted if calculation inconclusive (r23815)
* fixed: svndumpfilter crashes on Windows (r23494)
* fixed: wrong pointer type used for memset (r27263)
* fixed: invalid FSFS directory cache can corrupt repository (r27256)
* fixed: dir props on FSFS filesystem root never conflict (issue #2608)
- Client and Server:
* fixed: "No newline at end of file" message translated (issue #2906)
* use compressed delta encoding for 'svn blame' in svnserve (r26115)
* translation updates for Simplified Chinese
Developer-visible changes:
* svnserveautocheck.sh script is executable (r23942)
* add RHEL5 RPM (r25593)
* test suite passes with trunk servers (forwards-compatibility) (r25607)
* javahl bindings:
- improve error reporting from native code (r25208)
Version 1.4.5
(27 Aug 2007, from /branches/1.4.5)
http://svn.apache.org/repos/asf/subversion/tags/1.4.5
User-visible changes:
* fixed: file placement vulnerability (Win32 clients only)
See CVE-2007-3846, and descriptive advisory at
http://subversion.apache.org/security/CVE-2007-3846-advisory.txt
Version 1.4.4
(30 May 2007, from /branches/1.4.x)
http://svn.apache.org/repos/asf/subversion/tags/1.4.4
User-visible changes:
- Client:
* fixed: 'svn up' of replaced file without history fails (issue #2618)
* fixed: 'svn export' succeeds on non-existent URL (r23191, -3, -5, -200)
* fixed: 'svn diff' fails writing large hunks to Win console (issue #1789)
* fixed: 'svn merge' shows 'G' notifications for unchanged files (r24483)
* fixed: svnsync cannot sync unreadable modified dir copies (issue #2705)
* fixed: ra_dav litters empty transactions if initial setup fails (r23594)
* fixed: inconsistent expansion of revision number keywords (issue #1743)
- Server:
* fixed: rare dirprop dataloss leading to BDB repo corruption (issue #2751)
* fixed: race condition when changing FSFS revprops (r23439, r23440)
* fixed: 'svnadmin load' invents svn:date if none exists (issue #2729)
* fixed: svnserve can't commit locked file if root unwritable (issue #2700)
* fixed: 'svnadmin dump' output invalid for non-ASCII paths (issue #2641)
* fixed: security flaw in 'svn prop*' commands [CVE-2007-2448]
(r25095, -099, -104, -105, -10)
- Client and Server:
* fixed: hang during character translation (r23491, r23492)
* translation updates for Simplified Chinese, Japanese, and Norwegian
Developer-visible changes:
* new "make svnserveautocheck" testing target (r23558)
* fixed: ra_serf fails checkout if access to repos root is forbidden (r23846)
* fixed: svn_client_cat2() doesn't accept WORKING as a revision (r23556)
* javahl bindings:
- fixed: potential segfault in initialisation (r23383)
- fixed: SVNClientSynchronized.logMessages() isn't synchronised (r23978)
- fixed: SVNClient.info2() misreports itself as unlock in errors (r24219)
* SWIG/perl bindings:
- fixed: ra_do_{update,switch,status} don't work with Perl delta editors
(r20667, r22311)
* SWIG/python bindings:
- fixed: memory leak whenever C APIs returned errors (r23521)
* SWIG/ruby bindings:
- fixed: typos in method Svn::Wc#merge_prop_diffs and docs (r23405, -6)
Version 1.4.3
(18 January 2007, from /branches/1.4.x)
http://svn.apache.org/repos/asf/subversion/tags/1.4.3
User-visible changes:
- Client:
* fixed: crash using automatic auth protocols with Neon 0.26 (r22440, -61)
* fixed: svn_load_dirs.pl cannot import file names containing '@' (r22203)
* fixed: error when committing replaced directories (r22991, -8)
* fixed: inability to change file perms due to existing file perms (r23018)
* include newest version of svn-graph.pl (r22969)
- Server:
* fixed: incorrectly reporting authz circular dependencies (issue #2684)
* fixed: potential filesystem memory leak in commit finalisation (r22729)
- Client and Server:
* fixed: crash in character translation, particularly on Windows (r22417)
* fixed: potential string corruption when resizing string buffers (r22689)
* translation updates for Korean, Spanish, Italian, Simplified Chinese,
and Japanese (fixing issues #2649 and #2681)
Developer-visible changes:
* support Neon 0.26.2 (issue #2666)
* update (experimental) ra_serf repository access module for DAV (r22872)
* Windows installer improvements (r21516, r22155, r22224)
* fixed: svn_{ra,repos}_replay() doesn't send checksums (r22346, -51, -52)
* fixed: error when calling svn_repos_replay2() with a txn root (r22609)
* fixed: Solaris packaging script broken (issue #2669)
* javahl bindings:
- fixed: auth cache is created in the current directory (r22780)
- fixed: SVNAdmin's setLog() method always fails (r22387)
- fixed: target dependency order in generated build scripts (r22209)
* SWIG/perl bindings:
- fixed: memory leak when calling methods on a Perl commit editor (r22332)
Version 1.4.2
(2 November 2006, from /branches/1.4.x)
http://svn.apache.org/repos/asf/subversion/tags/1.4.2
User-visible changes:
- Client:
* new "notes/svnsync.txt" file explains common svnsync usage
* install a manpage for svnsync (r21403)
* install/package svnsync on Windows (r21387, r21424)
* translation updates for all languages
* dramatically speed up commit of wc-to-wc copy (r21471)
* fixed: support 'svn co URL@{DATE}' (issue #2602)
* fixed: cannot access repositories with spaces via svn:// (issue #2612)
* fixed: passing full URL in some DAV requests, breaking proxies (r21526)
* fixed: history-tracing can fail for renamed directories (issue #2600)
* fixed: crash if interrupted while opening a working copy (r21792)
* fixed: 'svn merge' should notify about conflicted files (issue #2584)
* fixed: 'svn revert' should notify about prop-only reverts (issue #2517)
* fixed: 'svn status -u' not showing props changed on wc root (issue #2533)
* fixed: 'svn status -u' fails in a read-only working copy (r21904, -19)
* fixed: 'svn up' failing with checksum mismatch error (issue #2618)
* fixed: 'svnsync sync' copying missing implicit revprops (issue #2613)
* fixed: svnsync unable to synchronise copies of URL-unsafe paths (r22092)
* svnshell tool: support "setrev head" (r20992)
* include newest version of svnmerge.py
- Server:
* FSFS: improve detection of disk write errors (r21346)
* FSFS: prevent API violation from corrupting repository (issue #2467)
* improved error checking when running hook scripts, etc (r21483)
* mailer.py: new commit_url option links to web page for a commit (r21333)
Developer-visible changes:
* support Neon 0.26.0 and 0.26.1 (r21289, r21293, r21956)
* support current CVS versions of libtool (post-1.5.22) (r22120)
* now compiles on architectures without APR_HAS_DSO (e.g. RISC OS) (r21473)
* fixed: build error on FreeBSD due to missing svnsync manpage (r21403)
* RHEL3 RPM package requires correct version of Apache httpd (r21974)
* numerous improvements to coverage of the test suite
* javahl bindings:
- compile Java bytecode for Java 1.2 VM (r21765, -7, r21814)
- fixed: crash if using 1.4.x bindings with older libraries (r21316, -429)
- fixed: crash when empty destination path passed to checkout (r21770)
* SWIG/ruby bindings:
- fixed: accept nil for Svn::Repos#load_fs's parent_dir argument (r21793)
* SWIG/python bindings:
- fixed: crash when using an apr_hash_t typemap (issue #2606)
- fixed: in tests, use URLs that work on Windows (r21392)
* SWIG/perl bindings:
- fixed: ra_replay works with Perl delta editors (r20666)
Version 1.4.1
(Not released, see changes for 1.4.2.)
Version 1.4.0
(10 September 2006, from /branches/1.4.x)
http://svn.apache.org/repos/asf/subversion/tags/1.4.0
User-visible changes:
- Client:
* new 'svnsync' commandline tool for repository replication
* numerous working copy improvements (WARNING! upgrades to new format!):
- improved performance when detecting modified files (r18628 -56)
- new property storage is faster and uses less disk space (r17583)
- internal wcprops take up less space (r19433 -37)
- large file commit speedups (r17861 -73 18867 -918 -29 -44 -45 -48 -49)
- reduce memory usage for large working copies (r19183 -538)
- increased working copy stability with merge, copy and move:
(fixes issues #845, #1516, #1553, #2135, #2144, #2148)
* new switches added:
- 'svn blame --force' (issue #2509)
- 'svn diff/merge -c/--change' (r17054 -6 -68 18568 -741)
- 'svn diff --summarize' (issue #2015)
- 'svn merge/blame -x' (r18716 -20) (r18602 -857)
* 'svn log' now supports peg revisions (issue #2287)
* 'svn export' now creates intermediate directories if needed (r20030)
* use switch/relocate when svn:externals updated (issue #2209)
* internal diff can ignore whitespace and eol style changes (issue #2121)
* conflict markers now match the file's eol style (issue #1325)
* new svn2cl, svn-viewdiff and svn-resolve contrib scripts
* numerous improvements to svnmerge.py, vc-svn and psvn
* translation updates for all languages
* Mac OS X: store cached passwords encrypted in Keychain (r17619 -43)
* fixed: 'svn ls' slow over ra_dav (issue #2151)
* fixed: 'svn import' not handling eol-style correctly (issue #2433)
* fixed: 'svn blame' should default operative rev range to peg rev (r18400)
* fixed: 'svn blame' ignores eol-style (issue #2431)
* fixed: 'svn checkout' should default operative rev to peg rev (r18422)
* fixed: 'svn diff' supports all eol styles (r17624 -8 -61 18195 -392)
* fixed: 'svn diff' multi-target memory leak (r17518)
* fixed: 'svn merge' showing wrong status with external diff3 (issue #1914)
* fixed: 'svn merge' not merging added dir into deleted dir (issue #2515)
* fixed: 'svn rm' of non-existent item should fail (issue #2440)
* fixed: 'svn status' should skip unversioned files (issue #2030)
* fixed: 'svn status' shows added and conflicted files as added (r20382)
* fixed: 'svn switch --relocate' may set wrong repos root (r17031)
* fixed: 'svn switch --relocate' memory leak (r19535)
* fixed: 'svn switch --relocate' not caching passwords (issue #2360)
* fixed: 'svn info' not showing locks sometimes (r19777)
* fixed: incorrect merge of add of binary file already in WC (issue #2403)
* fixed: possible dataloss if editing immediately after merge (r20609 -12)
* fixed: lots of diff wc<->repos bugs
* fixed: unfriendly error message on propget on nonexistent path (r19399)
* fixed: spurious revert report after manual conflict removal (issue #2517)
* fixed: don't allow -rPREV on schedule add path (issue #2315)
* fixed: keywords with dollar signs cause badness (issue #1780)
* fixed: really revert file with locally modified keywords (issue #1663)
* fixed: deleting schedule add file leaves working props file (issue #2419)
* fixed: svn:needs-lock and read-only-ness not always in sync (issue #2306)
* fixed: post-commit error output not sent to the client (issue #443)
* fixed: not locked error on commit of switched path (issue #2353)
* fixed: svn_apply_autoprops.py should trim whitespace from props (r20790)
* fixed: show locking notifications in local path style (r20927)
* fixed: encoding error on error messages from invalid options (r20883)
- Server:
* support for new 'svnsync' repository mirroring utility
* support for BDB 4.4, including automatic recovery (issue #2449)
* new contrib hook scripts:
- enforcer
- detect-merge-conflict.sh
- case-insensitive.py
* new tools script svn-backup-dumps.py
* new tools hook script log-police.py
* svnserve improvements:
- can now run as a native Windows service (r18855)
- new option --pid-file (r17836)
- allow the password database to be read-only (r16840)
* mod_dav_svn improvements:
- fixed: error conversion crash (r19516)
- fixed: unfriendly error when locking already locked path (issue #2275)
- fixed: xml escaping bugs (r19760 -85 -86)
* authorization improvements:
- new mod_dontdothat apache module (r19531)
- new mod_authz_svn directive AuthzSVNNoAuthWhenAnonymousAllowed (r18680)
- error out when authz rules contain unexpected characters (r19471)
* support .wsf hook scripts on Windows (r18972, 19076)
* lots of improvements to mailer.py and commit-email.pl
* FSFS back-end performance improvements (r17125 19119 -456 -58 -59)
* fixed: 'svnadmin verify' output not in native encoding (issue #1997)
* fixed: uuid file in FSFS could be destroyed on write error (issue #2193)
* fixed: FSFS path encoding bug (r17774)
* fixed: don't crash on corrupt repositories (r17625)
* fixed: expect error output from hook scripts in native encoding (r17101)
* fixed: catch errors starting hook scripts (r16891 17041 -81)
* fixed: svnserve and authz can cause broken WCs (issue #2566)
* fixed: the default hook script templates should be vanilla sh (r20796)
- Both:
* delta compression improvements:
- new delta encoding reduces size (r18363 -94 -66 -78 -98 -99 -457 -950)
- xdelta algorithm speed improvements (r18986, 19047)
* don't bail on invalid locale (r19445)
* improve speed of non-verbose svn ls (r17067 -71)
* fixed: delta combiner reading past EOF (r17743)
Developer-visible changes:
* require APR >= 0.9.7 to improve error detection for FSFS repos (r19915)
* require zlib, for svndiff1 delta encoding (r18363)
* support SWIG 1.3.29 (r19968)
* support autoconf 2.60-dev (r19919 20632 -36)
* removed no-longer-supported Red Hat 7.x RPMs (r20462)
* add support for building RPMs for x86-64 architecture (r20548 -552)
* numerous improvements to gen-make.py build system, especially on win32
* removed Visual Studio.NET APR 0.9 project files (r20170)
* numerous improvements to the test suite
* new public APIs:
- keyword / eol translation helpers and generic streams (see svn_subst.h)
- new generic stream helpers (see svn_io.h)
- authn providers made available to other clients (see svn_auth.h)
- svn_cmdline_setup_auth_baton
- svn_dso_initialize, svn_dso_load
- svn_client_diff_summarize and svn_client_diff_summarize_peg
- svn_client_list
- svn_config_has_section
- svn_txdelta_compose_windows and svn_txdelta_apply_instructions
- svn_txdelta_stream_create
- svn_diff_file_options_create and svn_diff_file_options_parse
- svn_err_best_message
- svn_compat_wrap_commit_callback
- svn_uuid_generate
- svn_user_get_name and svn_user_get_homedir
- svn_io_get_dir_filenames
- svn_ra_reparent
- svn_ra_replay
- svn_wc_revision_status
- several rev'd APIs, see doxygen docs
* flush stdout after each status/notification line (r19476 -656)
* new (experimental) ra_serf repository access module for pipelined DAV
* .svn/entries use a less verbose non-xml format (r19420)
* make recursive 'svn ls' streamy (issue #1809)
* remove svn-config script
* empty-file and README.txt removed from WC admin areas (r17181 -268 -364)
* replace cmdline client XML DTDs with RNG schemas (r16379 -80 -93 -571 17248)
* fixed: log --limit against old svnserve leaves unusable session (r19638)
* fixed: Solaris build problems (r19636)
* fixed: blame of WORKING revision shouldn't give BASE (r19558)
* fixed: svn_client_copy and _move should fail if target exists (issue #2188)
* fixed: svn_io_file_rename and readonlyness on Windows and UNIX (r17366 -69)
* fixed: ra_dav memory leak when reusing session (issue #2247)
* fixed: console character encoding problems when built with VS2005 (r20108)
* fixed: various problems with --enable-dso and global pools (r20996, r20999)
* fixed: installer file syntax error in new versions of Inno Setup (r21022)
* SWIG bindings:
- SWIG/python bindings:
- new support for svn_client_info (r19413)
- SWIG/ruby bindings:
- full support for Subversion 1.4 APIs, including :
svn_ra_replay and svn_diff_summarize
- numerous bug fixes
- add ruby documentation (make install-swig-rb-doc) (r20166)
- add APIs for adding a provider (r21079)
- SWIG/perl bindings:
- new support for svn_client_info (r18758)
- minor corrections to SVN::Fs (r19312)
* javahl bindings:
- APIs to get version info for the native libraries (r17604 -07)
- API for path validation (r18989, r19079)
- C++/Java code refactoring, cleanup, and consolidation
- fixed: handle possible errors from date/time conversions (r17213)
- fixed: SVNClient username/password JVM crash on null input (r19803 -13)
- fixed: specify default UUID load action (r18030)
- fixed: compile error on Visual Studio 2005 (r18054)
Version 1.3.2
(23 May 2006, from /branches/1.3.x)
http://svn.apache.org/repos/asf/subversion/tags/1.3.2
User-visible changes:
- Client:
* fixed: 'svn st -u' crash on missing subdirs (r19348, -71, issue #2551)
* fixed: leaving stray working copy locks on cancellation (r18893)
* fixed: svn_load_dirs.pl trying to import .svn and _svn dirs (r18549)
* svn_load_dirs.pl symlink support (issue #2478)
* translation updates to Japanese, Traditional Chinese.
- Server:
* fixed: mod_dav_svn memory leak when listing large dirs (r19528)
* fixed: mod_dav_svn crash on valid request (r19520)
* fixed: svnserve protocol error in lock, causing client hang (issue #2548)
* mailer.py: add Content-Transfer-Encoding header (r19319)
* mailer.py: fixed: named substitutions incorrectly ignored (r18114, -681)
* fixed: authz requires read access for root for writes (issue #2486)
* svnauthz-validate: add config file validation tool (r18504, -09)
Developer-visible changes:
* fixed: tests don't catch repository creation failure properly (r19149,-51)
* support SWIG 1.3.28
* support APR 0.9.x >= 0.9.10 (r19039, -57, -60)
* python bindings:
- fixed: link error on OpenBSD (r18983)
* ruby bindings:
- fixed: memory leak (r19493)
- fixed: NULL argument conversion bug (r19543)
Version 1.3.1
(25 March 2006, from /branches/1.3.x)
http://svn.apache.org/repos/asf/subversion/tags/1.3.1
User-visible changes:
- Client:
* fixed: segfault moving unversioned files (issue #2436)
* fixed: verbose list broken over ra_dav (issue #2442)
* fixed: 'svn ci -m path_name' not requiring '--force-log' (r17956)
* fixed: crash on mixed-case https URL scheme (r18042)
* fixed: crash in status with ignored directories (r18291)
* fixed: strip peg rev from default checkout directory (r18416)
* fixed: diff crash with non-recursive checkout (r17231, 18539, -41)
* fixed: 'svn ls' URL encoding bug with locks (r18665, -68)
* fixed: unlock circumvents lock token check (r18691, -94)
* fixed: repos-to-repos copy crash (r18451)
* fixed: 'svnmerge' utility improvements (r18811)
* translation updates for German, Swedish and Norwegian
- Server:
* fixed: set svn:date at the end of commit in fsfs (r18078)
* fixed: don't wait for hook script background jobs (r18146)
* fixed: mod_dav_svn should log the whole error chain (r18211)
* fixed: uncomment section headers in repos config files (r18247, -50)
* fixed: log scalability issues with many paths (r18395, -404)
* fixed: better path input validation in mod_dav_svn (r18660)
* fixed: assert in copy in fsfs and bdb (issue #2398)
* fixed: RPM package bad interaction with NFS servers (issue #1456)
- Both:
* fixed: copyright years updated to include 2006 (r18021, -127)
Developer-visible changes:
* fixed: missing #include (r18065)
* fixed: allow building with Neon 0.25.5 (r18215)
* fixed: error leaks (18196, -249)
* javahl bindings:
- fixed: compile error on Visual Studio 2005 (r18054, -55)
* python bindings:
- fixed: libsvn_swig_py link problem on Solaris 10 (r17910)
- fixed: pool lifetime bug (r17992)
- fixed: memory leak (r18230)
- fixed: race condition during application pool initialization (r18721)
- fixed: Make pool parameters optional (issue #2444)
* ruby bindings:
- fixed: pool management issue (r17795, -811)
- fixed: protect baton from garbage collection (r17627)
- fixed: conversion bug (r17726, -925)
- fixed: compile errors with SWIG 1.3.24 (r18456, -58)
Version 1.3.0
(30 December 2005, from /branches/1.3.x)
http://svn.apache.org/repos/asf/subversion/tags/1.3.0
User-visible changes:
- Client:
* 'svn ls -v' now shows remote locks (issue #2291)
* 'svn status' speedup (r15061, r15103)
* 'svn blame' speedup on files with long history (issue #1970)
* 'svnversion' now assumes default argument of '.' (r14892)
* support for neon 0.25.x, which fixes http:// control-c bug (issue #2297)
* support for more ISO-8601 date formats, compatible with GNU date (r14428)
* support for single-digit date components (r15459)
* on Windows, '_svn' admin dir now toggled by runtime env. variable (r16244)
* working copy size with empty propfiles reduced (r16855, see releasenotes)
* new switches added:
- 'svn blame --xml [--incremental]' (r14690)
- 'svn status --xml [--incremental]' (issue #2069)
- 'svn info --xml [--incremental]'
- 'svn add/import --no-ignore' (issue #2105)
- 'svnlook tree --full-paths' (r13976)
- 'svnlook diff --diff-copy-from' (r14855)
- 'svnlook changed --copy-info' (r16681)
* fixed: 'svn copy wc URL' might include deleted items (issue #2153)
* fixed: 'svn copy wc wc' allows cross-repository copies (issue #2404)
* fixed: 'svn up/merge' major property-merging bugs (issue #2035)
* fixed: 'svn merge' insisting on write access to '.' (issue #2411)
* fixed: 'svn merge' cross-device move problems (r16293, -329, -330)
* fixed: 'svn diff' outputs headers in wrong encoding (issue #1533)
* fixed: 'svn proplist/add/cat' dies on unversioned items (issue #2030)
* fixed: 'svn add' not honoring svn:ignore property (issue #2243)
* fixed: 'svn log -rN:M --limit X' error over http:// (issue #2396)
* fixed: 'svn switch --relocate' failure on 'deleted' dir (r16673)
* fixed: 'svn info' not always showing repos lock (issue #2276)
* fixed: 'svn info' might show lock on wrong path (r16626)
* fixed: 'svnlook' chokes on logs with inconsistent newlines (r14573)
* fixed: 'svnlook propget --revprop -t' failure (r15203)
* fixed: 'svnversion' wrongly traverses into externals (r15161)
* fixed: incorrect URI encoding passed to svn+ssh:// (issue #2406)
* fixed: properly handle filenames containing '@' (issue #2317)
* fixed: '--non-interactive' now suppresses launch of $EDITOR (r15277)
* fixed: conflict markers not in current encoding (r14621)
* fixed: commands ignoring extraneous -m or -F switches (issue #2285)
* fixed: poor error-checking when using revprops (r15542)
* fixed: stack-smashing bugs (r15948, r16037)
* fixed: incorrect parsing of mod_dav_svn XML responses (r17589)
* translation updates for all languages
- Server:
* svnserve improvements:
- can now restrict read/write access by path (see releasenotes)
- undeprecation of the --read-only (-R) option (r17614)
* mod_dav_svn improvements:
- 'SVNListParentPath on' shows all repositories in web browser (r16158)
- ability to log high-level client operations (see releasenotes)
- sets svn:mime-type on autoversioning commits (r14359)
* 'svn log' performance improvement (r14722)
* fixed: fs history algorithm might return wrong objects (issue #1970)
* fixed: repos deadlock when hooks output too much (issue #2078)
* fixed: mod_dav_svn displays errors with sensitive paths (r14792)
* fixed: anonymous reader could create empty commits (issue #2388)
* fixed: possible segfault to callers of trace_node_locations() (r16188)
* fixed: BDB-style locking actions on FSFS repositories (r16295, r16297)
* fixed: numerous bugs running BDB commands on FSFS (issue #2361, r16388)
* fixed: svndumpfilter incorrectly remapping dropped revs (issue #1911)
- Both:
* faster multiple (un)locks in a single svn:// request (issue #2264)
* the Subversion Book is no longer bundled (r17466)
Developer-visible changes:
* reorganization of automated tests, including ability to run on ramdisk
* lots of Doxygen/API documentation cleanup
* numerous improvements to gen-make.py build system, especially on win32
* working copy is now storing repos_root as separate field (issue #960)
* keywords are now stored in an internal hash (issue #890)
* client status APIs now makes more server-side info available (r16344)
* new public APIs:
- new transfer progress callback for DAV (r15948)
- svn_ra_initialize(), svn_client_open_ra_session()
- svn_fs_closest_copy(), svn_fs_type()
- several rev'd APIs, see doxygen docs
* SWIG bindings: No more compile-time or runtime SWIG dependencies
- SWIG/python bindings:
- automatic memory management: APIs no longer require pool arguments!
- improved stability, as shown by our new testsuite
- better error messages
- SWIG/ruby bindings:
- complete API coverage!
- automatic memory management
- greatly expanded test suite
- SWIG/perl bindings:
- new accessors for svn_lock_t, svn_fs_access_t
- a number of bugfixes
* javahl bindings:
- add streamy API for fetching file contents (r15584)
- fixed: let tests run before bindings are installed (issue #2040)
- fixed: lock command not raising errors properly (issue #2394)
- fixed: ignored errors from svn_client_blame2() (r16434)
Version 1.2.3
(19 August 2005, from /branches/1.2.x)
http://svn.apache.org/repos/asf/subversion/tags/1.2.3
User-visible changes:
- Client:
* fixed: 'svn status -u' fails against pre-1.2 mod_dav_svn (r15359, r15423)
* fixed: 'svn export' segfault (r15516)
* fixed: 'svn merge' memory leak (r15233)
* fixed: horrible rename-tracing performance against 1.0 servers (r15315)
* fixed: 'svn cat' over file:// -- small leak (r15253)
* fixed: crash with "svn lock" and authentication (r15703)
* improvements to 'svnmerge' utility (r14008,-458,-587,-632, r15329,-340)
* translation updates for French, German, Polish, Norwegian, Swedish,
Korean
- Server:
* fixed: mod_authz_svn being overly restrictive (r15463)
* fixed: fsfs directory caching bug (r15705, r15742)
- Both:
* fixed: crash when >50 options passed to any commandline app (r15251)
* fixed: memory leak in character translation handle caching (r15379,-398)
Developer-visible changes:
* fixed: crash when calling svn_client_(un)lock with no targets (r15734)
* rhel-4 RPM bugfix for python bindings (r15616)
* missing #include in SWIG bindings (r15683)
* javahl bindings:
- fixed: JNI library loading bug (r15552)
- fixed: JNI stack-name cut and paste error (r15337)
- fixed: crash when revisions have no dates (r15737)
* perl bindings:
- now compatible with SWIG 1.3.25 (r15248)
- allow SVN::Pool to be used as pool parameter (r15450)
- make SVN::Delta::Editor friendlier for debugging (r15609)
- fixed: wrap svn_ra_stat properly (r15713)
- fixed: bug in SVN::Core::Stream's read function (r15698, r15700)
* ruby bindings:
- now compatible with SWIG 1.3.25 (r14980, r15361)
Version 1.2.2
(Not released, see changes for 1.2.3.)
Version 1.2.1
(5 July 2005, from /branches/1.2.x)
http://svn.apache.org/repos/asf/subversion/tags/1.2.1
User-visible changes:
- Client:
* fixed: 'svn lock' on switched file locks wrong thing (issue #2307)
* fixed: 'svn (un)lock' errors on multiple targets (r14736, 14775)
* fixed: 'svn (un)lock' problems with URI-unsafe names (issue #2314)
* fixed: 'svn (un)lock' not caching authentication (r15088)
* fixed: 'svn unlock' loses executable bit (r14859, r14923, r14939)
* fixed: 'svn unlock URL' segfault (r14893)
* fixed: 'svn commit' failure on XML-unsafe locked paths (issue #2335)
* fixed: recursive directory copy bug (issue #2343)
* fixed: don't initialize RA library in 'svnversion' (r14755)
* fixed: svn-push segfault (r14732)
* various translation updates for localized client messages
- Server:
* fixed: 'svn log' performance regression, general (r14116, 14772, 14759)
* fixed: 'svn log -v' performance regression, FSFS-specific (r15016)
* fixed: mod_dav_svn bug sets content-type incorrectly (r15046)
Developer-visible changes:
* fixed: win32 innosetup's add/repair/remove features (r14830)
* fixed: OBOE with 'limit' parameter of svn_repos_get_logs3(). (r15119)
* redhat RPM fixes (r15050)
* perl bindings:
- accessors for svn_lock_t (r15082)
- call utf_initialize, adjust global pool usage (r15076, r15080,
r15081, r15117)
Version 1.2.0
(21 May 2005, from /branches/1.2.x)
http://svn.apache.org/repos/asf/subversion/tags/1.2.0
See the 1.2 release notes for a more verbose overview of the changes since
the 1.1 release: http://subversion.apache.org/docs/release-notes/1.2.html
User-visible changes:
- Client:
* add peg-rev syntax to co/blame/cat/ls/pget/plist/export (issue #1093)
* 'svn info' now works on URLs (r13123, 13144)
* 'svn* --version' now shows available repository back-ends (r13761)
* new fixed-length keywords (for placement in binary files) (issue #2095)
* on Windows, disk-cached passwords are now encrypted (r13888)
* performance improvements:
- 'svn status' does much less disk parsing (r11677, 11704)
- 'svn st -u' no longer asks server to generate textdeltas (issue #2259)
- 'svn revert -R' doing much less work (r13883)
- utf8<->native conversions are faster now (issue #2016)
* new switches added:
- 'svn commit --no-unlock - retain lock in wc upon commit
- 'svn log --limit N' - show only first N log messages
- 'svn info --revision' - show info on older object (r13265)
- 'svn list --xml' - output listing in XML
- 'svn propset --force' - allow unusual propsets (#2065)
- 'svn diff --force' - show diffs on binary files (#2099)
- 'svn co/up/st --ignore-externals' - skip over externals (#2189)
- 'svn export --non-recursive' - don't export subdirs (issue #2228)
- 'svnversion --help' - show help (r13128)
* fixed: 'svn merge' fails to add symlinks or expand keywords (issue #2064)
* fixed: 'svn merge --dry-run' shows spurious 'skip' messages (issue #1943)
* fixed: 'svn merge' file-not-found' error (issue #1673)
* fixed: 'svn merge' of propchanges into deleted file (issue #2132)
* fixed: 'svn merge' on implicit target with space (r13010)
* fixed: 'svn merge/diff URL URL' can cause httpd timeout (issue #2048)
* fixed: 'svn switch/update' failure might corrupt wc (issue #1825)
* fixed: 'svn up' should rm before add, helps case-insensitivity (r12616)
* fixed: 'svn up -rX' causes file to be unrestorable (issue #2250)
* fixed: 'svn copy wc wc' should keep .svn/ hidden (issue #1739)
* fixed: 'svn copy wc wc' of deleted=true doesn't delete (issue #2101)
* fixed: 'svn copy' shouldn't copy into schedule-delete area (issue #2020)
* fixed: 'svn copy dir dir' infinite recursion (issue #2224)
* fixed: 'svn log' throws error on unversioned target (issue #1551)
* fixed: 'svn log' in r0 working copy shows r1 log msg (issue #1950)
* fixed: 'svn export' bugs on deleted dirs or nonexistents (#2226, r13226)
* fixed: 'svn export' on single file from working copy (issue #1708)
* fixed: 'svn import' creating an empty revision (r14293)
* fixed: 'svn commit' ignores --encoding when editing externally (#2244)
* fixed: 'svn commit' log message lost if utf8-conversion failure (r13230)
* fixed: 'svn diff' output encoding bug (r11461)
* fixed: 'svn diff' showing prop-diffs on repos root dir (r13381-2)
* fixed: 'svn diff' label reversal (issue #2033)
* fixed: 'svn propget' prints extra newline in --strict mode (r14505)
* fixed: 'svn propset' should skip unversioned files (#2030)
* fixed: 'svn rm URL1 URL2 URL3...' huge memory usage (issue #2218)
* fixed: 'svn mkdir' cleanup after failure (r11883)
* fixed: 'svn status -u' crash in non-recursive wc's (issue #2122)
* fixed: 'svn revert' should skip unversioned items (issues #2030, 2133)
* fixed: 'svn revert' should suggest --recursive (issue #2114)
* fixed: 'svn add/import' better detects invalid paths (issue #1954)
* fixed: 'svn cleanup' should repair timestamps (r12012)
* fixed: 'svn cat -rBASE' contacts repository (issue #1361)
* fixed: fuzzily escape control-characters when sending over dav (#2147)
* fixed: prevent client from manipulating svn:wc:* properties (r12523)
* fixed: allow portnumber in svn+ssh://user@host:port/ URLs (r14373)
* fixed: xml-escaping bugs over dav (r11090)
* fixed: store symlinks as utf8, always work in non-utf8 locale (r11358-9)
* fixed: bug in special-file detranslation (r11441)
* fixed: show paths in local-style where we weren't (issue #1538)
* fixed: detect invalid propnames better (issue #1832)
* fixed: entire error stack not being printed (issue #1822)
* fixed: improper utf8 conversion of revision strings (issue #1999)
* fixed: use-commit-times timestamp bug (r12906)
* fixed: don't comment out section-names in default config file (r11771)
* more support for user-cancellation (r13083-4, 13086)
* improved error messages (r12920, 11392, 11599, 11913, #2154, #2214)
- Server:
* mod_dav_svn autoversioning feature now complete (see release notes)
* 'svnadmin create' now creates FSFS repositories by default (r13624)
* new pre/post-revprop hook argument to describe propchange (r12162)
* mod_authz_svn groups can now contain other groups (issue #2085)
* 'svnadmin recover' now creates default svnserve passwd file (r11589)
* increase default BDB cache size in DB_CONFIG (r13030)
* new switches added:
- 'svnlook diff --no-diff-added' - suppress added files (#2180)
- 'svnlook propget/proplist --revprop' - show revision props (#2181)
- 'svnadmin load --use-pre-commit-hook'
'svnadmin load --use-post-commit-hook'- invoke hooks when loading
* fixed: FSFS race condition on posix platforms (issue #2265)
* fixed: change FSFS revprops atomically and safely (issue #2193)
* fixed: FSFS should verify checksums (issue #2253)
* fixed: FSFS crash bug (r14333)
* fixed: 'svnadmin create' should clean up when it fails (r13200)
* fixed: 'svnadmin load' compatibility on pre-0.14 dumpfiles (r12075)
* fixed: 'svnadmin load' crashes on contentful rev 0 (issue #1674)
* fixed: 'svnadmin dump' should write in console encoding (issue #1997)
* fixed: check for null-streams in dump/load code (r10510)
* fixed: hook script ignored when symlink is broken (issue #1700)
* fixed: hook script may inherit server's stdin stream (r12155)
* fixed: potential svnserve segfault (r13199)
* fixed: svnserve handling mutually-exclusive options (issue #2251)
* fixed: mod_authz_svn should log errors to httpd errorlog (issue #2182)
* fixed: 'svnadmin hotcopy' failed to copy format files (r14678, r14683)
* mailer.py: add win32 compatibility, plus other bugfixes
- Both:
* new 'locking' feature (issue #1478, see release notes for details):
- new: 'svn lock/unlock', 'svnadmin lslocks/rmlocks', 'svnlook lock'
- new: 'svn:needs-lock' property to enable communication
- 'svn st [-u]' shows local or remote lock overview
- 'svn info wc | URL' shows local or remote lock details
- 'svn commit' sends locks, 'svn up' removes stale locks
- new hook scripts: pre-lock, pre-unlock, post-lock, post-unlock
* speedups for 'svn blame' and other commands (see xdelta in release notes)
* fixed: make both svnserve and svn:// urls work with IPv6 (r13235-6)
* fixed: updating xml-unsafe dirname over http (issue #2268)
* new translation of localized messages: French
* continued improvement of localized message translations:
- German, Spanish, Polish, Brazilian Portuguese, Norwegian Bokmål,
Swedish, Traditional Chinese, Simplified Chinese, Korean, Japanese
- more localized messages in all svn-related binaries
Developer-visible changes:
* binary diff algorithm now defaults to xdelta instead of vdelta
* huge number of new APIs:
- new locking APIs in svn_client.h, svn_ra.h, svn_repos.h, svn_fs.h
- new 'flattened' svn_ra.h API, which imitates svn_fs.h (issue #1931)
- new notification API in svn_client.h, svn_wc.h
- http://svn.haxx.se/dev/archive-2005-04/0319.shtml has all API changes
* fs now has its own 'format' file, independent of repos 'format' (r13387)
* improve efficiency of delta combining algorithm (r13016, r13063)
* make all BDB apis take explicit pool parameters (r13198, r13205)
* remove libsvn_fs_base caching of node revisions (r13299)
* libsvn_repos commit editor can now take incoming txn (r13733)
* fixed: mod_dav_svn sending illegal editor-drive (issue #2258)
* pool usage improvements (r12954, 12852, r13386, issue #1310)
* SWIG bindings: better API coverage overall.
- new ruby bindings!
- remove bitrotting swig-java bindings
- perl and python bindings: numerous improvements, see their own logs.
- bindings tests now within svntest framework
* javahl bindings: numerous improvements, see its own logs.
* many improvements to mailer.py and commit-email.pl
* rewrite/improvements to gen-make build system, including VS.NET support
* many improvements to the automated python testsuite (issue #2257)
* book moved to separate repository (http://svn.red-bean.com/svnbook)
Version 1.1.4
(1 April 2005, from /branches/1.1.x)
http://svn.apache.org/repos/asf/subversion/tags/1.1.4
User-visible changes:
- Client:
* fixed: win32 not ignoring versioned symlinks (issue #2173)
* fixed: 'svn merge' can cause broken working copy (issue #2222)
* fixed: 'svn commit' fails when schedule-delete dir has local mod (r11980)
* fixed: 'svn st -u nonexistent_file' segfault (issue #2127)
* fixed: 'svn cp wc wc' utf8 conversion error (r13111)
* fixed: confusing error message about "wc not locked" (issue #2174)
* many translation updates for localized client messages
- Server:
* fixed: nasty (though unusual) performance bug in FSFS commits (r13222-3)
* fixed: FSFS memory leak when auto-merging large tree (r13193)
* fixed: FSFS memory leak in 'svnadmin hotcopy' (r13218, 13465, 13468)
* fixed: FSFS segfault when encountering empty data reps (r13683)
* fixed: two dataloss bugs in svndumpfilter (r12630, r12636)
* fixed: wasteful memory usage in svndumpfilter (r12637, r12640)
* fixed: mod_dav_svn segfaults when client sends bogus paths (issue #2199)
* make mailer.py work on win32 (r12499, r12542, r12670)
- Both:
* fixed: (win32) retry file operation if sharing violation (r12983, r12986)
Developer-visible changes:
* add SWIG 1.3.24 and .25 compatibility (r12551, r12717-9, r12722, r13504)
* fixed: JavaHL run-time link error (r12576), path/url cleanups (r13090)
* fixed: python bindings log_receiver failure with SWIG 1.3.24 (r13487)
* build system tweaks: add install dependencies for fs & fs_base (r11050)
Version 1.1.3
(14 January 2005, from /branches/1.1.x)
http://svn.apache.org/repos/asf/subversion/tags/1.1.3
User-visible changes:
- Client:
* translation updates for localized client messages.
Developer-visible changes:
* Fix a compile error in the Perl bindings.
Version 1.1.2
(20 December 2004, from /branches/1.1.x)
http://svn.apache.org/repos/asf/subversion/tags/1.1.2
User-visible changes:
- Client:
* fixed: 'svn switch' interruption can break working copy (issue #1826)
* fixed: 'svn switch' memleak over ra_dav (issue #2106)
* fixed: 'svn blame' algorithm bug (r11527)
* fixed: invoke external diff/diff3 with local-style paths (r11689)
* fixed: 'svn status' handling of missing subdirs (r11936)
* fixed: 'svn ls -v' encoding bug (r11740)
* fixed: 'svn ls "file with space"' bug (r12273, r12393)
* fixed: 'svn merge' should URI-encode copyfrom URLs (issue #1905)
* fixed: 'svn merge' deletion output formatting (r12100, r12111, r12114)
* fixed: 'svnversion --version .' crash (r11438)
* fixed: UNC paths on Cygwin (issue #2108)
* fixed: win98 iconv bug -- uninitialized variable (issue #2091)
* improved 'svn status' performance:
- do fewer check_path calls (r11592)
- 'svn status file' shouldn't recursively lock tree (r11439, r11669)
* translation updates for localized client messages.
- Server:
* fixed: 'svnadmin load' race condition (r12327)
* fixed: fsfs memleak in commit finalization (r11706)
* fixed: fsfs memleak in inefficient directory removal (r11701)
* fixed: fsfs commits use insert-only perms on db/revs/ (r11665)
* fixed: fsfs creates lockfile at creation time, not at 1st commit (r12172)
* fixed: svndumpfilter mislabeling output as version 3 (issue #2142)
* fixed: 'svnserve -h' encoding bug (part of issue #1997)
* fixed: prevent cross-repository copies (r12003)
* fixed: increase log-region max size in default DB_CONFIG (issue #2159)
- Both:
* fixed: 'svn switch' quietly corrupting working copy (issue #2124)
* fixed: canonicalize paths sent by ra_svn/svnserve (issue #2119)
* fixed: memleak into UTF8 translation routines (r11689)
Developer-visible changes:
* add support for BerkeleyDB 4.3 (if using a compatible apr-util)
* add support for any apr/apr-util 1.X
* disallow incompatible SWIG versions (r12450)
* fixed: slight API/ABI incompatibility between 1.0.9 and 1.1.x (r12102)
* fixed: perl bindings pool usage & object refcounts (r11451, r11630)
* fixed: perl bindings pool usage and potential memleak (r12397)
* fixed: javahl crash trying to fetch nonexistent property (r12184)
* fixed: javahl build can fail due to missing dirs (issue #2032)
* fixed: RPM build breakage (issue #2111)
* fixed: i18n issues for windows installer (r11685)
* allow build system to update single .po file (r11763)
Version 1.1.1
(22 October 2004, from /branches/1.1.x)
http://svn.apache.org/repos/asf/subversion/tags/1.1.1
User-visible changes:
- Client:
* fixed: 'svn status' win32 performance regression (issue #2016)
* fixed: 'svn ls' dying on non-ascii paths over DAV (issue #2060)
* fixed: allow URI-encoded colon or pipe on win32 (issue #2012)
* fixed: broken win32 UNC paths (issue #2011)
* fixed: memory bloat when committing many files over DAV (r11284, -321)
* fixed: eol-style translation error for 'svn propget' (r11202, -243)
* fixed: 'svn propedit' does EOL conversion properly (issue #2063)
* fixed: 'svn log --xml' shouldn't be locale-dependent. (r11181)
* fixed: 'svn export' of symlinks with 'use-commit-times' (r11224)
* fixed: 'svn export -rBASE' when WC has added items (r11296, -415)
* many translation updates for localized client messages.
- Server:
* fixed: 'svn ls' HTTP performance regression (r11211, -232, -285)
* fixed: make it possible to set "SVNPathAuthz off" in httpd.conf (r11190)
* fixed: fsfs validating revisions when accessing revprops (issue #2076)
* fixed: 'svn log -v' hiding too much info on 'empty' revisions. (r11137)
* fixed: encoding bug with 'svnlook log'/'svnlook author' (r11172)
* fixed: allow mod_authz_svn to return '403 Forbidden', not 500 (r11064)
* fixed: XML-escape author and date strings before sending (issue #2071)
* fixed: invalid XML being sent over DAV (issue #2090)
Developer-visible changes:
* fixed: IRIX compile error (issue #2082)
* fixed: error in perl bindings (r11290)
* fixed: error leaks in mod_dav_svn (r11458)
* fixed: javahl should use default config directory (r11394)
Version 1.0.9
(13 October 2004, from /branches/1.0.9)
http://svn.apache.org/repos/asf/subversion/tags/1.0.9
User-visible changes:
- Server:
* fixed: 'svn ls' HTTP performance regression (r11211, -232, -285)
* fixed: 'svn log -v' hiding too much info on 'empty' revisions. (r11137)
Developer-visible changes:
* fixed: make redhat 7/8 rpm scripts build the book correctly (11143)
Version 1.1.0
(29 September 2004, from /branches/1.1.x)
http://svn.apache.org/repos/asf/subversion/tags/1.1.0
See the 1.1 release notes for a more verbose overview of the changes since
1.0.x: http://subversion.apache.org/docs/release-notes/1.1.html
User-visible changes:
* new non-database repository back-end (libsvn_fs_fs)
* symlinks can now be placed under version control (unix systems only)
* cmdline client now supports psuedo-IRIs and autoescapes chars (issue #1910)
* 'svnadmin recover' no longer waits forever for a lock (new '--wait' option)
* new $Revision$ synonym for $Rev$ and $LastChangedRevision$
* new runtime option 'store-passwords = ' gives finer control (r10794)x
* fixed: working copies now shareable by multiple users (issue #1509)
* fixed: diff and other subcommands correctly follow renames (issue #1093)
- new 'peg' syntax for diff/merge: 'svn diff -r X:Y TARGET@REV'
- now able to compare working copy with URL: 'svn diff --old WC --new URL'
* new framework for localized error/info/help messages, initial translations:
- German, Polish, Swedish, Norwegian Bokmål, Traditional Chinese,
Japanese, Brazilian Portuguese.
* speed improvements:
- faster 'svn up' on complex working copies -- no more repos txns (r8840)
- faster 'svn status' -- fewer stat() calls (r9182)
- faster 'svn checkout' -- fewer sleep() calls (r9123)
- faster 'svn blame' -- new RA->get_file_revs() func (issue #1715)
* new switches added:
- 'svn blame --verbose' - show extra annotation info
- 'svn export --native-eol TYPE' - export using TYPE line-endings
- 'svn add --force' - recurse into version-controlled dirs
- 'svnadmin dump --deltas' - include binary diffs in dumpfile
- 'svnadmin create --fs-type fsfs' - create fs_fs repos (default is bdb)
- 'svnserve --tunnel-user=NAME' - assume authenticated NAME over tunnel
- 'svndumpfilter [cmd] --quiet' - less chatty dumpfiltering
- 'svnserve --version' - show program's version
'svnversion --version'
'svndumpfilter --version'
* svnadmin dump/deltify now understand -r{DATE} (r9805)
* allow update of non-existent target entry (partial issue #1902 fix)
* 'svnadmin create' now sets sgid bit on repos/db/ (unix systems only)
* increase default neon (ra_dav) timeout from 120 to 3600 seconds (r9568)
* print verbose BDB error messages (r10557, r10566)
* fixed: don't bail when 'svn up' refuses to delete local mods (issue #1806)
* fixed: process svn:externals in defined order (issue #1788)
* fixed: pass new propval to stdin of pre-revprop-change hook (issue #952)
* fixed: svndumpfilter logic/memory/display bugs (r8691, 8831, 9061)
* fixed: 'svnadmin hotcopy PATH .' (r8659)
* fixed: copy crash bug (r8863)
* fixed: 'svn st -u' crash bug (r10841)
* fixed: 'svn commit' segfault (r10676)
* fixed: allow cleanup on .svn/ dirs containing KILLME file (r8891)
* fixed: 'svn revert' detects corrupted text-base (r8897)
* fixed: 'svn status -N' no longer locks entire tree (r8906)
* fixed: several different 'svn switch' bugs (r9192, 9203, 9238, 9698)
* fixed: some 'svn copy' bugs (r9193, 9274)
* fixed: obscure update-deletion bug (r8976)
* fixed: utf8 conversion 'hang' (r9233)
* fixed: missing UTF8->native recoding in 'svn log' output (r10652, 10673)
* fixed: 'svn blame' now defaults to rev (r9440)
* fixed: 'svn blame' closing files before deleting them (issue #1969)
* fixed: 'svn diff' shows truncated paths (r9693)
* fixed: 'svn diff --notice-ancestry' bug (r9699)
* fixed: 'svn subcommand -r{DATE} URL' works if URL not in HEAD (issue #1840)
* fixed: 'svn blame' on non-ascii path truncation (issue #1770)
* fixed: svn:external 'wc not locked' bug (issue #1897)
* fixed: proper mod_dav_svn html/xml escaping (issue #1209)
* fixed: memleak in 'svn propset -R URL' (issue #1928)
* fixed: stop 'svn up' from deleting schedule-add target dir (issue #1793)
* fixed: 'svn merge' adding a directory already 'deleted' (issue #1769)
* fixed: excessive memory use when fs deltifies revision 2^N (r10070)
* fixed: disallow non-recursive directory commit (issue #1797)
* fixed: allow propget of props with colon in name (issue #1807)
* fixed: 'svnadmin load' computation of copyfrom-rev (issue #1795)
* fixed: runtime config files created with proper line-endings (issue #1803)
* fixed: make svnserve's authn work on usernames with spaces (r10385)
* fixed: have svnserve use repos UUID as default authn realm (r10394)
* fixed: segfault when history-following hits 'empty' revision (r10368)
* fixed: overzealous out-of-dateness checks in 'svn cp wc URL' (issue 1994)
* fixed: don't URI-encode path in mod_dav_svn XML listings (r10461)
* fixed: 'svn info' should refuse URL targets (r10760)
* fixed: incomplete-directory handling bug (r10956)
* fixed: allow cancellation between files during recursive dir add (r10894)
* general improvement and normalization of error messages
* many improvements to contributed tools: mailer.py, psvn.el, etc.
Developer-visible changes:
* libsvn_fs now loads either bdb (libsvn_fs_base) or fsfs (libsvn_fs_fs)
* new console-printing API: svn_cmdline_printf() family checks for errors.
* new library-version querying API:
- new svn_[libname]_version() in each library
- svn_ver_*() family of functions
* 2nd generation APIs, from svn_foo() --> svn_foo2(). old APIs deprecated.
- svn_wc_adm_open2() & friends, svn_wc_export2(), svn_client_add2()
svn_wc_parse_externals_description2(), svn_hash_read/write2(),
svn_repos_dump/load_fs2() & friends, svn_wc_diff2(),
svn_subst_copy_and_translate2()
* other new APIs:
- svn_stream_copy(), svn_txdelta_target_push(), svn_opt_parse_path(),
svn_io_file_flush_to_disk, svn_repos_trace_node_locations(),
svn_repos_get_file_revs(), RA->get_locations(), RA->get_file_revs,
RA->get_version(), svn_sort_compare_paths(), svn_utf_initialize()
* SVN_REVNUM_FMT_T usage replaced with %ld (r9691)
* cache mod_authz_svn authz file per connection (r8867)
* validate hex digits in % escape (issue #1947)
* hashes now written to disk in sorted order (r9910)
* do cancellation checks before loops, not after (r8918)
* fixed: bug in svn_repos_dir_delta replacement logic (r8078)
* fixed: tiny memory access bugs (r8229, 8230, 8313)
* fixed: several commit buglets (r8955, 9658, 9757, 9855)
* fixed: don't recursively lock all prop commands (r9172)
* fixed: svnserve memory usage on many-file commits (r9185)
* fixed: close svnserve child's listen-socket after forking (r10050)
* fixed: 'svnadmin hotcopy' integrity improvements (issues #1817, #1818)
* fixed: only verify media type of svn:mime-type, not encoding (r10126)
* fixed: handle '//' and '..' in svn_path_canonicalize (issue #1779)
* fixed: double URI escaping (issue #1814)
* fixed: editor-driver bug (don't delete before every copy) (r10851)
* fixed: potential mod_dav_svn crashes/memleaks (r10478)
* fixed: better 'svnadmin verify verification (r10508, r10509)
* fixed: encoding of get_repos_url_result (r10353, 10375)
* fixed: prevent canonicalized URIs from ending in '/' (r10317)
* stop using -std=c89 gcc flag (r11054)
* sync with apr 1.0's find_apr.m4 and find_apu.m4 files (r10560)
* win32 installer improvements (r10978)
* huge improvements to python, perl, java bindings
* huge changes to win32 build system
Version 1.0.8
(22 September 2004, from /branches/1.0.8)
http://svn.apache.org/repos/asf/subversion/tags/1.0.8
User-visible changes:
* fixed: mod_authz_svn path and log-message metadata leaks.
See CAN-2004-0749, and descriptive advisory at
http://subversion.apache.org/security/CAN-2004-0749-advisory.txt
Version 1.0.7
(17 September 2004, from /branches/1.0.x)
http://svn.apache.org/repos/asf/subversion/tags/1.0.7
User-visible changes:
* fixed: win32 'file not found' error [issue #1862]
* fixed: 'svn st -u' crash (r10841)
* fixed: potential repos corruption; ensure stdin/out/err always open (r10819)
* fixed: allow propnames containing ":" to be fetched via http:// (r10190)
* fixed: allow user to interrupt between authentication prompts (see r11014)
* fixed: work around +t directory-creation bug in APR (r10616, 10638, 10642)
* various small fixes to Book
Developer-visible changes:
* fix library dependencies for bindings (r9338, 9340)
* java bindings: fix a crash and other bugs (r9883, 9905, 8027)
* perl bindings: various fixes (see r11023)
Version 1.0.6
(19 July 2004, from /branches/1.0.x)
http://svn.apache.org/repos/asf/subversion/tags/1.0.6
User-visible changes:
* fixed: crash in status command, caused by race (r10144)
* fixed: crashes when deleting a revision-prop (r10148, r10185, r10192)
* fixed: mod_authz_svn allows COPY method on repos with space in name (#1837)
* fixed: mod_authz_svn COPY security hole: authorize whole tree (issue #1949)
Developer-visible changes:
* neon 0.24.7 now required (fixes wire compression bugs) (r10159, 10176)
Version 1.0.5
(10 Jun 2004, from /branches/1.0.5)
http://svn.apache.org/repos/asf/subversion/tags/1.0.5
User-visible changes:
* fixed: security bug in svn protocol string parsing. (CAN-2004-0413)
Version 1.0.4
(21 May 2004, from /branches/1.0.x)
http://svn.apache.org/repos/asf/subversion/tags/1.0.4
User-visible changes:
* fixed: 'svn up' can delete unversioned data on win32 fs (issue #1854)
* fixed: pool leaks in 'svnlook diff/changed/dirs-changed'
* fixed: insecure script example in pre-commit-hook template
* fixed: inability to do a checkout to '/'
* officially recommend neon 0.24.6 in all docs.
Developer-visible changes:
* fixed: RPM build for Fedora & WBEL3/RHEL3
* fixed: SWIG-java building problem
* fixed: javahl bug which can crash JVM
* fixed: change formatting codes in svn_swig_pl_callback_thunk
* fixed: properly wrap svn_txdelta_parse_svndiff for perl
Version 1.0.3
(19 May 2004, from /branches/1.0.3)
http://svn.apache.org/repos/asf/subversion/tags/1.0.3
User-visible changes:
* fixed: security bug in date parsing. (CAN-2004-0397)
Version 1.0.2
(15 April 2004, from /branches/1.0.x)
http://svn.apache.org/repos/asf/subversion/tags/1.0.2
User-visible changes:
* fixed: segfault when remotely deleting svn:author property.
* fixed: mod_dav_svn accepting too many authors. (issue #1786)
* fixed: create runtime config files with native EOLs. (Issue #1802)
* fixed: recursive propset can corrupt .svn/entries (issue #1794)
* fixed: allow shared working copies [mostly working now] (issue #1509)
* fixed: mod_authz_svn should ignore uri on MERGE request (partial #1821)
* fixed: svnserve assertion failure on empty error messages
* fixed: commit/update memory leaks when working on many targets (issue #1635)
* fixed: don't display repos-paths or URLs with '\' on win32.
* new example script: svnserve 'sgid' wrapper.
* minor book fixes, new 'best-practices' doc.
Developer-visible changes:
* fixed: deprecation warning from SWIG 1.3.20_
* fixed: broken win32 python-swig bindings compilation.
* fixed: bug in libsvn_fs changes-table change-folding code.
* fixed: perl bindings: wrap root->paths_changed, apply_txdelta return values
* added VC7 support and defines for including debug symbol files.
Version 1.0.1
(12 March 2004, from /branches/1.0.x)
http://svn.apache.org/repos/asf/subversion/tags/1.0.1
User-visible changes:
* allow anonymous access checking in mod_authz_svn
* fixed: mod_authz_svn now works with SVNParentPath (issue #1588)
* fixed: potential segfault in mod_dav_svn.
* fixed: improper BDB cursor shutdown in libsvn_fs, which can wedge repos.
* fixed: allow checkout of repository with space in path. (issue #1694)
* fixed: make 'svn propget URL' work correctly over svn://. (issue #1752)
* fixed: failed 'svn merge URL' when URL contains user@host. (issue #1759)
* fixed: invalid REPORT response when updating a deleted wc. (issue #1721)
* fixed: allow deletes below copied wc dirs.
* fixed: merge --dry-run bug on added-files with props. (issue #1738)
* fixed: svnlook no longer requires write access to '.'
* fixed: ensure 'svn blame' fails on files marked as binary. (issue #1733)
* fixed: make failed direct-URL commits clean up their fs txns. (issue #1726)
* fixed: obscure bugs in time/date string formatting. (issue #1692)
* fixed: svn export doesn't export svn:externals. (issue #1750)
* fixed: svn import doesn't handle EOL or keyword translation. (issue #1756)
* fixed: svn status -v shows unwanted status of externals (issue #1741)
* fixed: allow revert of schedule-replace file that has no props (issue #1775)
* fixed: svnserve segfault on invalid --listen-host argument.
* fixed: switch bug which caused wrong URL to be left in wc.
* detect invalid UTF8 filenames when native locale is UTF8.
* improve presentation of directory property conflicts.
* improve presentation of errors from svnadmin & svnlook.
* clarify output of 'svnadmin help deltify'.
* augment copyright notice to --version output.
* more book updates.
Developer-visible changes:
* remove obsolete auth provider examples.
* prevent potential ra_dav commit race-condition.
* fix svn_io_dir_walk 'dot-first' ordering required by 'svnadmin hotcopy'.
* fix error leaks in dav_svn_convert_err()
* upgrade win32 innosettup tools and redhat RPMs.
* fix compile warning: compressed streams on LP64 architecture.
* use cpio to generate tarballs instead of GNU tar.
* tweaks to dist.sh.
* fix bindings on win32.
* fix perl bindings build on OS X.
* fix perl bindings: bug which rejects string revnums.
Version 1.0.0
(branching 23 February 2004, from /branches/1.0.x)
http://svn.apache.org/repos/asf/subversion/tags/1.0.0
User-visible changes:
* fixes to the shbang lines in tools/hook-scripts/.
* vast improvements to cvs2svn.py (NOTE: now a separate project!)
* general documentation cleanup:
- clarify built-in help text for 'svn switch' and 'svn status'.
- fix docs within the hook templates.
- cleanups to README, INSTALL, HACKING, svn-ref.tex, bash_completion.
- bring www/ pages up-to-date for 1.0.
- many changes to the Book
Developer-visible changes:
* updates to the win32 installer packaging code.
* cleanups to SWIG bindings:
- disable svn_io_* functions.
- svn_filesize_t and apr_time_t fixes.
- remove debugging print statements and various warnings.
- make svn_repos_dir_delta() function correctly
- add support for repos authz callback.
Version 0.37.0 [Beta Interim 2]
(branching 24 January 2004, from /branches/1.0-stabilization)
http://svn.apache.org/repos/asf/subversion/tags/0.37.0
User-visible changes:
* bugfix: buffer overflow for AIX client
* 'svn merge' now notices ancestry by default. (r8390)
* bugfix: double Ctrl-C on windows no longer wedges repository.
* New date formats (see API change: Rewrite of date parser below)
* bugfix: Errors in authentication when --no-interactive is turned on (r8139)
* bugfix: Fix some 'access denied' errors on Windows (r8341, r8352)
Developer-visible changes:
* API change: Rewrite of date parser (r8327, r8328, r8329) (issue #408)
* bugfix: svn_fs__bdb_changes_fetch() fouls up change ordering (issue #1695)
* require SWIG >=1.3.19 (issue #1690)
* numerous changes to language bindings, to keep up with C API.
* fix: apr build issues (r8279, r8280, r8318) (issue #1666)
* changed the auth-provider C API to use 'realmstring' on all funcs
* check the ra plugin ABI versions.
* fix: ABI problem with blame. (r8494) (issue #1705)
* remove svn_io_file_printf from public API. (r8492) (issue #1653)
* extensive changes in the perl client bindings. (r8270)
* too many big and small internal code cleanups and fixes to mention here
Version 0.36.0 [Beta Interim 1]
(branching 13 January 2004, from /branches/1.0-stabilization)
http://svn.apache.org/repos/asf/subversion/tags/0.36.0
User-visible changes:
* add cancellation support to svnadmin and svnlook (r8222)
* runtime 'store-password' option renamed to 'store-auth-creds' (r8014)
* 'svn blame' changes:
- now shows correct revision info (r8035-6)
- responds to cancellation better (r8129)
* svnserve changes:
- added '--inetd' option; now required to speak with stdin/stdout (r8205)
- added '--listen-port' and '--listen-host' options (r8001-2)
- removed '-u' option (r8003)
- ignore SIGPIPE (no more repos lockups when you terminate a pipe) (r8140)
* lots of Book work (many newly-documented Apache and svnserve topics)
Developer-visible changes:
* bugfix: svnserve network crash (r8142)
* bugfix: return result_rev from svn_client_checkout correctly (r8096)
* bugfix: fs history harvesting code (r8154)
* bugfix: memory leak in mod_dav_svn (r8223)
* bugfixes in edge-cases of status and update (r8114-5)
* make 'svn blame' work with 18n and uri-escaped filenames (r8023, 8030, 8040)
* small bugfixes to authentication system (r8006, r8235)
* standardize error message formatting (r8218)
* load RA modules as foo.so.0, not foo.so (r8098)
* various core API changes:
- use constructor for svn_client_cxt_t (r8053-4)
- anchor/target may use NULL for target (r8216)
- stop using apr_ symbols (r8219)
- rename to 'svn_repos_authz_func_t' (r8213)
- add pool parameter to finish_report and abort_report (r8215)
* numerous changes to Perl and Java bindings, to keep up with C API.
Version 0.35.1 [Beta] (branching 19 December 2003, from /tags/0.35.0)
http://svn.apache.org/repos/asf/subversion/tags/0.35.1
NOTICES:
This release is to correct for the problems in the 0.35.0
release and affects Windows users only:
* fix: file handle leak (r8048)
* fix: UTF-8 path problem (issue #1660)
Version 0.35.0 (branching 12 December 2003, from revision 7994)
http://svn.apache.org/repos/asf/subversion/branches/0.35.0
NOTICES:
1. As of this release, Subversion once again does deltification
automatically. This means that the deltification step most
repositories introduced into their post-commit hooks as of
release 0.33.0 should now be reverted. Look for a line with
"svnadmin deltify" in hooks/post-commit, and remove it.
2. We now recommend using Berkeley DB 4.2.52 or higher for SVN
repositories. See http://sleepycat.com/download/index.shtml.
User-visible changes:
* BDB log files are automatically pruned, with BDB 4.2.50 and higher (#1615)
* deltification is automatic again (issue #1601)
* fix: svn diff -rX:Y wcpath' may lie (issue #1616)
* fix: URI-decoding problem on 'svn import' (issue #1622)
* many other enhancements, minor features, and bugfixes not listed here
Developer-visible changes:
* misc. improvements on Perl and Java bindings
* improved diff handling (r7985)
* many other changes not listed here
Merged revisions after release branching:
* r8009, r8010 and r8011 - Java bindings
* r8041 - typo/bugfix
Version 0.34.0 (released 3 December 2003, from revision r7859)
http://svn.apache.org/repos/asf/subversion/tags/0.34.0
#####################################################################
## WARNING WARNING WARNING WARNING WARNING WARNING WARNING ##
#####################################################################
## ##
## This release makes an incompatible change to the Subversion ##
## database. Repositories created with versions of Subversion ##
## prior to 0.34 will not work with Subversion 0.34. ##
## To upgrade, first use 'svnadmin dump' with your existing ##
## Subversion binaries. Then upgrade your binaries to 0.34, and ##
## use 'svnadmin load' to create a new repository from your ##
## dumpfile. ##
## Don't forget to copy any custom configuration/hooks from the ##
## old to the new repository. ##
## ##
#####################################################################
Please see notes/repos_upgrade_HOWTO for documentation on migrating
pre-0.34.0 repos to 0.34.0.
That document is also located here:
http://svn.apache.org/repos/asf/subversion/trunk/notes/repos_upgrade_HOWTO
User-visible changes:
* fs schema change (#1578, #1595) **NOTE: repos dump/load cycle required!**
* Berkeley DB 4.2.50 is now the recommended Berkeley version
* Fix: 'svn status' thought replaced items were unversioned (#1609)
* SSL server cert error prompt improvement (r7849)
* many error message improvements (r7745, r7763, r7824 and 7827 - #897)
* don't show update-completion message until all wc work completes (#1556)
* many other enhancements, minor features, and bugfixes not listed here
Developer-visible changes:
* public client APIs changes (r7799) after fixing #1556
* many improvements and fixes on Perl bindings (perl => 5.8.0 are required)
* improvements, fixes on misc. test scripts
* many other changes not listed here
Merged revisions after release branching:
* r7868 - Java bindings
* r7888 - Security fix for svnserve
Version 0.33.1 (released 17 November 2003, revision r7782)
http://svn.apache.org/repos/asf/subversion/tags/0.33.1
NOTICE: This is a bugfix release. The bug is fixed if *either*
the client or server uses the new code.
User-visible changes:
* major performance fix for updates
Version 0.33.0 (released 13 November 2003, revision r7737)
http://svn.apache.org/repos/asf/subversion/tags/0.33.0
NOTICES:
1. This client may be incompatible with ra_dav servers <= 0.31.
2. In order to make commits more responsive, repository
deltification is no longer automatic. However, you may want
to run deltification as a background process in your repository
post-commit hook. For example, the new post-commit.tmpl file
recommends 'nice -2 svnadmin deltify "$REPOS" -r "$REV" &'.
User-visible changes:
* now require APR/APU 0.9.5 (ships in Apache 2.0.48)
* lose automatic deltification, but recommend it in post-commit (r7695, #1573)
* new configuration and authn/authz support in ra_svn (r7604, r7601)
* much faster checkouts and updates, over both svn:// and http:// (#1429)
* new partial-authz feature: checkouts/updates just skip unauthorized items
* new 'use-commit-times = yes' config option to use commit-time timestamps
* new 'svnadmin hotcopy' command, like hot-backup.py (#1567)
* fix Win32 "access denied" error in renames (r7598, #1576)
* unnecessary working copy tree locks now avoided, to save time (#1245)
* Compatibility changes:
- lose ra_dav compatibility with servers 0.31 and earlier
- lose support for working copy format "1" (not created for over a year)
* 'svn diff' and other read-only actions now work in read-only working copies
* 'svn blame -rX' now does the intuitive thing
* 'svn log' output headers now say "rXXXX | " instead of "rev XXXX: "
* 'svnversion' no longer stymied by svn:externals
* new 'svn pd' alias for 'svn propdel'
* '-rCOMMITTED' keyword now works on more commands
* minor changes to output of 'svn ls -v' and 'svn st -v' (r7530)
* 'svn log --xml' now obeys the '-q' flag (r7555)
* cvs2svn.py bugfixes, especially issue #1440
* book and documentation updates
* removed server config options ssl-ignore-invalid-date and
ssl-override-cert-hostname (r7644)
* many other enhancements, minor features, and bugfixes not listed here
Developer-visible changes:
* repair text- and prop-time in .svn/entries if spuriously wrong (r7565)
* speed up keyword translation (r7502)
* two new editor functions, absent_file() and absent_directory()
* ra_dav checkouts/updates no longer do O(n) number of GET, PROPFIND requests
* new svn_io_temp_dir function, will morph to apr_temp_dir_get soon
* new svn_io_file_close wrapper for apr_file_close
* tools/test-scripts/svntest/ scripts now support ra_dav and ramdisk
* many other changes not listed here
Version 0.32.1 (released 23 October 2003, revision 7497)
http://svn.apache.org/repos/asf/subversion/tags/0.32.1
NOTICE: This release is to correct for the problems in the 0.32.0
release. There are no user or developer changes in this release
other than the subversion/include/svn_version.h now reflects
the correct version number.
NOTICE: This release of Subversion causes an ra_dav client/server
compatibility break with Subversions older than 0.28.0.
Version 0.32.0 (released 22 October 2003, revision 7480)
http://svn.apache.org/repos/asf/subversion/tags/0.32.0
NOTICE: This release of Subversion causes an ra_dav client/server
compatibility break with Subversions older than 0.28.0.
User-visible changes:
* new 'svn blame' subcommand. (r7389, 7438, #508)
* fix huge ra_dav 'svn import' memory leak. (r7381)
* other bugfixes: proper line endings in diff headers (r7450, #1533),
stop auto-props from removing all whitespace (r7358), 'svn st' UI
consistency fix (r7364), various 'svn switch' fixes (r7366),
mini-manpages for svnadmin, svnserve, svnversion (r7421), remove
'P' field from 'svn ls -v' (r7432), 'svn merge' double-notification
bug (r7447), prevent 'svn:externals' infinite loop (r7459), 'svn
merge' segfault (r7458).
Developer-visible changes:
* 'svn diff' is now reasonably streamy. (r7393, 7439, #1481)
* fix many ra_dav pool abuses. (r7370-3, 7380, 7368, 7400, ...)
* fix mini leaks: clear unused svn_error_t's. (r7378-9, 7405, 7408, 7429)
* tons of code, doc, API cleanup. (from julianfoad!)
* new RA->get_repos_root() API. (r7428)
* swig/python, swig/perl and native JNI updates and improvements.
* more work on build depenedency generator. (r7412-8)
* svn_repos_finish_report() now aborts txns on error. (r7424)
* remove crufty old ra_dav compatibility code (r7466, 7468)
* other changes: new SVN_DEBUG_ERROR tool macro, new 'davautocheck'
and 'contrib' makefile targets, new --enable-gprof configure option
(r7437), new scramble-tree.py testing tool, auth provider
reorganization, make RA->get_dir fetch props correctly over ra_dav
(r7431), notice permission error when creating unique tmpfile (r7434).
Version 0.31.0 (released 08 October 2003, revision 7355)
http://svn.apache.org/repos/asf/subversion/tags/0.31.0
User-visible changes:
* new 'svnlook history' command (and removal of 'svnadmin lscr').
* new 'auto-props' feature can set file properties during 'svn add/import'
* win32 client now properly converts UTF8 to console-locale. (r7168, #872)
* 'svn up' now notices when svn:externals value changes. (r7256, #1519)
* authentication changes:
- client caches auth-creds in memory for a single session (r7292, #1526)
- SSL cert caches keyed on host+port, not any SSL connection. (r7174)
* faster 'svn log' (see new fs-history algorithm) (#1499)
* faster repos read-operations (caching gives ~20% speedup) (rXXXX, #1499)
* faster updates (fewer entries-file writes gives ~20% speedup) (r7170, #1490)
* more work on psvn.el and svn_load_dirs.pl
* more cvs2svn bugfixes
* obsolete manpages truncated to point to 'help' and book URLs. (r7340, #1508)
* other bugfixes: no more revision keywords "FIRST" or "CHANGED" (r7250),
fix 'svn cp URL URL' $EDITOR msg generation (r7264), fix regression
bug in 'svnadmin load' (r7273), 'svnadmin setlog' now triggers
repository hooks (r7322), 'svn cp -rHEAD wc' now works correctly (r7331),
post-commit-hook failures correctly ignored by client (r7342, #906)
Developer-visible changes:
* tons of filesystem improvements (#1499):
- new fast fs-history algorithm: allows stable VR urls (r7283, #1499)
- new dag-node caching (r7163)
- skip-deltas now run in individual trails (r7138)
- no-op svn_fs_copy()s don't write to the database (r7158)
* mod_dav_svn MERGE response is faster (using svn_repos_replay()) (r7191)
* ensure consistent wc 'dead entry' cleanup (r7197, r7204, #1075)
* lots of work on gen_win.py, gen_make.py, gen_base.py tools
* lots of work on making SWIG-java bindings build.
* updates/improvements to javahl bindings and SWIG-perl bindings
* updates/improvements to Mandrake RPM builds
* other bugfixes: python testsuite now uses local path separators (r7224),
svn:externals no longer keeps connections open (r7312, #1448),
UTF8-to-local date conversion (r7316, #1534), API consistification
changes (r7298, r7302, r7304, r7307).
Version 0.30.0 (released 24 Sep 2003, revision 7178)
http://svn.apache.org/repos/asf/subversion/tags/0.30.0
User-visible changes:
* SSL changes: (r7134, #1330)
- client now prompts to cache server certificates
- no more 'ssl-ignore-unknown-ca' option
- 'ssl-ignore-host-mismatch' is renamed to 'ssl-override-cert-hostname'
- new 'ssl-trust-default-ca' option to trust 'default' openssl CAs
* 'svn log' no longer dies on unversioned args (r6989, #777)
* local mods now obstruct 'svn up' deletions (r7050, #1196)
* 'svnserve' now notices (unauthenticated) --username arg (r7060)
* no more 'svnadmin createtxn' subcommand. (r7062)
* 'svn ls -v' shows years when appropriate
* document some new things in Book (r7014), plus minor technical fixes
* website changes: new sidebar, new 'svn links' page, new tigris.org!!
* other bugfixes: hooks use proper stdout handles on win32 (r7001),
prevent copies of copies in wc (r7077, #1259), display failed
revprop change over ra_dav (r7081, #1520), 'svn st -u' throws RA
error properly (r7094, #1506)
Developer-visible changes:
* ra_dav now requires neon-0.24.X
* many gen_make.py/gen-base.py improvements, especially for win32 builds
* many improvements to swig/perl bindings
* improvements to contrib/: psvn.el, and new svn-push program.
* more cvs2svn bugfixes: issue #1504, #1421, #1514, and new --username arg.
* python testsuite only raises exceptions, never status codes. (#1192)
* various libsvn_fs re-org (prepwork) for issue #1499.
* other bugfixes: code-complete timestamp feature (r6983, #1445), add
op-counting features to trails (r6984, #655), fs UUID caching
(r7037), almost finish win32 iconv issues (#872), restored-file
entry-timestamp bugfix (r7090, #1523), always print CWD as '.' (r7097)
Version 0.29.0 (released 05 Sep 2003, revision 6976)
http://svn.apache.org/repos/asf/subversion/tags/0.29.0
User-visible changes:
* 'svn status' now streams its response. (r6913, #1426)
* 'svn status' now recurses into externals (r6913, #1428)
* new 'svnadmin verify' command to verify repository data (r6851, #1074)
* SSL changes: (r6958, #1371)
- dropped support for PEM-encoded client certs, only accept PKCS12 now.
- 'ssl-authority-files' is now a list of CA files
- no more 'ssl-client-cert-type' and 'ssl-client-key-file' variables.
* new svndumpfilter option: '--preserve-revprops' to keep props on empty revs
* mailer.py improvement: handle multiple match groups (r6940)
* remove in-repos/on-disk repository template features, till post-1.0 (r6965)
* various cleanups to the Book
* other bugfixes: switch deletion bug (r6890, #1496), status
repos-delete bug (r6913, #1469), reversion of '.' (r6953, #854).
Developer-visible changes:
* GUI developers take note: prompting API changed (r6928, #1214)
* now compile against neon-0.24; 0.23.9 support to be dropped soon. (r6958)
* various improvements to Perl/SWIG bindings
* tree re-org: non-core utilities split into 'tools' and 'contrib' areas.
* some gen_make.py/gen-base.py improvements
* configure.in CFLAGS bugfix (r6963)
* stop calling deprecated APIs in APR, in preparation for upcoming APR-1.0.
Version 0.28.2 (released 29 Aug 2003, revision 6946)
http://svn.apache.org/repos/asf/subversion/tags/0.28.2
User-visible changes:
* MAJOR BUGFIX: revert revision 6764.
The new history-searching code was over-stressing our use
of BerkeleyDB transactions, causing checkouts to go
twice as slow and lose all concurrent-client scalability.
This is a temporary fix for a larger design problem. See issue
http://subversion.tigris.org/issues/show_bug.cgi?id=1499
Version 0.28.1
(released 28 Aug 2003,http://svn.apache.org/repos/asf/subversion/tags/0.28.1)
There are no changes in this release.
It is strictly an updated release, build with the correct version
of autoconf; autconf-2.57
Version 0.28.0 (released 27 August 2003, rev 6894, branches/release-0.28)
(http://svn.apache.org/repos/asf/subversion/tags/0.28)
#####################################################################
## WARNING WARNING WARNING WARNING WARNING WARNING WARNING ##
#####################################################################
## ##
## This release makes an incompatible change to the Subversion ##
## repository filesystem schema. Repositories created with ##
## Subversion code prior to this release will unable to operate ##
## with this new code. To maintain the ability to use said ##
## repositories, you must use a version 'svnadmin dump' prior to ##
## this change to dump your repository to a dumpfile, then use ##
## this new Subversion code to create, and load your dumpfile ##
## a new repository using 'svnadmin load'. And don't forget to ##
## copy over any custom configuration/hooks from the old to the ##
## new repository. ##
## ##
#####################################################################
Please see notes/repos_upgrade_HOWTO for documentation on migrating
pre-0.28.0 repos to 0.28.0.
That document is also located here:
http://svn.apache.org/repos/asf/subversion/trunk/notes/repos_upgrade_HOWTO
User-visible changes:
* fs schema change, see issue #1003 **NOTE: repos dump/load cycle required!**
* command-line options
- changed 'lsdblogs' is now 2 commands 'list-dblogs', 'list-unused-dblogs'
- removed '--only-unread' option
- new 'list-unused-dblogs'
- new '--config-dir' allows svn config to live outside ~/.subversion
- new (r6811)
- svn-status-get-specific-revision (interface to svn cat)
- svn-ediff-with-revision (run ediff w/ a file wc and a specified rev)
* fixed 'mod_dav_svn' segfault bug caused by foreign DeltaV requests (r6725)
* fixed 'svn switch' bug which could result in corrupted repo (#1316,r6746)
* fixed items now marked as 'deleted' if they no longer exist (#919,r6748)
* fixed 'merge' no longer adds file/dir if scheme differs from wc. (#1321)
* fixed Handle \r correctly when prompting on Windows. (r6792,#1307)
* 'svn merge' now 'skip's when it hits unversioned obstructions (r6810,#1425)
* fixed repos->wc of file w/ svn:keywords set caused segfault (r6818,#1473)
* fixed 'svn diff -r PREV:HEAD' failed if tmp/ exists in cwd (r6838,#1487)
Developer-visible changes:
* database schema changed (see warning above!) (r6752,#1003,#1248,#1438)
* svn Perl bindings are ready - see swig/INSTALL
* internal changes to treat swig libraries more like normal libraries (r6761)
* improved handling of errors opening a repository over ra_svn (r6841)
Version 0.27.0 (released 12 August 2003, rev 6707, branches/release-0.27.0)
User-visible changes:
* fixed ra_svn:
- (r6588) avoid hangs due to ra_svn tunnel creation errors
- (r6696, r6697, #1465) svnserve crash due to pre-commit hook failure
* fixed 'svn log':
- (r6642, #1423) log on a deleted path over ra-dav
- (r6684, #1438) log performance bug
* fixed 'svn diff' and 'svn merge':
- (r6604, #1311) diff URL URL on files now works
- (r6668, #1142) diff comparing wc to repos branch
- (r6687, #1297) diff/merge interaction in file adds
- (r6703, #1319) merge problem with adding subtrees
- (#6607) new default ancestry-following behavior for diff, merge
* fixed 'svn status':
- (r6688, r6691, r6692, #1289) status on nodes deleted in repos
- (r6637) status now always uses "I" for ignored directories
* fixed 'svn copy':
- (r6704, #1313) copy between 2 repositories errors cleanly now
- (r6649, #1444) seg fault when copying empty dir from repos to wc
* fixed 'svn export':
- (r6652, #1461) exporting an empty directory
- (r6664, #1296) path->path exports
* fixed - gracefully handle failure to get uid on Win98 (r6695, #1470)
* fixed - avoid spurious conflicts when merging binary files (r6621, #1319)
* fixed - merge of a single file into implicit '.' (r6630, #1150)
* fixed - various Win32 innosetup improvements/fixes (r6693, r6656, #1133)
* fixed - disallow ".." in svn:externals target paths (r6639, #1449)
* fixed - use 'env' instead of hard-coded paths in scripts (r6626, #1413)
* fixed - bug in loading incremental dumpfiles (r6595)
* fixed - performance issue in svn_load_dirs.pl fixed (r6623, r6627, #1455)
* fixed - handle IPv6 addresses in URLs (r6638, r6654, #1338)
* changed - 'svn resolve' renamed to 'svn resolved' (r6597)
* changed - 'svnlook tree' takes new optional path-in-repos argument (r6583)
* changed - renamed 'svnadmin archive' to 'svnadmin lsdblogs'; offer
either all logs, or just the unused ones (r6661)
* changed - now offer full-text search in Windows documentation file (r6658)
* changed - much documentation updated, especially the book
* Many other fixes and changes, too numerous to mention individually.
Developer-visible changes:
* fixed - many improvements to Perl and Python bindings, including some
Win32-specific improvements (r6619, r6686, r6590, r6580, r6579)
* All other important dev changes are implied by the user-visible changes.
Version 0.26.0 (released 24 July 2003, revision 6550, branches/release-0.26.0)
User-visible changes:
* fixed - --parent-dir option to svnadmin load (r6436)
* fixed - 'svnlook diff' now properly displays diffs (r6408, #1241)
* fixed - 'svn cat' no longer expands values from the wrong revision.
* fixed 'svn merge':
- (r6447,#1402) -r FOO:PREV works correctly
- (r6452,#1379) no longer prints confusing no-op lines
- (r6500/6503,#1399) warn user when a tree-delta chunk can't be applied
* turn compression off to work around to mod_deflate timeouts (r6509)
Developer-visible changes:
* cvs2svn.py: lots of bugfixing related to branch/tag support
* diff code refactored to allow use by other tools (r6407)
* make 'svn export' set commit-timestamps (not ready yet) (r6420)
* fixed - memory leaks in libsvn_ra_dav commits (r6422)
* fixed - cvs2svn.py handles branch files rooted in dead revs (r6482,#1417)
* fixed - new lines now detected in svn:author property (r6497,#1401)
* fixed - svn_load_dirs works w/ absolute paths (r6507, Debian bug #187331)
* changed - build infrastructure now supports Perl SWIG bindings (r6441)
* removed - PORTING document no longer necessary (r6472)
Version 0.25.0 (released 11 July 2003, revision 6394, branches/release-0.25.0)
User-visible changes:
* command line options:
- new --force option for svn export (r6327,#1296)
- new --force-log for commit, copy, delete, import, mkdir, move (r6294)
- no longer need --force for commit
* commands
- new - svnadmin archive (r6310)
- changed - svn import syntax now 'svn import [PATH] URL' (r6288,#933,#735)
- fixed - Search PATH for external diff commands (r6373)
- fixed - 'svn switch' memory bug (r6296)
- fixed - 'svn mkdir' coredump (r6388,#1369)
* python bindings now in -tools rpm for Mandrake 9.1 (r6374)
* allow parent-into-child copies, provided they are not WC->WC. (r6348,#1367)
* fixed - Apache module installation order (r6382-6,#1381)
* now require apache 2.0.47 (and apr 0.9.4)
* fix 2 commit leaks
* fix mod_dav_svn path-escaping bug
Developer-visible changes:
* Win32 build system
- new - .vcproj files for svn_config project and APR (r6311)
- fixed - SWIG bindings for Win32 (r6304)
- vcproj generator now works (r6316)
- swig's generated .c files now dependent on headers in .i files (r6379)
- refactored code common to dsp & vcproj into gen_win.py (r6328)
* fixed
- SEGFAULTs in SWIG bindings (r6339)
- potential SEGFAULTs in 'REPORT vcc' backward-compatibility code (r6377)
- mod_dav_svn's autoversioning failure on PUT (r6312)
- 'svn switch' memory bug (r6296)
* changed - mailer.py now uses svn_repos_replay()
Version 0.24.2 (released 18 June 2003, revision 6284, branches/release-0.24.2)
User-visible changes:
* fix 'svn export' potential segfault
* fix occasional diff test failures
* fix 'svnadmin dump' memory hog
* fix new-dir-with-spaces bug
Developer-visible changes:
* none
Version 0.24.1 (released 16 June 2003, revision 6249, branches/release-0.24.1)
User-visible changes:
* Fix bug in 'svn log'.
Developer-visible changes:
* none
Version 0.24.0 (released 15 June 2003, revision 6234, branches/release-0.24.0)
User-visible changes:
* new 'svn diff [--old OLD] [--new NEW]' syntax (#1142)
* new --relocate option for svn switch (#951)
* new --version option for svnadmin and svnlook
* new path-based authorization module for apache
* make 'svn checkout' and not just 'svn update' resume a checkout
* .svn directories now hidden on Windows
* config variable 'store-password = no' now actually works
* fix 'svn merge --dry-run'
* fix 'properties hanging after a rename' issue (#1303)
* fix odd behavior of 'svn up -r PREV filename' (#1304)
* fix delete-tracking bug (#1348)
* fix dump and load corner cases (#1290)
* ra_dav server more resilient for foreign deltaV clients
* numerous ra_svn changes - must update clients and servers
* fix export over ra_svn (#1318)
* fix ra_svn error transmission bug (#1146)
* fix ra_svn corruption in tunnel mode (#1145)
* make svnserve multi-threaded on non-fork platforms (now works on Windows)
* remove svnserve -F and -S options
* various memory use improvements (#1323)
* various performance improvements for all protocols
* various performance improvements for 'svnadmin dump' and svnlook
* various subversion book updates (you have read the book right?)
* more cvs2svn.py improvements (and more to follow)
* new debugging script normalize-dump.py to normalize dump output
Developer-visible changes:
* path-based editor drivers
* no more RA->do_checkout()
* update python and java bindings
* various windows build fixes
Version 0.23.0 (released 16 May 2003, revision 5962, branches/release-0.23.0)
User-visible changes:
* 'svn cat' now performs keyword expansion (#399)
* 'svn export' keyword expansion fixed
* checkouts are now restartable (#730)
* ssh ra_svn tunnel agent specified with svn+ssh://hostname/path syntax.
* remove dependency on external diff program
* don't error out early on unversioned files (#774)
* fix commands where REPORT fails if item isn't in HEAD (#891)
* updates now receive checksums like checkouts (#1101)
* 'svn revert dir' now resets property timestamp (#1163)
* fix instances of client showing help instead of error message (#1265)
* fix incorrect path in 'not a working copy' error messages (#1291)
* fix cvs2svn.py file added on branch problem (#1302)
* fix various vc-svn.el problems (#1257, #1268)
* fix various psvn problems (#1270)
* various Win32 build fixes
Developer-visible changes:
* fix various gcc 3.3 warnings (#1031)
* fix various memory errors/leaks
* remove java/jni bindings
Version 0.22.2 (released 13 May 2003, revision 5918, branches/release-0.22.2)
User-visible changes:
* fix Win32 build
* properly handle on-disk template errors
* fix bogus uuid bug in cvs2svn.py
Developer-visible changes:
* none
Version 0.22.1 (released 9 May 2003, revision 5874, branches/release-0.22.1)
User-visible changes:
* fix shared library installation problem
* update cvs2svn.py script
Developer-visible changes:
* none
Version 0.22.0 (released 7 May 2003, revision 5842, branches/release-0.22)
User-visible changes:
* svn diff -r BASE:HEAD and other edge cases fixed (#977)
* svn diff and merge now have --ignore-ancestry option (#1034)
* svn ci -N DIR no longer errors during post-commit (#1239)
* ra_dav now optional (#617)
* update vn-svn.el (#1250, #1253)
* improvements to svn_load_dirs.pl (#1223, #1215)
* misc ra_svn bug fixes and protocol change
* log-encoding option now properly only applied to logs
* fix mmap failures on HP-UX
* fix some client memory leaks
Developer-visible changes:
* finish transition to new xml prop namespaces for mod_dav_svn (#840)
* minimize full tree locks and number of system calls (#1245)
* auto-generated .dsp files (#850)
* fix ETag of directory (#1251)
* added export editor (#1230)
Version 0.21.0 (released 15 Apr 2003, revision 5639, branches/release-0.21)
User-visible changes:
* SSL client and server certificate verification
* authentication info now stored in ~/.subversion/auth/
* svn diff on a copied file only shows local mods, not the whole file
* svn propget now takes a --strict option to control output
* svnadmin load now takes a --parent-dir option
* added the new 'svndumpfilter' program
* svnlook now has 'cat', 'propget', and 'proplist' commands to enable
viewing this information on transactions
* 'svn copy' from another repository now adds without history
* tag/branch conversion disabled in cvs2svn until it gets fixed
* the 'anonymous' user is no longer used; we simply avoid attaching an
author property when an author is not available
* improvements to ignored-file handling
* Python ConfigParser-style variable expansion for config file (#1165)
Developer-visible changes:
* introduced the svn_filesize_t type (#639)
* realmstring added to the svn_auth framework
* the "result checksum" moved to the editor.close_file function
* more checksumming here and there
* initial work to enable binary properties via ra_dav
* initial, internal support for compressed streams
* test framework shifting to exception-based failure recording (#1193)
* improved options and handling in the C test framework
* java and python binding work
* libsvn_auth folded into libsvn_subr
* bug fixes: 'svnadmin load' parse bug; ra_svn crashes (#1160); 'svn
log' on a switched wc (#1108); 'svn ci -N' on named files (#1195)
Version 0.20.1 (released 26 Mar 2003, revision 5467, branches/release-0.20.1)
User-visible changes:
* fix svnadmin load bug so that property deletions actually occur
* fix checksum compatibility issue for older repositories
Developer-visible changes:
* none
Version 0.20.0 (released 20 Mar 2003, revision 5410, branches/release-0.20)
User-visible changes:
* new compatibility rule: require only that each interim release be
compatible with the one before it (see HACKING)
* ra_svn is still new so above rule doesn't yet apply
(i.e. 0.20 over ra_svn is NOT compatible with previous releases)
* merge infers the target path (see book chapters 4 & 8)
* merge continues in presence of missing target file
* merge's add notifications are no longer duplicated
* commands can be safely interrupted (Ctrl-C)
* --encoding global default in ~/.subversion/config
* new option --editor-cmd
* begin multi-release transition to escape binary properties over DAV
* misc performance improvements
Developer-visible changes:
* RA vtable functions take pool argument
* svn-config --includes path fixed
* uuid at creation now complete
* start having test failures throw exceptions rather than return errors
* test suite option --cleanup with --verbose being default mode
* continued diff library development
* minor revprop hook changes
* bug fixes: no diff on binary files (#1019), consistent error messages
(#1181), version numbers in hook scripts (#1182), win98 codepage (#1186)
Version 0.19.1 (released 12 Mar 2003, revision 5303, branches/release-0.19.1)
User-visible changes:
* fix svnserve tunnel mode pipe close bug
Developer-visible changes:
* none
Version 0.19.0 (released 10 Mar 2003, revision 5262, branches/release-0.19)
User-visible changes:
* svn ls works on wc paths (#1130)
* new cvs2svn.py features and bug fixes (1105)
* new svnlook subcommand 'uuid'
* new svnadmin create option '--bdb-txn-nosync' (use with care)
* fix svnserve help output
* SVN_EDITOR now overrides svn-editor in ~/.subversion/config
* miscellaneous performance improvements (memory and speed)
* more work on the Book
Developer-visible changes:
* start implementing cancellation of long-running functions
* misc windows build fixes and features (DSP generator)
* -W and -P options to stress.pl
* start adding support for multiple fs backends
* work on bindings and bindings build system (#1132, #1149)
* bug fixes: ra_dav import/checkout memory usage (#995), control chars
in commit messages (#1025), svn merge memory usage (#1069, #1077),
pre-existing ~/.subversion (#1121), keyword expansion (#1151), line
number in config error message (#1157), svn-tunnel-agent in [default]
(#1158), RA->close RIP (#1164), config-test non-source (#1172)
Version 0.18.1 (released 26 Feb 2003, revision 5118, branches/release-0.18.1)
User-visible changes:
* editor environment variables no longer incorrectly required
* 'svn help import' now displays correct usage
* fix crashes in the internal diff library and ra_dav
* fix Win9x/Me console issue
* cvs2svn.py api fix
* hot_backup.py now correctly removes old backups
Developer-visible changes:
* various rpm package fixes
Version 0.18.0 (released 19 Feb 2003, revision 4968, branches/release-0.18)
User-visible changes:
* renamed the [default] section to [global] in the servers config file
* compression option is now http-compression and lives in servers file
* use internal diff by default rather than external program (#405 in progress)
* symlinked hook scripts now run
* read-only access flag (-R) for svnserve
* quiet flag (--quiet) for svnadmin dump
* --ignore-uuid and --force-uuid for svnadmin load
* miscellaneous performance improvements
* more work on the Book
Developer-visible changes:
* new authentication library libsvn_auth (#724)
* new bdb table uuids
* client context object in libsvn_client
* more work on java and other language bindings
* test framework now has a quiet option (-q)
* miscellaneous small code cleanups
* bug fixes: more valgrind memory bugs, apr xlate i18n mess (#872),
non-existent URL checkout (#946), props on to-be-deleted files (#1066),
ra_svn move/copy (#1084), eol translation (#1085), ra_svn
checksumming (#1099), cat command corrupt output (#1104), cvs2svn
memory consumption (#1107), merge of property add (#1109),
'..' relative path (#1111), commit/cleanup/diff3 (#1119),
.svn/entries checksum (#1120), svn commit in / (#1122),
status on uncontrolled directory (#1124), commit message eol
characters (#1126), cat -r PREV (#1134), ra_dav wcprops (#1136)
split XML cdata/attribute encoding (#1118)
Version 0.17.1 (released 22 Jan 2003, revision 4503, branches/0.17.1)
User-visible changes:
* changed non-baseline build version number display.
* compatibility change: make sure old clients can talk to newest servers.
* some changes to the Book
Developer-visible changes:
* dumper/loader now use checksums (#1102)
* miscellaneous small code cleanups
* bug fixes: eol-style timestamp changes (#1086), valgrind mem bug,
better checksum error reporting,
Version 0.17.0 (released 20 Jan 2003, revision 4468, branches/0.17)
User-visible changes:
* 'svn add' is now recursive by default, -N to disable (#1073)
* new 'svnversion' program summarizes mixed-revs of a working copy
* huge improvements to the mailer.py tool
* more work on the Book and man page
* default global-ignores now built-in, new runtime-config file commented out
Developer-visible changes:
* checksums, checksums everywhere (issues #649, #689):
- filesystem stores them, and verifies them when reading/writing
- working copy stores them, and verifies them when reading/writing
- checksums transferred both ways over network, RA layers verify them
* finish draft of internal diff/diff3 library -- ready for testing/optimizing
* more utf8<->apr conversion work (#872)
* more work on swig/python and ruby bindings
* improvements to win32-innosetup package
* 'svnserve' now has an official IANA-assigned portnumber.
* mod_dav_svn now only sends/understands new xml prop namespaces (#840)
* bug fixes: stop needless fs rep data copies (#1067), wc auth
caching bugs (#1064), use APR_BUFFERED to open files (#1071), lots
of wc 'missing dir' edge-case bugs (#962), prevent wc from
receiving '.svn' (#1068), don't commit symlinks (#1081), better
diff labels (#1080), better fulltext tmpfile names in conflicts (#1079),
prevent ra_dav from deleting out-of-date items (#1017), segfault (#1092),
don't attempt checksum on missing tmp textbase (#1091), allow diffs
during update again (yikes!)
Version 0.16.1 (released 6 Jan 2003, revision 4276)
User-visible changes:
* ra_svn network layer (apache alternative) now tested & ssh-tunnelable
* new (experimental) mod_dav_svn autoversioning feature (SVNAutoversioning)
* reorganization of the ~/.subversion/ run-time config files.
* more entry caching: approx. 3x speedup on checkouts & updates.
* option rename: --non-recursive instead of --nonrecursive
* option rename: --no-diff-deleted instead of --no-diff-on-delete
* new 'svn log --quiet'
* new 'svn diff --no-diff-deleted'
* fix keyword expansion behaviors ($keyword:$ / $keyword$ / $keyword: $)
* handle win32 non-ascii config-file paths (#968, #1048, part of #872)
Developer-visible changes:
* most public header files now using doxygen markup
* new (untested) internal difflib (#405)
* neon debugging now tweakable via run-time config file
* more progress on Subversion Book rewrite.
* new ./configure --with-diffutils
* begin work on client/server checksums (#649)
* regression tests now depend on svnadmin dump/load
* lose src_err field of svn_error_t
* many fs function renames: begins fs database back-end abstraction.
* new libsvn_repos prop-validating wrappers
* lots of work on build-system dependency graph generation (for SWIG building)
* swig binding work:
- python svn calls can now run as independent threads
- new java-binding build system
- improved swig building features: --prefix, LDFLAGS behaviors
* many, many bug fixes: wc->repos copies (#1029), #943 followup
(#1023), copies of copies (#830), 'svn resolve' cleans up entries
file (#1021), prop merging (#1012), segfault fixes (#1027, #1055),
autoconf 2.5X (#886), O(1) copies (#717), new 'failed revert'
signal (#714), detect missing schedule-add conflicts (#899, #863),
begin dav namespace switchover (#840), status bugs, url auth
inference (#1038), log bug (#1028), newline prompt (#1039),
svnadmin errorchecking, url syntax errors (#1057, #1058), apr/utf8
work (start #872), and many more.
Version 0.16 (released 4 Dec 2002, revision 3987)
User-visible changes:
* new 'svn cat' subcommand
* new --revprop flag to access revision props, -r for versioned props (#943)
* new "compression" runtime option in ~/.subversion/config
* svnadmin/svnlook now use help system, and some subcommands deleted or moved.
* tool changes:
- new svnshell.py tool
- new mirror_dir_through_svn.cgi script
- new svn_load_dirs.pl features
- updates to vc-svn.el
* --message-encoding is now just --encoding, and affects svn: propvals too.
* major rewrites of chapters 3, 4, 5 of the Subversion Book.
Developer-visible changes:
* new network layer, libsvn_ra_svn! still experimental.
* all svn_error_t's now allocated in subpool of global pool.
* reorganize svnlook/svnadmin subcommands & option-parsing (#540, #915, #910)
* all log messages and svn: props now stored as UTF8/LF endings (#896)
* huge cleanup/reorg of all svn_path_* routines
* svn_client_status sends feedback, distinguishes unversioned vs. ignored
* improvements to swig typemappings and build processes
* fixes to pool cleanup handlers
* begin abstraction of gen_make.py
* entry-caching improvements
* stop using global apr_xlate objects
* win32-innosetup code added to packages/
* new work on ruby bindings and swig-java bindings
* many, many bug fixes: various small coredumps, svn_error_t leaks,
copy props correctly (#976), copy executable bits correctly (#982),
test-system fix (#882), accidentally imported tmpfile (#964),
ra_local checkout memleak (#985), accidental wc deletion (#988),
better text vs. binary detection (#994), dav log-report error
handling, bad 'svn switch' dav caching (#1000), don't call NULL
callbacks (#1005), bogus switch feedback (#1007), eol-style file
corruption (#920), getdate.y fix (#1009), ra_local error reporting (#900),
start of work on issues #830 and #869.
Version 0.15 (released 7 Nov 2002, revision 3687)
User-visible changes:
* New 'S' indicator in 'svn status' shows switched subdirs
* New --dry-run option added for 'svn merge' (issue #953)
* Fix 'svn update .' to handle svn:externals correctly
* Memory usage of 'svn import' reduced (issue #860)
* Allow 'svn revert' on missing directories scheduled for deletion
* Assorted bug fixes in several exciting flavors
* Documentation improvements
Developer-visible changes:
* #911 (apr and apr-util version at build time)
* Fixed issues #851, #894,
* Testing scripts accept --url=URL and BASE_URL=URL
* Issue #881 (--enable-all-static)
* Delta editors all converted to new-style, and editor composition is gone
* Improve libsvn_wc wcprop handling (issue #806)
* SWIG binding improvements
* Various pool usage improvements
Version 0.14.5 [Alpha Interim 5] (released 30 Oct 2002, revision 3578)
User-visible changes:
* allow --incremental option for 'svn log' xml output
Developer-visible changes:
* autoconf bugfix for berkeley-db detection
* clean up property interface mess (part of #806)
* dish.sh bugfix: build the new docbook docs correctly
* python tests now log commands
* gen-make.py now assumes 'build.conf'
Version 0.14.4 [Alpha Interim 4] (released 29 Oct 2002, revision 3553)
User-visible changes:
* new working-copy entry-caching: speeds many ops up to 5x (#749)
* new 'svnadmin recover', instead of db_recover
* client can now view & change server-side revision props (e.g. log messages)
* new --non-interactive switch for commandline client
* new --incremental option to 'svn log'
* new -r {date} syntax for specifying dated revs; works over network too.
* automatically set svn:executable prop when adding or importing (#870)
* initial $EDITOR text now ignores all log data below special token
* consistify behavior of text & prop columns in 'svn status' output.
* .svn/auth/* files now chmod 700, to stop scaring people. :-)
* improved labels in 'svn diff' output (#936)
* run-time adjustable neon timeout in newly renamed 'servers' config file
* big improvements to cvs2svn script: bugfixes and basic branch/tag support
* new python access-control hook script
* no more implicit dot-target for 'svn propedit' or 'svn propset' (#924)
* Win32 improvements:
- use system-wide config-file/registry
- run-time configurable diff/diff3 binary locations (#668)
* remove obsolete --xml-file support
* Handbook is now ported to Docbook, 2 new chapters.
Developer-visible changes:
* abstracted option/help-parsing code, now shared between svn and svnadmin
* require apache 2.0.42
* use neon 0.23.5: fix XML entity derefs, SSL server certs, HP-UX build, etc.
* support Berkeley DB 4.0 *or* 4.1
* many SWIG binding improvements:
- better overall coverage of apr and libsvn_* library symbols
- new 'make swig-py-ext' and 'make install-swig-py-ext' targets
* finish conversion of all editor/drivers to "new" style (#737)
* removed xml-delta editors and editor drivers and related tests
* new predicate-logic system added to automated-test system ("skip" support)
* more work on mailer.py
* no more lost commit messages (#761)
* eradication of misused stringbufs, obsolete code removal (#909)
* mem-leak fixes in libsvn_fs (#860)
* improved atomicity of working-file translations (#914)
* improve ./configure --help output (#949)
* MANY bugfixes, especially for entry-locks (#931, #932, #847, #938),
merges (#880, ), auth storage (#934); also #921 (svnadmin
segfault), #907 (xml quoting), #918 (post-commit processing), #935
(path canonicalization), #779 (diff errors)
Version 0.14.3 [Alpha Interim 3] (released 20 Sept 2002, revision 3200)
User-visible changes:
* new ~/.subversion/config file
* new $Id$ keyword
* new client --no-auth-cache option
* empty values in the Windows Registry are no longer ignored (issue #671)
* report details of repository start-commit or pre-commit hook errors
* fix locking behaviour when using current directory as a target
* updated man page
* new front-page logo. :-)
Developer-visible changes:
* continuing work on python SWIG bindings
* continuing work on new access-baton system for libsvn_wc
* upgrade to neon 0.23.4 to fix Windows build issues and seg faults
* add XFAIL to the C testing framework
* prevent setting of certain svn: props on incorrect file types
* cleanup libsvn_subr's path library behavior
* new 'fast-clean' vs. 'clean' Makefile targets
* various bugfixes, tweaks, cleanups.
Version 0.14.2 [Alpha Interim 2] (released 22 Aug 2002, revision 3033)
User-visible changes:
* fs schema change, see issue #842. **NOTE: repos dump/load cycle required!**
* new 'svn ls -R' option
* new status code `~', for type changes
* add --username and --password options to 'svn ls'
* new script tools/client-side/svn_all_diffs.pl
* new script tools/examples/blame.py (draft)
Developer-visible changes:
* test suite now does XFAIL and XPASS
* test suite over DAV now uses SVNParentPath, no longer depends on symlinks
* DAV tests now work on Windows
* upgrade to neon 0.22.0
* 'make install' notices the $(DESTDIR) parameter
* new dav prop namespaces, but old still sent for compat; see issue #840
* error code space reorganized, see issue #702
* many cleanups to path handling
* more use of access batons in libsvn_wc, see issue #749
* working props now stored with ".svn-work" extension, see issue #618
* the usual round of bug fixes, new regression tests, etc
Version 0.14.1 [Alpha Interim 1] (released 9 August 2002, revision 2927)
User-visible changes:
* show copy-ancestry in 'svn log -v'
* 'svn co' can take multiple URLs now
* new 'svn ls' command
* new 'svn st --no-ignore' option
* new 'svn --version --quiet' option
* more conservative 'svn help' usage error-message
* more graceful degradation from charset conversion failure
* standardize policy of -q switch behavior
* less intimidating error output
* new SVNParentPath directive for mod_dav_svn <Location>s
* svnlook now correctly displays copied subtrees
* Handbook: additions, tweaks, cleanups, and new French Translation :-)
* svn_load_dirs.pl: auto propset on files matching specified regex, bug fixes
Developer-visible changes:
* integrated the delta-combiner! (issue #531)
* integration of libsvn_wc-baton-locking branch (issue #749)
* new "skip-deltas" added to delta-combiner
* properly URI-encode/decode path components throughout our code
* RA->do_diff() made independent from RA->do_switch().
* stricter setting/parsing of svn:mime-type property in client and server.
* new 'install-static' make target
* extend SWIG bindings to libsvn_wc and libsvn_client
* BerkeleyDB usage tweaking: in preparation for auto-recovery features.
* work on #850 (.dsp generator)
* Better support for incremental dumps (see revision 2920)
* started fs branch work on #842 (copyID inheritance), #830 (copies of
copies), #790 (copy table uses txnID), #815 (custom sorting)
* numerous bugfixes: #709 (better error handling), #813/814
(apr_filepath_merge), #685 (showing dir propdiffs), OS X dumper
bugfix, #561 (property conflict detection), mod_dav_svn path bugs,
svn_wc_status() bugs, path canonicalization bugs, #816 (svn log -r),
#843 (URL keyword), #846 (kind-change replacement), #809 ($EDITOR dir),
#855 (module updates not cooperating with new wc access batons),
improvements to test suite sensitivity,
Version 0.14.0 [Alpha] (released 23 July 2002, revision 2667)
User-visible changes:
* finally some documentation: The Subversion Handbook
* i18n support for paths, prop names, and log messages; (not on Win32 yet)
* support for URI-escaped paths
* "-R" is now short for --recursive, and "-N" replaces "-n"
* add the -R option to 'svn info' and 'svn resolve'
* new syntax for 'svn switch' and 'svn co'
* new 'svn-config' file installed
* new commit-access-control.pl utility (feature #775)
* new vc-svn.el, first pass at Emacs VC support for Subversion
* lots of work on svn_load_dirs.pl (provides vendor-branch-like features)
* new --message-encoding option for logfiles given by -F
* support win32 drive-letters in file:/// urls
* improved date output syntax: ISO-8601 prefix, then human-friendly suffix
* the usual round of bug fixes
Developer-visible changes:
* UTF-8 changes
- all libraries now assume UTF-8 input paths and log msgs
- many apr calls are now abstracted into new svn_io_* wrappers
* fs schema change
- cache each revision's changed-paths in a new 'changes' table
- another repository dump/load is required
* a number of fs-dumper bugfixes and redesigns
* test suite is now all python, so it can run on win32
* reduce huge memory consumption of mod_dav_svn during checkouts
* memory optimizations for prop-reading and 'svn diff'
* bugfixes for commit-email.pl and tweak-log.cgi
* lots of branch work on the delta-combiner and on libsvn_wc rewrite
* numerous bugfixes: 'svn merge .' bug (#748), bug #764, two new
ghudson-dirversioning bugs, #756, #675, #783, #796, wc-root bugs,
#799, #800, #797, directory-removal bugs (#611, #687)
Version 0.13.2 [Pre-Alpha] (released 28 June 2002, revision 2376)
User-visible changes:
* fixed various buggy commandline outputs
* allow global/local config-files on win32
* prevent overwrites with 'svn cp URL URL'
* improvements to svn_load_dirs.pl
* mod_dav_svn can generate xml output for directory GETs
* new svnadmin(1) man page
Developer-visible changes:
* finished notification callback system, no more buggy output
* fs-changes:
- revisions table nothing but an index to txns table
- branch work-in-progress: new 'changes' table to store changed paths
* more work on svn_time_* funcs and formats (moving towards ISO8601)
* property reversion bugs fixed, dumper bug fixed
* add version number to svndiff database storage
* new regression tests for 'svn merge'
* fix 'svn diff -rX:Y' server bug
* fix bugs in python test system
* bring win32 build up-to-date, get most python tests working on win32
Version 0.13.1 [Pre-Alpha] (released 20 June 2002, revision 2291)
User-visible changes:
* "modules" are now implemented
* new 'svn export' command
* 'svn log' now traverses copy history and can print changed paths
* 'svn merge' now (temporarily) only merges into '.'
* 'svnadmin lscr' now traverses copy history
* changes to the 'svn:executable' prop take effect immediately now
* server is more tolerant of wc's with old-style version resource URLs
* new Handbook started
* commit-email.pl fixes/improvements -- now shows prop mods and copy history
* bug fixes to cp, rm, merge, revert, admin dump and load, svnlook
Developer-visible changes:
* headers now install in subdir and libs are named libsvn_FOO-1.so
* improvements to the Python test suite
* delta combiner implemented (unused for now, though)
* Python SWIG binding improvements: ability to write an editor in Python
* new example: tools/examples/svnlook.py
* start moving libsvn_client to new notification system (no composed editors!)
* upgrade to neon 0.21.2, fixing deflated communication with apache
* Moved Berkeley-specific code to libsvn_fs/bdb/, skels into libsvn_fs/util/
* changes to the RPM packaging
Version 0.13.0 [Pre-Alpha] (released 10 June 2002, revision 2140)
User-visible changes:
* repositories have a new database schema; existing ones must be upgraded!
- new svnadmin 'dump'/'load' commands to migrate repositories
- read http://svn.apache.org/repos/asf/subversion/trunk/notes/repos_upgrade_HOWTO
Developer-visible changes:
* complete rewrite of filesystem schema!
- skels are abstracted away, opening the door to SQL backends
- node-ids now have copy IDs
* huge progress on module system [only checkouts work at the moment]
* massive conversion of stringbufs to char* in our public APIs
* vsn-rsc-urls are now based on created-rev/path instead of fs_id_t's.
* reinstate 'deleted' flag on entries, to ensure accurate update reports
* dir_delta learns how to send copy history
- svnlook no longer sends 10MB emails when we make a branch
- dumpfiles get much smaller
* memory consumption reduced via new apr-pool code that reuses/frees mem
* client can now parse ISO-8601 timestamps (start of issue 614)
* added script for stress-testing concurrent repository access
* auto-locate apache's apr libraries at build-time
* beginnings of ra_pipe library
* progress on delta combiner code
* many memleaks fixed, thanks to valgrind!
* upgrade to newest neon, allow deflated communication with apache
* many bugfixes to merge, switch, checkout, rm; tackling of issues 704,
705, 698, 711, 713, 721, 718 and many others
Version 0.12.0 (released 3 May 2002, revision 1868)
User-visible changes:
* 'svn diff' can now compare two arbitrary URLs
* 'svn diff' now displays property changes
* 'svn rm' requires --force for unversioned and/or modified items
* 'svn rm' immediately removes files & uncommitted dirs
* 'svn mv' for WC->WC behaves like 'svn rm' with respect to the source
* checkouts, updates, switches now print received revision on final line.
* new 'svn info' command prints information about a versioned resource.
* switch to 2-part conflict markers (diff3 -E) instead of 3-part (diff3 -A)
* new bash programmable completion file
* file's executable bit can be versioned (svn:executable prop)
* commits and imports now support --nonrecursive option
* new --xml option for 'svn log'
* new 'svnadmin dump' command
Developer-visible changes:
* updates correctly deal with disjoint urls.
* libsvn_wc now checksums text-bases, to detect working copy corruption
* cached wcprops (vsn-rsc-urls) now auto-regenerate if invalid
* python testsuite now runs on Win32.
* new switch_tests.py added to testsuite
* NEW internalized diff/diff3 library. Not yet integrated/tested.
* dir_delta sends entry props; pipe-editor removed.
* no more expat/ tree; use apr-util's expat instead.
* fs deltificaton happens outside commit process, using fewer db locks
* privatize svn_fs_id_t structure
* start abstracting skels out of libsvn_fs
* new docs: secure coding tips, quickref card
* memory bugfixes for import/commit/mass removals
* many bugfixes: issues 644, 646, 691, 693, 694, 543, 684
Version 0.11.1 (released 12 April 2002, revision 1692, branches/0.11.0)
User-visible changes:
* completion of 'svn merge' (issue 504)
* added SVNReposName directive to mod_dav_svn
* insist on a diff binary that supports "-u"
* fix and unify pop-up $EDITOR behaviors (issues 638, 633, 615)
Developer-visible changes:
* finish rewrite of commit system to handle disjoint urls (issue 575)
* finish proxy support via config files (esp. on win32) (issue 579)
* fix svn_ra_dav__get_baseline_info and related bugs (issue 581)
* reorganization of libsvn_wc header files & API
* new getopt_tests.py to test commandline option processing
* 'make check' now more portable -- tests invoked via python, not sh
* miscellaneous bugfixes in imports, svndiff, db linkage.
Version 0.11.0 (unreleased)
Version 0.10.2 (released 25 Mar 2002, revision 1587)
User-visible changes:
* new ~/.subversion configuration directory
* proxy support via ~/.subversion/proxies file
Developer-visible changes:
* rewrite of client-side commit process partially done
* beginnings of 'svn merge'
* mod_dav_svn now generates "streamy" report responses
* stringbuf cleanups and bugfixes
* interface to svn_wc_entry_t cleaned up
* tweaks to build system and freebsd port
* miscellaneous bugfixes in path escaping, pool usage, hp-ux compilation
Version 0.10.1 (released 17 Mar 2002, revision 1537)
User-visible changes:
* New --targets command-line option for some commands.
* conflicts now create conflict-markers in files, and 3 fulltext backups.
* new 'svn resolve' command removes conflicted state (by removing backups)
Developer-visible changes:
* no more dependency on 'patch'; only on GNU diff3 and some version of 'diff'
* complete rewrite of svn_wc_entry_t interface
* begin abstracting svn_fs API by hiding implementation details
* consolidate RA layer callbacks
* start work on commit-driver rewrite
* start work on ~/.subversion/ configuration directory, and proxy support
* move a lot of svn_wc.h into private wc.h
* bugfixes relating to commits, network prop xfers, 'svn log', 'svn co -q'
* major deletion bug fixed
(see email WARNING:
http://subversion.tigris.org/servlets/ReadMsg?msgId=64442&listName=dev)
Version 0.10.0 (released 08 Mar 2002, revision 1467)
User-visible changes:
* fewer out-of-memory errors: (see "memory consumption" below)
* clearer user errors:
- detailed marshalling of server errors to client
- better errors from ra_dav
- better commandline-client-specific error messages
* 'svn log' now works on single paths correctly
* show locked directories in 'svn status'
* 'svnadmin lstxns' improvements, and new --long switch
* commits show "Replacing" instead of "Deleting/Adding" (#571)
* commits show progress on postfix txdeltas.
* WARNING: existing repositories need to be upgraded;
read tools/enable-dupkeys.sh.
Developer-visible changes:
* reduced memory consumption
- new Editor interface that manages pools automatically
- conversion of most existing editors to new system
- have libsvn_fs write data to DB streamily
- reduce DB logfile growth via 'duplicate keys'
- stop using one pool for post-commit processing
- stop using one pool for sending all textdeltas
- many, many other pool-usage improvements in libsvn_wc, ra_dav, etc.
* start of work on 'svn merge": issue 504, and diff3 integration
* start of work on disjoint-url detection: issue 575
* start removing stringbuf path library funcs; use new const char * funcs
* better python 2.X detection in test suite
* svnlook uses single tempdir
* build system evolution
- upgrade to neon 0.19.[2-3]
- lots of work on FreeBSD port
* many small bugfixes:
- propedit, file merges, revert, dir_delta, keywords
- memory leaks in 'svn add', 'svn import/commit', and svnlook
- date-parsing and readonly bugs
Version 0.9 (released 15 Feb 2002, revision 1302)
User-visible changes:
* 'svn switch', for switching part of a working copy to a branch
* 'svn status -v' now shows created-rev and last-author info
* 'svn help <subcommand>' now shows proper switches
* if no log message passed to commit, $EDITOR pops up
* greatly improved/re-organized README, INSTALL, and HACKING docs
* big progress on cvs2svn repository converter
* faster retrieval of old revisions: turn off fs directory deltification
* fixed broken behaviors in 'svn diff' and 'svn log'
Developer-visible changes:
* new fs code for detecting differences and relatedness
* new cancellation editor, for event-driven users of libsvn_client
* make .svn/ area readonly
* continued development of ruby, java, and python (swig) bindings
* new config-file parser
* code reorganization and cleanup
- huge conversion of svn_stringbuf_t --> char *
- standardized on commit_info return structure
- no more 'path styles' in path library
- rewrite bootstrapping code for python test framework
- rewrite commandline app's help-system and alias-system
- feedback table replaced with notfication callback
- rewrite sorting of hashes
- svnadmin internal rewrite
- faster post-update processing
- using SVN_ERR macros where they weren't
- new svn_client_revision_t mechanism
- txdelta windows are readonly now
- pool debugging code moved to APR
- various pool-usage fixes
* build system evolution
- apr-util now required
- upgrade to neon 0.18.5
- much apr m4 macro churn
- win32 updates, no longer needs precompiled neon
- 'make check' when builddir != srcdir
* fixes for many issues, including #624, 627, 580, 598, 591,
607. 609, 590, 565
[Versions 0.8 and older are only brief summaries]
Version 0.8 (released 15 Jan 2002, revision 909)
* newline conversion and keyword substitution (#524)
* rewrite ra_local commit system to commit against HEAD (#463)
* mod_dav_svn sends svndiffs now (#518)
* code migration from libsvn_fs to libsvn_repos (#428)
Version 0.7 (released 03 Dec 2001, revision 587)
* 'svn cp/mv' completed:
- can copy from wc/repos to wc/repos
- This how we create branches/tags
* 'svn mkdir' [WC_PATH|REPOS_URL]
* 'svn delete' [REPOS_URL]
Version 0.6 (released 12 Nov 2001, revision 444)
* 'svn log'
* 'svn cp/mv' from wc to wc
Milestones M4/M5 (released 19 Oct 2001, revision 271)
* network layer bugfixes
* filesystem deltification
Milestone M3 (released 30 Aug 2001, revision 1)
* self-hosting begins, all history left behind in CVS repository.
Milestone M2 (released 15 May 2001, from CVS, "milestone-2" tag)
* filesystem library (libsvn_fs)
* network layer (libsvn_ra_dav and mod_dav_svn)
Milestone M1 (released 20 Oct 2000, from CVS, "milestone-1" tag)
* working-copy library (libsvn_wc), using XML files
Birth (05 June 2000)
* CVS repository created.
Index: stable/11/contrib/subversion/README
===================================================================
--- stable/11/contrib/subversion/README (revision 309510)
+++ stable/11/contrib/subversion/README (revision 309511)
@@ -1,84 +1,84 @@
Subversion, a version control system.
=====================================
-$LastChangedDate: 2012-02-10 14:58:53 +0000 (Fri, 10 Feb 2012) $
+$LastChangedDate: 2016-05-31 16:08:20 +0000 (Tue, 31 May 2016) $
Contents:
I. A FEW POINTERS
II. DOCUMENTATION
III. PARTICIPATING IN THE SUBVERSION COMMUNITY
IV. QUICKSTART GUIDE
V. CONVERTING FROM CVS
I. A FEW POINTERS
For an overview of the Subversion project, visit
http://subversion.apache.org/
Once you have a Subversion client you can get the latest version
of the code with the command:
$ svn co http://svn.apache.org/repos/asf/subversion/trunk subversion
II. DOCUMENTATION
The main documentation is the Subversion Book - an on-line version
can be found at:
http://svnbook.red-bean.com/
It is written in DocBook XML, and the sources can be found at:
- http://svnbook.googlecode.com/svn/trunk/
+ http://svn.code.sf.net/p/svnbook/source/trunk/
If you wish to build the documentation from source, read the
- src/en/README file within the book source.
+ en/README file within the book source.
III. PARTICIPATING IN THE SUBVERSION COMMUNITY
First, read http://subversion.apache.org/docs/community-guide/
It describes Subversion coding and log message standards, as well
as how to join discussion lists.
Talk on IRC with developers: irc.freenode.net, channel #svn-dev.
Read the FAQ: http://subversion.apache.org/faq.html
IV. QUICKSTART GUIDE
See the final section of the first chapter of the Subversion Book.
V. CONVERTING FROM CVS
If you're a CVS user trying to move your CVS history over to
Subversion, then be sure to visit the 'cvs2svn' project:
http://cvs2svn.tigris.org
You can get the latest released version of the cvs2svn converter
from the project downloads area:
http://cvs2svn.tigris.org/servlets/ProjectDocumentList?folderID=2976
Please note that the cvs2svn project is a *separate* project from
Subversion. If you have problems with cvs2svn or are confused,
please email the cvs2svn project's mailing lists, not the
Subversion lists.
Finally, be sure to see Appendix B in the Subversion Book. It
contains a very quick overview of the major differences between
CVS and Subversion.
Index: stable/11/contrib/subversion/build-outputs.mk
===================================================================
--- stable/11/contrib/subversion/build-outputs.mk (revision 309510)
+++ stable/11/contrib/subversion/build-outputs.mk (revision 309511)
@@ -1,3502 +1,3502 @@
# DO NOT EDIT -- AUTOMATICALLY GENERATED BY build/generator/gen_make.py
# FROM build/generator/templates/build-outputs.mk.ezt
########################################
# Section 1: Global make variables
########################################
FS_BASE_DEPS = subversion/libsvn_fs_base/libsvn_fs_base-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la
FS_BASE_LINK = ../../subversion/libsvn_fs_base/libsvn_fs_base-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la
FS_FS_DEPS = subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la
FS_FS_LINK = ../../subversion/libsvn_fs_fs/libsvn_fs_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la
FS_X_DEPS = subversion/libsvn_fs_x/libsvn_fs_x-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la
FS_X_LINK = ../../subversion/libsvn_fs_x/libsvn_fs_x-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la
RA_LOCAL_DEPS = subversion/libsvn_ra_local/libsvn_ra_local-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
RA_LOCAL_LINK = ../../subversion/libsvn_ra_local/libsvn_ra_local-1.la ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la
RA_SERF_DEPS = subversion/libsvn_ra_serf/libsvn_ra_serf-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
RA_SERF_LINK = ../../subversion/libsvn_ra_serf/libsvn_ra_serf-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la
RA_SVN_DEPS = subversion/libsvn_ra_svn/libsvn_ra_svn-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
RA_SVN_LINK = ../../subversion/libsvn_ra_svn/libsvn_ra_svn-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la
BUILD_DIRS = subversion/tests/cmdline subversion/tests/libsvn_subr subversion/tests/libsvn_fs_base subversion/tests/libsvn_client subversion/tests/libsvn_wc subversion/bindings/cxxhl subversion/bindings/cxxhl/tests tools/diff subversion/tests/libsvn_diff subversion/tests/libsvn_repos subversion/tests/libsvn_fs_fs subversion/tests/libsvn_fs subversion/tests/libsvn_fs_x tools/dev subversion/bindings/javahl/src/org/apache/subversion/javahl/callback subversion/bindings/javahl/classes subversion/bindings/javahl/include subversion/bindings/javahl/src/org/tigris/subversion/javahl subversion/bindings/javahl/tests/org/tigris/subversion/javahl subversion/bindings/javahl/src/org/apache/subversion/javahl subversion/bindings/javahl/src/org/apache/subversion/javahl/remote subversion/bindings/javahl/src/org/apache/subversion/javahl/types subversion/bindings/javahl/src/org/apache/subversion/javahl/util subversion/bindings/javahl/tests/org/apache/subversion/javahl gmock-fused subversion/libsvn_auth_gnome_keyring subversion/libsvn_auth_kwallet subversion/libsvn_client subversion/libsvn_delta subversion/libsvn_diff subversion/libsvn_fs subversion/libsvn_fs_base subversion/libsvn_fs_base/bdb subversion/libsvn_fs_base/util subversion/libsvn_fs_fs subversion/libsvn_fs_util subversion/libsvn_fs_x subversion/libsvn_ra subversion/libsvn_ra_local subversion/libsvn_ra_serf subversion/libsvn_ra_svn subversion/libsvn_repos subversion/libsvn_subr subversion/bindings/swig/perl/libsvn_swig_perl subversion/bindings/swig/python/libsvn_swig_py subversion/bindings/swig/ruby/libsvn_swig_ruby subversion/tests subversion/libsvn_wc subversion/bindings/cxxhl/src subversion/bindings/cxxhl/src/aprwrap subversion/bindings/javahl/native subversion/bindings/javahl/native/jniwrapper subversion/po subversion/mod_authz_svn subversion/mod_dav_svn subversion/mod_dav_svn/reports subversion/mod_dav_svn/posts tools/server-side/mod_dontdothat subversion/tests/libsvn_ra_local subversion/tests/libsvn_ra subversion/tests/libsvn_delta subversion/svn tools/server-side tools/dev/wc-ng subversion/svnadmin subversion/svnbench subversion/svndumpfilter subversion/svnfsfs subversion/svnlook subversion/svnmucc tools/dev/svnraisetreeconflict subversion/svnrdump subversion/svnserve subversion/svnsync subversion/svnversion subversion/bindings/swig subversion/tests/libsvn_wc/../../libsvn_subr subversion/bindings/swig/python subversion/bindings/swig/perl subversion/bindings/swig/ruby subversion/bindings/swig/proxy
BDB_TEST_DEPS = subversion/tests/libsvn_fs_base/changes-test$(EXEEXT) subversion/tests/libsvn_fs_base/fs-base-test$(EXEEXT) subversion/tests/libsvn_fs_base/strings-reps-test$(EXEEXT)
BDB_TEST_PROGRAMS = subversion/tests/libsvn_fs_base/changes-test$(EXEEXT) subversion/tests/libsvn_fs_base/fs-base-test$(EXEEXT) subversion/tests/libsvn_fs_base/strings-reps-test$(EXEEXT)
TEST_DEPS = subversion/tests/cmdline/atomic-ra-revprop-change$(EXEEXT) subversion/tests/libsvn_subr/auth-test$(EXEEXT) subversion/tests/libsvn_subr/bit-array-test$(EXEEXT) subversion/tests/libsvn_subr/cache-test$(EXEEXT) subversion/tests/libsvn_subr/checksum-test$(EXEEXT) subversion/tests/libsvn_client/client-test$(EXEEXT) subversion/tests/libsvn_subr/compat-test$(EXEEXT) subversion/tests/libsvn_subr/config-test$(EXEEXT) subversion/tests/libsvn_wc/conflict-data-test$(EXEEXT) subversion/tests/libsvn_subr/crypto-test$(EXEEXT) subversion/tests/libsvn_wc/db-test$(EXEEXT) subversion/tests/libsvn_diff/diff-diff3-test$(EXEEXT) subversion/tests/libsvn_subr/dirent_uri-test$(EXEEXT) subversion/tests/libsvn_repos/dump-load-test$(EXEEXT) subversion/tests/libsvn_wc/entries-compat-test$(EXEEXT) subversion/tests/cmdline/entries-dump$(EXEEXT) subversion/tests/libsvn_subr/error-code-test$(EXEEXT) subversion/tests/libsvn_subr/error-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-pack-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-private-test$(EXEEXT) subversion/tests/libsvn_fs/fs-test$(EXEEXT) subversion/tests/libsvn_fs_x/fs-x-pack-test$(EXEEXT) subversion/tests/libsvn_subr/hashdump-test$(EXEEXT) subversion/tests/libsvn_subr/io-test$(EXEEXT) subversion/tests/cmdline/lock-helper$(EXEEXT) subversion/tests/libsvn_fs/locks-test$(EXEEXT) subversion/tests/libsvn_subr/mergeinfo-test$(EXEEXT) subversion/tests/libsvn_client/mtcc-test$(EXEEXT) subversion/tests/libsvn_wc/op-depth-test$(EXEEXT) subversion/tests/libsvn_subr/opt-test$(EXEEXT) subversion/tests/libsvn_subr/packed-data-test$(EXEEXT) subversion/tests/libsvn_diff/parse-diff-test$(EXEEXT) subversion/tests/libsvn_subr/path-test$(EXEEXT) subversion/tests/libsvn_subr/prefix-string-test$(EXEEXT) subversion/tests/libsvn_subr/priority-queue-test$(EXEEXT) subversion/tests/libsvn_wc/pristine-store-test$(EXEEXT) subversion/tests/libsvn_ra_local/ra-local-test$(EXEEXT) subversion/tests/libsvn_ra/ra-test$(EXEEXT) subversion/tests/libsvn_delta/random-test$(EXEEXT) subversion/tests/libsvn_repos/repos-test$(EXEEXT) subversion/tests/libsvn_subr/revision-test$(EXEEXT) subversion/tests/libsvn_subr/root-pools-test$(EXEEXT) subversion/tests/libsvn_subr/skel-test$(EXEEXT) subversion/tests/libsvn_subr/spillbuf-test$(EXEEXT) subversion/tests/libsvn_subr/sqlite-test$(EXEEXT) subversion/tests/libsvn_subr/stream-test$(EXEEXT) subversion/tests/libsvn_fs_x/string-table-test$(EXEEXT) subversion/tests/libsvn_subr/string-test$(EXEEXT) subversion/tests/libsvn_subr/subst_translate-test$(EXEEXT) tools/dev/wc-ng/svn-wc-db-tester$(EXEEXT) tools/server-side/svnauthz$(EXEEXT) tools/server-side/svnauthz-validate$(EXEEXT) subversion/tests/libsvn_delta/svndiff-test$(EXEEXT) subversion/tests/libsvn_subr/time-test$(EXEEXT) subversion/tests/libsvn_subr/translate-test$(EXEEXT) subversion/tests/libsvn_subr/utf-test$(EXEEXT) subversion/tests/libsvn_delta/vdelta-test$(EXEEXT) subversion/tests/libsvn_wc/wc-incomplete-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-lock-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-queries-test$(EXEEXT) subversion/tests/libsvn_wc/wc-test$(EXEEXT) subversion/tests/libsvn_delta/window-test$(EXEEXT) subversion/tests/libsvn_subr/x509-test$(EXEEXT) subversion/tests/cmdline/authz_tests.py subversion/tests/cmdline/autoprop_tests.py subversion/tests/cmdline/basic_tests.py subversion/tests/cmdline/blame_tests.py subversion/tests/cmdline/cat_tests.py subversion/tests/cmdline/changelist_tests.py subversion/tests/cmdline/checkout_tests.py subversion/tests/cmdline/commit_tests.py subversion/tests/cmdline/copy_tests.py subversion/tests/cmdline/depth_tests.py subversion/tests/cmdline/diff_tests.py subversion/tests/cmdline/entries_tests.py subversion/tests/cmdline/export_tests.py subversion/tests/cmdline/externals_tests.py subversion/tests/cmdline/getopt_tests.py subversion/tests/cmdline/history_tests.py subversion/tests/cmdline/import_tests.py subversion/tests/cmdline/info_tests.py subversion/tests/cmdline/input_validation_tests.py subversion/tests/cmdline/iprop_authz_tests.py subversion/tests/cmdline/iprop_tests.py subversion/tests/cmdline/lock_tests.py subversion/tests/cmdline/log_tests.py subversion/tests/cmdline/merge_authz_tests.py subversion/tests/cmdline/merge_automatic_tests.py subversion/tests/cmdline/merge_reintegrate_tests.py subversion/tests/cmdline/merge_tests.py subversion/tests/cmdline/merge_tree_conflict_tests.py subversion/tests/cmdline/mergeinfo_tests.py subversion/tests/cmdline/mod_authz_svn_tests.py subversion/tests/cmdline/move_tests.py subversion/tests/cmdline/patch_tests.py subversion/tests/cmdline/prop_tests.py subversion/tests/cmdline/redirect_tests.py subversion/tests/cmdline/relocate_tests.py subversion/tests/cmdline/resolve_tests.py subversion/tests/cmdline/revert_tests.py subversion/tests/cmdline/schedule_tests.py subversion/tests/cmdline/special_tests.py subversion/tests/cmdline/stat_tests.py subversion/tests/cmdline/svnadmin_tests.py subversion/tests/cmdline/svnauthz_tests.py subversion/tests/cmdline/svndumpfilter_tests.py subversion/tests/cmdline/svnfsfs_tests.py subversion/tests/cmdline/svnlook_tests.py subversion/tests/cmdline/svnmucc_tests.py subversion/tests/cmdline/svnrdump_tests.py subversion/tests/cmdline/svnsync_authz_tests.py subversion/tests/cmdline/svnsync_tests.py subversion/tests/cmdline/svnversion_tests.py subversion/tests/cmdline/switch_tests.py subversion/tests/cmdline/trans_tests.py subversion/tests/cmdline/tree_conflict_tests.py subversion/tests/cmdline/update_tests.py subversion/tests/cmdline/upgrade_tests.py subversion/tests/cmdline/wc_tests.py
TEST_PROGRAMS = subversion/tests/libsvn_subr/auth-test$(EXEEXT) subversion/tests/libsvn_subr/bit-array-test$(EXEEXT) subversion/tests/libsvn_subr/cache-test$(EXEEXT) subversion/tests/libsvn_subr/checksum-test$(EXEEXT) subversion/tests/libsvn_client/client-test$(EXEEXT) subversion/tests/libsvn_subr/compat-test$(EXEEXT) subversion/tests/libsvn_subr/config-test$(EXEEXT) subversion/tests/libsvn_wc/conflict-data-test$(EXEEXT) subversion/tests/libsvn_subr/crypto-test$(EXEEXT) subversion/tests/libsvn_wc/db-test$(EXEEXT) subversion/tests/libsvn_diff/diff-diff3-test$(EXEEXT) subversion/tests/libsvn_subr/dirent_uri-test$(EXEEXT) subversion/tests/libsvn_repos/dump-load-test$(EXEEXT) subversion/tests/libsvn_wc/entries-compat-test$(EXEEXT) subversion/tests/libsvn_subr/error-code-test$(EXEEXT) subversion/tests/libsvn_subr/error-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-pack-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-private-test$(EXEEXT) subversion/tests/libsvn_fs/fs-test$(EXEEXT) subversion/tests/libsvn_fs_x/fs-x-pack-test$(EXEEXT) subversion/tests/libsvn_subr/hashdump-test$(EXEEXT) subversion/tests/libsvn_subr/io-test$(EXEEXT) subversion/tests/libsvn_fs/locks-test$(EXEEXT) subversion/tests/libsvn_subr/mergeinfo-test$(EXEEXT) subversion/tests/libsvn_client/mtcc-test$(EXEEXT) subversion/tests/libsvn_wc/op-depth-test$(EXEEXT) subversion/tests/libsvn_subr/opt-test$(EXEEXT) subversion/tests/libsvn_subr/packed-data-test$(EXEEXT) subversion/tests/libsvn_diff/parse-diff-test$(EXEEXT) subversion/tests/libsvn_subr/path-test$(EXEEXT) subversion/tests/libsvn_subr/prefix-string-test$(EXEEXT) subversion/tests/libsvn_subr/priority-queue-test$(EXEEXT) subversion/tests/libsvn_wc/pristine-store-test$(EXEEXT) subversion/tests/libsvn_ra_local/ra-local-test$(EXEEXT) subversion/tests/libsvn_ra/ra-test$(EXEEXT) subversion/tests/libsvn_delta/random-test$(EXEEXT) subversion/tests/libsvn_repos/repos-test$(EXEEXT) subversion/tests/libsvn_subr/revision-test$(EXEEXT) subversion/tests/libsvn_subr/root-pools-test$(EXEEXT) subversion/tests/libsvn_subr/skel-test$(EXEEXT) subversion/tests/libsvn_subr/spillbuf-test$(EXEEXT) subversion/tests/libsvn_subr/sqlite-test$(EXEEXT) subversion/tests/libsvn_subr/stream-test$(EXEEXT) subversion/tests/libsvn_fs_x/string-table-test$(EXEEXT) subversion/tests/libsvn_subr/string-test$(EXEEXT) subversion/tests/libsvn_subr/subst_translate-test$(EXEEXT) subversion/tests/libsvn_subr/time-test$(EXEEXT) subversion/tests/libsvn_subr/translate-test$(EXEEXT) subversion/tests/libsvn_subr/utf-test$(EXEEXT) subversion/tests/libsvn_wc/wc-queries-test$(EXEEXT) subversion/tests/libsvn_wc/wc-test$(EXEEXT) subversion/tests/libsvn_delta/window-test$(EXEEXT) subversion/tests/libsvn_subr/x509-test$(EXEEXT) subversion/tests/cmdline/authz_tests.py subversion/tests/cmdline/autoprop_tests.py subversion/tests/cmdline/basic_tests.py subversion/tests/cmdline/blame_tests.py subversion/tests/cmdline/cat_tests.py subversion/tests/cmdline/changelist_tests.py subversion/tests/cmdline/checkout_tests.py subversion/tests/cmdline/commit_tests.py subversion/tests/cmdline/copy_tests.py subversion/tests/cmdline/depth_tests.py subversion/tests/cmdline/diff_tests.py subversion/tests/cmdline/entries_tests.py subversion/tests/cmdline/export_tests.py subversion/tests/cmdline/externals_tests.py subversion/tests/cmdline/getopt_tests.py subversion/tests/cmdline/history_tests.py subversion/tests/cmdline/import_tests.py subversion/tests/cmdline/info_tests.py subversion/tests/cmdline/input_validation_tests.py subversion/tests/cmdline/iprop_authz_tests.py subversion/tests/cmdline/iprop_tests.py subversion/tests/cmdline/lock_tests.py subversion/tests/cmdline/log_tests.py subversion/tests/cmdline/merge_authz_tests.py subversion/tests/cmdline/merge_automatic_tests.py subversion/tests/cmdline/merge_reintegrate_tests.py subversion/tests/cmdline/merge_tests.py subversion/tests/cmdline/merge_tree_conflict_tests.py subversion/tests/cmdline/mergeinfo_tests.py subversion/tests/cmdline/mod_authz_svn_tests.py subversion/tests/cmdline/move_tests.py subversion/tests/cmdline/patch_tests.py subversion/tests/cmdline/prop_tests.py subversion/tests/cmdline/redirect_tests.py subversion/tests/cmdline/relocate_tests.py subversion/tests/cmdline/resolve_tests.py subversion/tests/cmdline/revert_tests.py subversion/tests/cmdline/schedule_tests.py subversion/tests/cmdline/special_tests.py subversion/tests/cmdline/stat_tests.py subversion/tests/cmdline/svnadmin_tests.py subversion/tests/cmdline/svnauthz_tests.py subversion/tests/cmdline/svndumpfilter_tests.py subversion/tests/cmdline/svnfsfs_tests.py subversion/tests/cmdline/svnlook_tests.py subversion/tests/cmdline/svnmucc_tests.py subversion/tests/cmdline/svnrdump_tests.py subversion/tests/cmdline/svnsync_authz_tests.py subversion/tests/cmdline/svnsync_tests.py subversion/tests/cmdline/svnversion_tests.py subversion/tests/cmdline/switch_tests.py subversion/tests/cmdline/trans_tests.py subversion/tests/cmdline/tree_conflict_tests.py subversion/tests/cmdline/update_tests.py subversion/tests/cmdline/upgrade_tests.py subversion/tests/cmdline/wc_tests.py
check-deps test-deps: subversion/tests/cmdline/atomic-ra-revprop-change$(EXEEXT) subversion/tests/cmdline/entries-dump$(EXEEXT) subversion/tests/cmdline/lock-helper$(EXEEXT) tools/dev/wc-ng/svn-wc-db-tester$(EXEEXT) tools/server-side/svnauthz$(EXEEXT) tools/server-side/svnauthz-validate$(EXEEXT) subversion/tests/libsvn_delta/svndiff-test$(EXEEXT) subversion/tests/libsvn_delta/vdelta-test$(EXEEXT) subversion/tests/libsvn_wc/wc-incomplete-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-lock-tester$(EXEEXT)
MANPAGES = subversion/svn/svn.1 subversion/svnadmin/svnadmin.1 subversion/svndumpfilter/svndumpfilter.1 subversion/svnlook/svnlook.1 subversion/svnmucc/svnmucc.1 subversion/svnrdump/svnrdump.1 subversion/svnserve/svnserve.8 subversion/svnserve/svnserve.conf.5 subversion/svnsync/svnsync.1 subversion/svnversion/svnversion.1
CLEAN_FILES = subversion/bindings/cxxhl/cxxhl-tests$(EXEEXT) subversion/svn/svn$(EXEEXT) subversion/svnadmin/svnadmin$(EXEEXT) subversion/svnbench/svnbench$(EXEEXT) subversion/svndumpfilter/svndumpfilter$(EXEEXT) subversion/svnfsfs/svnfsfs$(EXEEXT) subversion/svnlook/svnlook$(EXEEXT) subversion/svnmucc/svnmucc$(EXEEXT) subversion/svnrdump/svnrdump$(EXEEXT) subversion/svnserve/svnserve$(EXEEXT) subversion/svnsync/svnsync$(EXEEXT) subversion/svnversion/svnversion$(EXEEXT) subversion/tests/cmdline/atomic-ra-revprop-change$(EXEEXT) subversion/tests/cmdline/authz_tests.pyc subversion/tests/cmdline/autoprop_tests.pyc subversion/tests/cmdline/basic_tests.pyc subversion/tests/cmdline/blame_tests.pyc subversion/tests/cmdline/cat_tests.pyc subversion/tests/cmdline/changelist_tests.pyc subversion/tests/cmdline/checkout_tests.pyc subversion/tests/cmdline/commit_tests.pyc subversion/tests/cmdline/copy_tests.pyc subversion/tests/cmdline/depth_tests.pyc subversion/tests/cmdline/diff_tests.pyc subversion/tests/cmdline/entries-dump$(EXEEXT) subversion/tests/cmdline/entries_tests.pyc subversion/tests/cmdline/export_tests.pyc subversion/tests/cmdline/externals_tests.pyc subversion/tests/cmdline/getopt_tests.pyc subversion/tests/cmdline/history_tests.pyc subversion/tests/cmdline/import_tests.pyc subversion/tests/cmdline/info_tests.pyc subversion/tests/cmdline/input_validation_tests.pyc subversion/tests/cmdline/iprop_authz_tests.pyc subversion/tests/cmdline/iprop_tests.pyc subversion/tests/cmdline/lock-helper$(EXEEXT) subversion/tests/cmdline/lock_tests.pyc subversion/tests/cmdline/log_tests.pyc subversion/tests/cmdline/merge_authz_tests.pyc subversion/tests/cmdline/merge_automatic_tests.pyc subversion/tests/cmdline/merge_reintegrate_tests.pyc subversion/tests/cmdline/merge_tests.pyc subversion/tests/cmdline/merge_tree_conflict_tests.pyc subversion/tests/cmdline/mergeinfo_tests.pyc subversion/tests/cmdline/mod_authz_svn_tests.pyc subversion/tests/cmdline/move_tests.pyc subversion/tests/cmdline/patch_tests.pyc subversion/tests/cmdline/prop_tests.pyc subversion/tests/cmdline/redirect_tests.pyc subversion/tests/cmdline/relocate_tests.pyc subversion/tests/cmdline/resolve_tests.pyc subversion/tests/cmdline/revert_tests.pyc subversion/tests/cmdline/schedule_tests.pyc subversion/tests/cmdline/special_tests.pyc subversion/tests/cmdline/stat_tests.pyc subversion/tests/cmdline/svnadmin_tests.pyc subversion/tests/cmdline/svnauthz_tests.pyc subversion/tests/cmdline/svndumpfilter_tests.pyc subversion/tests/cmdline/svnfsfs_tests.pyc subversion/tests/cmdline/svnlook_tests.pyc subversion/tests/cmdline/svnmucc_tests.pyc subversion/tests/cmdline/svnrdump_tests.pyc subversion/tests/cmdline/svnsync_authz_tests.pyc subversion/tests/cmdline/svnsync_tests.pyc subversion/tests/cmdline/svnversion_tests.pyc subversion/tests/cmdline/switch_tests.pyc subversion/tests/cmdline/trans_tests.pyc subversion/tests/cmdline/tree_conflict_tests.pyc subversion/tests/cmdline/update_tests.pyc subversion/tests/cmdline/upgrade_tests.pyc subversion/tests/cmdline/wc_tests.pyc subversion/tests/libsvn_client/client-test$(EXEEXT) subversion/tests/libsvn_client/mtcc-test$(EXEEXT) subversion/tests/libsvn_delta/random-test$(EXEEXT) subversion/tests/libsvn_delta/svndiff-test$(EXEEXT) subversion/tests/libsvn_delta/vdelta-test$(EXEEXT) subversion/tests/libsvn_delta/window-test$(EXEEXT) subversion/tests/libsvn_diff/diff-diff3-test$(EXEEXT) subversion/tests/libsvn_diff/parse-diff-test$(EXEEXT) subversion/tests/libsvn_fs/fs-test$(EXEEXT) subversion/tests/libsvn_fs/locks-test$(EXEEXT) subversion/tests/libsvn_fs_base/changes-test$(EXEEXT) subversion/tests/libsvn_fs_base/fs-base-test$(EXEEXT) subversion/tests/libsvn_fs_base/strings-reps-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-pack-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-private-test$(EXEEXT) subversion/tests/libsvn_fs_x/fs-x-pack-test$(EXEEXT) subversion/tests/libsvn_fs_x/string-table-test$(EXEEXT) subversion/tests/libsvn_ra/ra-test$(EXEEXT) subversion/tests/libsvn_ra_local/ra-local-test$(EXEEXT) subversion/tests/libsvn_repos/dump-load-test$(EXEEXT) subversion/tests/libsvn_repos/repos-test$(EXEEXT) subversion/tests/libsvn_subr/auth-test$(EXEEXT) subversion/tests/libsvn_subr/bit-array-test$(EXEEXT) subversion/tests/libsvn_subr/cache-test$(EXEEXT) subversion/tests/libsvn_subr/checksum-test$(EXEEXT) subversion/tests/libsvn_subr/compat-test$(EXEEXT) subversion/tests/libsvn_subr/config-test$(EXEEXT) subversion/tests/libsvn_subr/crypto-test$(EXEEXT) subversion/tests/libsvn_subr/dirent_uri-test$(EXEEXT) subversion/tests/libsvn_subr/error-code-test$(EXEEXT) subversion/tests/libsvn_subr/error-test$(EXEEXT) subversion/tests/libsvn_subr/hashdump-test$(EXEEXT) subversion/tests/libsvn_subr/io-test$(EXEEXT) subversion/tests/libsvn_subr/mergeinfo-test$(EXEEXT) subversion/tests/libsvn_subr/opt-test$(EXEEXT) subversion/tests/libsvn_subr/packed-data-test$(EXEEXT) subversion/tests/libsvn_subr/path-test$(EXEEXT) subversion/tests/libsvn_subr/prefix-string-test$(EXEEXT) subversion/tests/libsvn_subr/priority-queue-test$(EXEEXT) subversion/tests/libsvn_subr/revision-test$(EXEEXT) subversion/tests/libsvn_subr/root-pools-test$(EXEEXT) subversion/tests/libsvn_subr/skel-test$(EXEEXT) subversion/tests/libsvn_subr/spillbuf-test$(EXEEXT) subversion/tests/libsvn_subr/sqlite-test$(EXEEXT) subversion/tests/libsvn_subr/stream-test$(EXEEXT) subversion/tests/libsvn_subr/string-test$(EXEEXT) subversion/tests/libsvn_subr/subst_translate-test$(EXEEXT) subversion/tests/libsvn_subr/time-test$(EXEEXT) subversion/tests/libsvn_subr/translate-test$(EXEEXT) subversion/tests/libsvn_subr/utf-test$(EXEEXT) subversion/tests/libsvn_subr/x509-test$(EXEEXT) subversion/tests/libsvn_wc/conflict-data-test$(EXEEXT) subversion/tests/libsvn_wc/db-test$(EXEEXT) subversion/tests/libsvn_wc/entries-compat-test$(EXEEXT) subversion/tests/libsvn_wc/op-depth-test$(EXEEXT) subversion/tests/libsvn_wc/pristine-store-test$(EXEEXT) subversion/tests/libsvn_wc/wc-incomplete-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-lock-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-queries-test$(EXEEXT) subversion/tests/libsvn_wc/wc-test$(EXEEXT) tools/dev/fsfs-access-map$(EXEEXT) tools/dev/svnraisetreeconflict/svnraisetreeconflict$(EXEEXT) tools/dev/wc-ng/svn-wc-db-tester$(EXEEXT) tools/dev/x509-parser$(EXEEXT) tools/diff/diff$(EXEEXT) tools/diff/diff3$(EXEEXT) tools/diff/diff4$(EXEEXT) tools/server-side/svn-populate-node-origins-index$(EXEEXT) tools/server-side/svnauthz$(EXEEXT) tools/server-side/svnauthz-validate$(EXEEXT)
EXTRACLEAN_FILES = subversion/libsvn_fs_fs/rep-cache-db.h subversion/libsvn_fs_x/rep-cache-db.h subversion/libsvn_subr/internal_statements.h subversion/libsvn_wc/wc-queries.h subversion/tests/libsvn_wc/wc-test-queries.h \
$(abs_builddir)/subversion/libsvn_subr/errorcode.inc \
$(abs_builddir)/subversion/libsvn_subr/config_keys.inc \
$(abs_srcdir)/compile_commands.json
SWIG_INCLUDES = -I$(abs_builddir)/subversion \
-I$(abs_srcdir)/subversion/include \
-I$(abs_srcdir)/subversion/bindings/swig \
-I$(abs_srcdir)/subversion/bindings/swig/include \
-I$(abs_srcdir)/subversion/bindings/swig/proxy \
-I$(abs_builddir)/subversion/bindings/swig/proxy \
$(SVN_APR_INCLUDES) $(SVN_APRUTIL_INCLUDES)
RELEASE_MODE = 1
########################################
# Section 2: SWIG headers (wrappers and external runtimes)
########################################
########################################
# Section 3: SWIG autogen rules
########################################
autogen-swig-py: subversion/bindings/swig/python/core.c subversion/bindings/swig/python/svn_client.c subversion/bindings/swig/python/svn_delta.c subversion/bindings/swig/python/svn_diff.c subversion/bindings/swig/python/svn_fs.c subversion/bindings/swig/python/svn_ra.c subversion/bindings/swig/python/svn_repos.c subversion/bindings/swig/python/svn_wc.c
autogen-swig: autogen-swig-py
autogen-swig-pl: subversion/bindings/swig/perl/native/core.c subversion/bindings/swig/perl/native/svn_client.c subversion/bindings/swig/perl/native/svn_delta.c subversion/bindings/swig/perl/native/svn_diff.c subversion/bindings/swig/perl/native/svn_fs.c subversion/bindings/swig/perl/native/svn_ra.c subversion/bindings/swig/perl/native/svn_repos.c subversion/bindings/swig/perl/native/svn_wc.c
autogen-swig: autogen-swig-pl
autogen-swig-rb: subversion/bindings/swig/ruby/core.c subversion/bindings/swig/ruby/svn_client.c subversion/bindings/swig/ruby/svn_delta.c subversion/bindings/swig/ruby/svn_diff.c subversion/bindings/swig/ruby/svn_fs.c subversion/bindings/swig/ruby/svn_ra.c subversion/bindings/swig/ruby/svn_repos.c subversion/bindings/swig/ruby/svn_wc.c
autogen-swig: autogen-swig-rb
########################################
# Section 4: Rules to build SWIG .c files from .i files
########################################
# This needs to be here, rather than in Makefile.in, else
# './autogen.sh --release' doesn't find it.
.swig_checked:
@if [ "$(SWIG)" = "none" ]; then \
echo "SWIG disabled at configure time" >&2; \
exit 1; \
fi
@touch .swig_checked
########################################
# Section 5: Individual target build rules
########################################
atomic_ra_revprop_change_PATH = subversion/tests/cmdline
atomic_ra_revprop_change_DEPS = subversion/tests/cmdline/atomic-ra-revprop-change.lo subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_subr/libsvn_subr-1.la
atomic_ra_revprop_change_OBJECTS = atomic-ra-revprop-change.lo
subversion/tests/cmdline/atomic-ra-revprop-change$(EXEEXT): $(atomic_ra_revprop_change_DEPS)
cd subversion/tests/cmdline && $(LINK) $(atomic_ra_revprop_change_LDFLAGS) -o atomic-ra-revprop-change$(EXEEXT) $(atomic_ra_revprop_change_OBJECTS) ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
auth_test_PATH = subversion/tests/libsvn_subr
auth_test_DEPS = subversion/tests/libsvn_subr/auth-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
auth_test_OBJECTS = auth-test.lo
subversion/tests/libsvn_subr/auth-test$(EXEEXT): $(auth_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(auth_test_LDFLAGS) -o auth-test$(EXEEXT) $(auth_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
bit_array_test_PATH = subversion/tests/libsvn_subr
bit_array_test_DEPS = subversion/tests/libsvn_subr/bit-array-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
bit_array_test_OBJECTS = bit-array-test.lo
subversion/tests/libsvn_subr/bit-array-test$(EXEEXT): $(bit_array_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(bit_array_test_LDFLAGS) -o bit-array-test$(EXEEXT) $(bit_array_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
cache_test_PATH = subversion/tests/libsvn_subr
cache_test_DEPS = subversion/tests/libsvn_subr/cache-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
cache_test_OBJECTS = cache-test.lo
subversion/tests/libsvn_subr/cache-test$(EXEEXT): $(cache_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(cache_test_LDFLAGS) -o cache-test$(EXEEXT) $(cache_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
changes_test_PATH = subversion/tests/libsvn_fs_base
changes_test_DEPS = subversion/tests/libsvn_fs_base/changes-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_base/libsvn_fs_base-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
changes_test_OBJECTS = changes-test.lo
subversion/tests/libsvn_fs_base/changes-test$(EXEEXT): $(changes_test_DEPS)
cd subversion/tests/libsvn_fs_base && $(LINK) $(changes_test_LDFLAGS) -o changes-test$(EXEEXT) $(changes_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_base/libsvn_fs_base-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
checksum_test_PATH = subversion/tests/libsvn_subr
checksum_test_DEPS = subversion/tests/libsvn_subr/checksum-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
checksum_test_OBJECTS = checksum-test.lo
subversion/tests/libsvn_subr/checksum-test$(EXEEXT): $(checksum_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(checksum_test_LDFLAGS) -o checksum-test$(EXEEXT) $(checksum_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(SVN_ZLIB_LIBS) $(LIBS)
client_test_PATH = subversion/tests/libsvn_client
client_test_DEPS = subversion/tests/libsvn_client/client-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
client_test_OBJECTS = client-test.lo
subversion/tests/libsvn_client/client-test$(EXEEXT): $(client_test_DEPS)
cd subversion/tests/libsvn_client && $(LINK) $(client_test_LDFLAGS) -o client-test$(EXEEXT) $(client_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
compat_test_PATH = subversion/tests/libsvn_subr
compat_test_DEPS = subversion/tests/libsvn_subr/compat-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
compat_test_OBJECTS = compat-test.lo
subversion/tests/libsvn_subr/compat-test$(EXEEXT): $(compat_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(compat_test_LDFLAGS) -o compat-test$(EXEEXT) $(compat_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
config_test_PATH = subversion/tests/libsvn_subr
config_test_DEPS = subversion/tests/libsvn_subr/config-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
config_test_OBJECTS = config-test.lo
subversion/tests/libsvn_subr/config-test$(EXEEXT): $(config_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(config_test_LDFLAGS) -o config-test$(EXEEXT) $(config_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
conflict_data_test_PATH = subversion/tests/libsvn_wc
conflict_data_test_DEPS = subversion/tests/libsvn_wc/conflict-data-test.lo subversion/tests/libsvn_wc/utils.lo subversion/libsvn_client/libsvn_client-1.la subversion/tests/libsvn_test-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
conflict_data_test_OBJECTS = conflict-data-test.lo utils.lo
subversion/tests/libsvn_wc/conflict-data-test$(EXEEXT): $(conflict_data_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(conflict_data_test_LDFLAGS) -o conflict-data-test$(EXEEXT) $(conflict_data_test_OBJECTS) ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
crypto_test_PATH = subversion/tests/libsvn_subr
crypto_test_DEPS = subversion/tests/libsvn_subr/crypto-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
crypto_test_OBJECTS = crypto-test.lo
subversion/tests/libsvn_subr/crypto-test$(EXEEXT): $(crypto_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(crypto_test_LDFLAGS) -o crypto-test$(EXEEXT) $(crypto_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
cxxhl_tests_PATH = subversion/bindings/cxxhl
cxxhl_tests_DEPS = subversion/bindings/cxxhl/tests/cxxhl-tests.lo subversion/bindings/cxxhl/tests/test_aprwrap.lo subversion/bindings/cxxhl/tests/test_exception.lo subversion/bindings/cxxhl/libsvncxxhl-1.la gmock-fused/libgmock-1.la subversion/libsvn_subr/libsvn_subr-1.la
cxxhl_tests_OBJECTS = tests/cxxhl-tests.lo tests/test_aprwrap.lo tests/test_exception.lo
subversion/bindings/cxxhl/cxxhl-tests$(EXEEXT): $(cxxhl_tests_DEPS)
if $(SVN_USE_GMOCK) ; then cd subversion/bindings/cxxhl && $(LINK_CXX) $(cxxhl_tests_LDFLAGS) -o cxxhl-tests$(EXEEXT) $(cxxhl_tests_OBJECTS) ../../../subversion/bindings/cxxhl/libsvncxxhl-1.la ../../../gmock-fused/libgmock-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS) ; else echo "fake" > subversion/bindings/cxxhl/cxxhl-tests$(EXEEXT) ; fi
db_test_PATH = subversion/tests/libsvn_wc
db_test_DEPS = subversion/tests/libsvn_wc/db-test.lo subversion/tests/libsvn_wc/utils.lo subversion/libsvn_client/libsvn_client-1.la subversion/tests/libsvn_test-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
db_test_OBJECTS = db-test.lo utils.lo
subversion/tests/libsvn_wc/db-test$(EXEEXT): $(db_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(db_test_LDFLAGS) -o db-test$(EXEEXT) $(db_test_OBJECTS) ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
diff_PATH = tools/diff
diff_DEPS = tools/diff/diff.lo subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
diff_OBJECTS = diff.lo
tools/diff/diff$(EXEEXT): $(diff_DEPS)
cd tools/diff && $(LINK) $(diff_LDFLAGS) -o diff$(EXEEXT) $(diff_OBJECTS) ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
diff_diff3_test_PATH = subversion/tests/libsvn_diff
diff_diff3_test_DEPS = subversion/tests/libsvn_diff/diff-diff3-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
diff_diff3_test_OBJECTS = diff-diff3-test.lo
subversion/tests/libsvn_diff/diff-diff3-test$(EXEEXT): $(diff_diff3_test_DEPS)
cd subversion/tests/libsvn_diff && $(LINK) $(diff_diff3_test_LDFLAGS) -o diff-diff3-test$(EXEEXT) $(diff_diff3_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
diff3_PATH = tools/diff
diff3_DEPS = tools/diff/diff3.lo subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
diff3_OBJECTS = diff3.lo
tools/diff/diff3$(EXEEXT): $(diff3_DEPS)
cd tools/diff && $(LINK) $(diff3_LDFLAGS) -o diff3$(EXEEXT) $(diff3_OBJECTS) ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
diff4_PATH = tools/diff
diff4_DEPS = tools/diff/diff4.lo subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
diff4_OBJECTS = diff4.lo
tools/diff/diff4$(EXEEXT): $(diff4_DEPS)
cd tools/diff && $(LINK) $(diff4_LDFLAGS) -o diff4$(EXEEXT) $(diff4_OBJECTS) ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
dirent_uri_test_PATH = subversion/tests/libsvn_subr
dirent_uri_test_DEPS = subversion/tests/libsvn_subr/dirent_uri-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
dirent_uri_test_OBJECTS = dirent_uri-test.lo
subversion/tests/libsvn_subr/dirent_uri-test$(EXEEXT): $(dirent_uri_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(dirent_uri_test_LDFLAGS) -o dirent_uri-test$(EXEEXT) $(dirent_uri_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
dump_load_test_PATH = subversion/tests/libsvn_repos
dump_load_test_DEPS = subversion/tests/libsvn_repos/dump-load-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
dump_load_test_OBJECTS = dump-load-test.lo
subversion/tests/libsvn_repos/dump-load-test$(EXEEXT): $(dump_load_test_DEPS)
cd subversion/tests/libsvn_repos && $(LINK) $(dump_load_test_LDFLAGS) -o dump-load-test$(EXEEXT) $(dump_load_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
entries_compat_test_PATH = subversion/tests/libsvn_wc
entries_compat_test_DEPS = subversion/tests/libsvn_wc/entries-compat.lo subversion/tests/libsvn_wc/utils.lo subversion/libsvn_client/libsvn_client-1.la subversion/tests/libsvn_test-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
entries_compat_test_OBJECTS = entries-compat.lo utils.lo
subversion/tests/libsvn_wc/entries-compat-test$(EXEEXT): $(entries_compat_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(entries_compat_test_LDFLAGS) -o entries-compat-test$(EXEEXT) $(entries_compat_test_OBJECTS) ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
entries_dump_PATH = subversion/tests/cmdline
entries_dump_DEPS = subversion/tests/cmdline/entries-dump.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
entries_dump_OBJECTS = entries-dump.lo
subversion/tests/cmdline/entries-dump$(EXEEXT): $(entries_dump_DEPS)
cd subversion/tests/cmdline && $(LINK) $(entries_dump_LDFLAGS) -o entries-dump$(EXEEXT) $(entries_dump_OBJECTS) ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
error_code_test_PATH = subversion/tests/libsvn_subr
error_code_test_DEPS = subversion/tests/libsvn_subr/error-code-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
error_code_test_OBJECTS = error-code-test.lo
subversion/tests/libsvn_subr/error-code-test$(EXEEXT): $(error_code_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(error_code_test_LDFLAGS) -o error-code-test$(EXEEXT) $(error_code_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
error_test_PATH = subversion/tests/libsvn_subr
error_test_DEPS = subversion/tests/libsvn_subr/error-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
error_test_OBJECTS = error-test.lo
subversion/tests/libsvn_subr/error-test$(EXEEXT): $(error_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(error_test_LDFLAGS) -o error-test$(EXEEXT) $(error_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fs_base_test_PATH = subversion/tests/libsvn_fs_base
fs_base_test_DEPS = subversion/tests/libsvn_fs_base/fs-base-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_base/libsvn_fs_base-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la subversion/libsvn_subr/libsvn_subr-1.la
fs_base_test_OBJECTS = fs-base-test.lo
subversion/tests/libsvn_fs_base/fs-base-test$(EXEEXT): $(fs_base_test_DEPS)
cd subversion/tests/libsvn_fs_base && $(LINK) $(fs_base_test_LDFLAGS) -o fs-base-test$(EXEEXT) $(fs_base_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_base/libsvn_fs_base-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_fs_util/libsvn_fs_util-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fs_fs_fuzzy_test_PATH = subversion/tests/libsvn_fs_fs
fs_fs_fuzzy_test_DEPS = subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_subr/libsvn_subr-1.la
fs_fs_fuzzy_test_OBJECTS = fs-fs-fuzzy-test.lo
subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test$(EXEEXT): $(fs_fs_fuzzy_test_DEPS)
cd subversion/tests/libsvn_fs_fs && $(LINK) $(fs_fs_fuzzy_test_LDFLAGS) -o fs-fs-fuzzy-test$(EXEEXT) $(fs_fs_fuzzy_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_fs/libsvn_fs_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fs_fs_pack_test_PATH = subversion/tests/libsvn_fs_fs
fs_fs_pack_test_DEPS = subversion/tests/libsvn_fs_fs/fs-fs-pack-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
fs_fs_pack_test_OBJECTS = fs-fs-pack-test.lo
subversion/tests/libsvn_fs_fs/fs-fs-pack-test$(EXEEXT): $(fs_fs_pack_test_DEPS)
cd subversion/tests/libsvn_fs_fs && $(LINK) $(fs_fs_pack_test_LDFLAGS) -o fs-fs-pack-test$(EXEEXT) $(fs_fs_pack_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_fs/libsvn_fs_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fs_fs_private_test_PATH = subversion/tests/libsvn_fs_fs
fs_fs_private_test_DEPS = subversion/tests/libsvn_fs_fs/fs-fs-private-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_subr/libsvn_subr-1.la
fs_fs_private_test_OBJECTS = fs-fs-private-test.lo
subversion/tests/libsvn_fs_fs/fs-fs-private-test$(EXEEXT): $(fs_fs_private_test_DEPS)
cd subversion/tests/libsvn_fs_fs && $(LINK) $(fs_fs_private_test_LDFLAGS) -o fs-fs-private-test$(EXEEXT) $(fs_fs_private_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_fs/libsvn_fs_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fs_test_PATH = subversion/tests/libsvn_fs
fs_test_DEPS = subversion/tests/libsvn_fs/fs-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la subversion/libsvn_subr/libsvn_subr-1.la
fs_test_OBJECTS = fs-test.lo
subversion/tests/libsvn_fs/fs-test$(EXEEXT): $(fs_test_DEPS)
cd subversion/tests/libsvn_fs && $(LINK) $(fs_test_LDFLAGS) -o fs-test$(EXEEXT) $(fs_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_fs_util/libsvn_fs_util-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fs_x_pack_test_PATH = subversion/tests/libsvn_fs_x
fs_x_pack_test_DEPS = subversion/tests/libsvn_fs_x/fs-x-pack-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_x/libsvn_fs_x-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
fs_x_pack_test_OBJECTS = fs-x-pack-test.lo
subversion/tests/libsvn_fs_x/fs-x-pack-test$(EXEEXT): $(fs_x_pack_test_DEPS)
cd subversion/tests/libsvn_fs_x && $(LINK) $(fs_x_pack_test_LDFLAGS) -o fs-x-pack-test$(EXEEXT) $(fs_x_pack_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_x/libsvn_fs_x-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
fsfs_access_map_PATH = tools/dev
fsfs_access_map_DEPS = tools/dev/fsfs-access-map.lo subversion/libsvn_subr/libsvn_subr-1.la
fsfs_access_map_OBJECTS = fsfs-access-map.lo
tools/dev/fsfs-access-map$(EXEEXT): $(fsfs_access_map_DEPS)
cd tools/dev && $(LINK) $(fsfs_access_map_LDFLAGS) -o fsfs-access-map$(EXEEXT) $(fsfs_access_map_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
hashdump_test_PATH = subversion/tests/libsvn_subr
hashdump_test_DEPS = subversion/tests/libsvn_subr/hashdump-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
hashdump_test_OBJECTS = hashdump-test.lo
subversion/tests/libsvn_subr/hashdump-test$(EXEEXT): $(hashdump_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(hashdump_test_LDFLAGS) -o hashdump-test$(EXEEXT) $(hashdump_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
io_test_PATH = subversion/tests/libsvn_subr
io_test_DEPS = subversion/tests/libsvn_subr/io-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
io_test_OBJECTS = io-test.lo
subversion/tests/libsvn_subr/io-test$(EXEEXT): $(io_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(io_test_LDFLAGS) -o io-test$(EXEEXT) $(io_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
javahl_callback_javah_PATH = subversion/bindings/javahl/include
javahl_callback_javah_HEADERS = subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_AuthnCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_BlameCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ChangelistCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ClientNotifyCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_CommitCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_CommitMessageCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ConfigEvent.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ConflictResolverCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_DiffSummaryCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ImportFilterCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_InfoCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_InheritedProplistCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ListCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_LogMessageCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_PatchCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ProgressCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ProplistCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_RemoteFileRevisionsCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_RemoteLocationSegmentsCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_RemoteStatus.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ReposFreezeAction.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ReposNotifyCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_ReposVerifyCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_StatusCallback.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_TunnelAgent.h subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_UserPasswordCallback.h
javahl_callback_javah_OBJECTS =
javahl_callback_javah_DEPS = $(javahl_callback_javah_HEADERS) $(javahl_callback_javah_OBJECTS) $(javahl_java_DEPS)
javahl-callback-javah: $(javahl_callback_javah_DEPS)
javahl_callback_javah_CLASS_FILENAMES = subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/AuthnCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/BlameCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ChangelistCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ClientNotifyCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitMessageCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConfigEvent.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConflictResolverCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/DiffSummaryCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ImportFilterCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InfoCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InheritedProplistCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ListCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/LogMessageCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/PatchCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProgressCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProplistCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteStatus.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposFreezeAction.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposNotifyCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposVerifyCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/StatusCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/TunnelAgent.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/UserPasswordCallback.class
javahl_callback_javah_CLASSES = org.apache.subversion.javahl.callback.AuthnCallback org.apache.subversion.javahl.callback.BlameCallback org.apache.subversion.javahl.callback.ChangelistCallback org.apache.subversion.javahl.callback.ClientNotifyCallback org.apache.subversion.javahl.callback.CommitCallback org.apache.subversion.javahl.callback.CommitMessageCallback org.apache.subversion.javahl.callback.ConfigEvent org.apache.subversion.javahl.callback.ConflictResolverCallback org.apache.subversion.javahl.callback.DiffSummaryCallback org.apache.subversion.javahl.callback.ImportFilterCallback org.apache.subversion.javahl.callback.InfoCallback org.apache.subversion.javahl.callback.InheritedProplistCallback org.apache.subversion.javahl.callback.ListCallback org.apache.subversion.javahl.callback.LogMessageCallback org.apache.subversion.javahl.callback.PatchCallback org.apache.subversion.javahl.callback.ProgressCallback org.apache.subversion.javahl.callback.ProplistCallback org.apache.subversion.javahl.callback.RemoteFileRevisionsCallback org.apache.subversion.javahl.callback.RemoteLocationSegmentsCallback org.apache.subversion.javahl.callback.RemoteStatus org.apache.subversion.javahl.callback.ReposFreezeAction org.apache.subversion.javahl.callback.ReposNotifyCallback org.apache.subversion.javahl.callback.ReposVerifyCallback org.apache.subversion.javahl.callback.StatusCallback org.apache.subversion.javahl.callback.TunnelAgent org.apache.subversion.javahl.callback.UserPasswordCallback
$(javahl_callback_javah_HEADERS): $(javahl_callback_javah_CLASS_FILENAMES)
$(COMPILE_JAVAHL_JAVAH) -force -d subversion/bindings/javahl/include -classpath subversion/bindings/javahl/classes:$(javahl_callback_javah_CLASSPATH) $(javahl_callback_javah_CLASSES)
javahl_compat_java_PATH = subversion/bindings/javahl/classes
javahl_compat_java_HEADERS =
javahl_compat_java_OBJECTS = subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallback2.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallback3.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallbackImpl.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ChangePath.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ChangelistCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ClientException.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CommitItem.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CommitItemStateFlags.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CommitMessage.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictDescriptor.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictResolverCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictResult.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictVersion.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CopySource.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Depth.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/DiffSummary.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/DiffSummaryReceiver.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/DirEntry.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ErrorCodes.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Info.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Info2.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/InfoCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/InputInterface.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ListCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Lock.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LockStatus.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LogDate.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LogMessage.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LogMessageCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Mergeinfo.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/MergeinfoLogKind.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NativeException.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NodeKind.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Notify.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Notify2.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NotifyAction.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NotifyInformation.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NotifyStatus.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Operation.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/OutputInterface.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Path.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProgressEvent.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProgressListener.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PromptUserPassword.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PromptUserPassword2.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PromptUserPassword3.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PropertyData.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProplistCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProplistCallbackImpl.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Revision.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/RevisionKind.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/RevisionRange.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNAdmin.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClient.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClientInterface.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClientLogLevel.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClientSynchronized.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNInputStream.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNOutputStream.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ScheduleKind.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Status.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/StatusCallback.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/StatusKind.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SubversionException.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Version.class
javahl_compat_java_DEPS = $(javahl_compat_java_HEADERS) $(javahl_compat_java_OBJECTS) $(javahl_java_DEPS)
javahl-compat-java: $(javahl_compat_java_DEPS)
javahl_compat_java_SRC = $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback2.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback3.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallbackImpl.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ChangePath.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ChangelistCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ClientException.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/CommitItem.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/CommitItemStateFlags.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/CommitMessage.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictDescriptor.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResolverCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictVersion.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/CopySource.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Depth.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/DiffSummary.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/DiffSummaryReceiver.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/DirEntry.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ErrorCodes.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/InfoCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/InputInterface.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ListCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Lock.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/LockStatus.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/LogDate.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/LogMessage.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/LogMessageCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Mergeinfo.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/MergeinfoLogKind.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/NativeException.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/NodeKind.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Notify.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Notify2.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/NotifyAction.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/NotifyInformation.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/NotifyStatus.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Operation.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/OutputInterface.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProgressEvent.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProgressListener.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PromptUserPassword.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PromptUserPassword2.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PromptUserPassword3.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Revision.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/RevisionKind.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/RevisionRange.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientLogLevel.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientSynchronized.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNInputStream.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNOutputStream.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ScheduleKind.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Status.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/StatusCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/StatusKind.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SubversionException.java $(abs_srcdir)/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Version.java
$(javahl_compat_java_OBJECTS): $(javahl_compat_java_SRC)
$(COMPILE_JAVAHL_COMPAT_JAVAC) -d subversion/bindings/javahl/classes -classpath subversion/bindings/javahl/classes:$(javahl_compat_java_CLASSPATH) $(javahl_compat_java_SRC)
javahl_compat_tests_PATH = subversion/bindings/javahl/classes
javahl_compat_tests_HEADERS =
javahl_compat_tests_OBJECTS = subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BasicTests.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/RunTests.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNAdminTests.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNTests.class subversion/bindings/javahl/classes/org/tigris/subversion/javahl/WC.class
javahl_compat_tests_DEPS = $(javahl_compat_tests_HEADERS) $(javahl_compat_tests_OBJECTS) $(javahl_compat_java_DEPS)
javahl-compat-tests: $(javahl_compat_tests_DEPS)
javahl_compat_tests_SRC = $(abs_srcdir)/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/RunTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNAdminTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/WC.java
$(javahl_compat_tests_OBJECTS): $(javahl_compat_tests_SRC)
$(COMPILE_JAVAHL_COMPAT_JAVAC) -d subversion/bindings/javahl/classes -classpath subversion/bindings/javahl/classes:$(javahl_compat_tests_CLASSPATH) $(javahl_compat_tests_SRC)
javahl_java_PATH = subversion/bindings/javahl/classes
javahl_java_HEADERS =
javahl_java_OBJECTS = subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientException.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientNotifyInformation.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitInfo.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItem.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItemStateFlags.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictDescriptor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictResult.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/DiffSummary.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNClient.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNConfig.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNEditor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRemote.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNReporter.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRepos.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIError.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIObject.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeException.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeResources.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/OperationContext.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ProgressEvent.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ReposNotifyInformation.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNClient.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNRepos.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNUtil.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SubversionException.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/AuthnCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/BlameCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ChangelistCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ClientNotifyCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitMessageCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConfigEvent.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConflictResolverCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/DiffSummaryCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ImportFilterCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InfoCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InheritedProplistCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ListCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/LogMessageCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/PatchCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProgressCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProplistCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteStatus.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposFreezeAction.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposNotifyCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposVerifyCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/StatusCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/TunnelAgent.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/UserPasswordCallback.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/CommitEditor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteFactory.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteSession.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RetryOpenSession.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StateReporter.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StatusEditor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ChangePath.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Checksum.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ConflictVersion.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/CopySource.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Depth.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DiffOptions.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DirEntry.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ExternalItem.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Info.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Lock.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/LogDate.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Mergeinfo.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeInputStream.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeOutputStream.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NodeKind.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Property.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Revision.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRange.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRangeList.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RuntimeVersion.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Status.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Tristate.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Version.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/VersionExtended.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigImpl.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/DiffLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/PropLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/RequestChannel.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ResponseChannel.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/SubstLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/TunnelChannel.class
javahl_java_DEPS = $(javahl_java_HEADERS) $(javahl_java_OBJECTS)
javahl-java: $(javahl_java_DEPS)
javahl_java_SRC = $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItemStateFlags.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReporter.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/OperationContext.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ChangelistCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ClientNotifyCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/CommitCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/CommitMessageCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConfigEvent.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConflictResolverCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/DiffSummaryCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ImportFilterCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/InfoCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/InheritedProplistCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ListCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/PatchCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProgressCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteStatus.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposFreezeAction.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposNotifyCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposVerifyCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/StatusCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/TunnelAgent.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/CommitEditor.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteFactory.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RetryOpenSession.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StateReporter.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ConflictVersion.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Depth.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DiffOptions.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/LogDate.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeInputStream.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeOutputStream.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NodeKind.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RuntimeVersion.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Tristate.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigImpl.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/DiffLib.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/RequestChannel.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ResponseChannel.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/SubstLib.java $(abs_srcdir)/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/TunnelChannel.java
$(javahl_java_OBJECTS): $(javahl_java_SRC)
$(COMPILE_JAVAHL_JAVAC) -d subversion/bindings/javahl/classes -classpath subversion/bindings/javahl/classes:$(javahl_java_CLASSPATH) $(javahl_java_SRC)
javahl_javah_PATH = subversion/bindings/javahl/include
javahl_javah_HEADERS = subversion/bindings/javahl/include/org_apache_subversion_javahl_ClientException.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ClientNotifyInformation.h subversion/bindings/javahl/include/org_apache_subversion_javahl_CommitInfo.h subversion/bindings/javahl/include/org_apache_subversion_javahl_CommitItem.h subversion/bindings/javahl/include/org_apache_subversion_javahl_CommitItemStateFlags.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ConflictDescriptor.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ConflictResult.h subversion/bindings/javahl/include/org_apache_subversion_javahl_DiffSummary.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ISVNClient.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ISVNConfig.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ISVNEditor.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ISVNRemote.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ISVNReporter.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ISVNRepos.h subversion/bindings/javahl/include/org_apache_subversion_javahl_JNIError.h subversion/bindings/javahl/include/org_apache_subversion_javahl_JNIObject.h subversion/bindings/javahl/include/org_apache_subversion_javahl_NativeException.h subversion/bindings/javahl/include/org_apache_subversion_javahl_NativeResources.h subversion/bindings/javahl/include/org_apache_subversion_javahl_OperationContext.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ProgressEvent.h subversion/bindings/javahl/include/org_apache_subversion_javahl_ReposNotifyInformation.h subversion/bindings/javahl/include/org_apache_subversion_javahl_SVNClient.h subversion/bindings/javahl/include/org_apache_subversion_javahl_SVNRepos.h subversion/bindings/javahl/include/org_apache_subversion_javahl_SVNUtil.h subversion/bindings/javahl/include/org_apache_subversion_javahl_SubversionException.h
javahl_javah_OBJECTS =
javahl_javah_DEPS = $(javahl_javah_HEADERS) $(javahl_javah_OBJECTS) $(javahl_java_DEPS)
javahl-javah: $(javahl_javah_DEPS)
javahl_javah_CLASS_FILENAMES = subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientException.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientNotifyInformation.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitInfo.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItem.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItemStateFlags.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictDescriptor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictResult.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/DiffSummary.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNClient.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNConfig.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNEditor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRemote.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNReporter.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRepos.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIError.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIObject.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeException.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeResources.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/OperationContext.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ProgressEvent.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ReposNotifyInformation.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNClient.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNRepos.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNUtil.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SubversionException.class
javahl_javah_CLASSES = org.apache.subversion.javahl.ClientException org.apache.subversion.javahl.ClientNotifyInformation org.apache.subversion.javahl.CommitInfo org.apache.subversion.javahl.CommitItem org.apache.subversion.javahl.CommitItemStateFlags org.apache.subversion.javahl.ConflictDescriptor org.apache.subversion.javahl.ConflictResult org.apache.subversion.javahl.DiffSummary org.apache.subversion.javahl.ISVNClient org.apache.subversion.javahl.ISVNConfig org.apache.subversion.javahl.ISVNEditor org.apache.subversion.javahl.ISVNRemote org.apache.subversion.javahl.ISVNReporter org.apache.subversion.javahl.ISVNRepos org.apache.subversion.javahl.JNIError org.apache.subversion.javahl.JNIObject org.apache.subversion.javahl.NativeException org.apache.subversion.javahl.NativeResources org.apache.subversion.javahl.OperationContext org.apache.subversion.javahl.ProgressEvent org.apache.subversion.javahl.ReposNotifyInformation org.apache.subversion.javahl.SVNClient org.apache.subversion.javahl.SVNRepos org.apache.subversion.javahl.SVNUtil org.apache.subversion.javahl.SubversionException
$(javahl_javah_HEADERS): $(javahl_javah_CLASS_FILENAMES)
$(COMPILE_JAVAHL_JAVAH) -force -d subversion/bindings/javahl/include -classpath subversion/bindings/javahl/classes:$(javahl_javah_CLASSPATH) $(javahl_javah_CLASSES)
javahl_remote_javah_PATH = subversion/bindings/javahl/include
javahl_remote_javah_HEADERS = subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_CommitEditor.h subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_RemoteFactory.h subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_RemoteSession.h subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_RetryOpenSession.h subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_StateReporter.h subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_StatusEditor.h
javahl_remote_javah_OBJECTS =
javahl_remote_javah_DEPS = $(javahl_remote_javah_HEADERS) $(javahl_remote_javah_OBJECTS) $(javahl_java_DEPS)
javahl-remote-javah: $(javahl_remote_javah_DEPS)
javahl_remote_javah_CLASS_FILENAMES = subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/CommitEditor.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteFactory.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteSession.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RetryOpenSession.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StateReporter.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StatusEditor.class
javahl_remote_javah_CLASSES = org.apache.subversion.javahl.remote.CommitEditor org.apache.subversion.javahl.remote.RemoteFactory org.apache.subversion.javahl.remote.RemoteSession org.apache.subversion.javahl.remote.RetryOpenSession org.apache.subversion.javahl.remote.StateReporter org.apache.subversion.javahl.remote.StatusEditor
$(javahl_remote_javah_HEADERS): $(javahl_remote_javah_CLASS_FILENAMES)
$(COMPILE_JAVAHL_JAVAH) -force -d subversion/bindings/javahl/include -classpath subversion/bindings/javahl/classes:$(javahl_remote_javah_CLASSPATH) $(javahl_remote_javah_CLASSES)
javahl_tests_PATH = subversion/bindings/javahl/classes
javahl_tests_HEADERS =
javahl_tests_OBJECTS = subversion/bindings/javahl/classes/org/apache/subversion/javahl/BasicTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/ExceptionTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/RunTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNRemoteTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNReposTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/UtilTests.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/WC.class
javahl_tests_DEPS = $(javahl_tests_HEADERS) $(javahl_tests_OBJECTS) $(javahl_java_DEPS)
javahl-tests: $(javahl_tests_DEPS)
javahl_tests_SRC = $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java $(abs_srcdir)/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
$(javahl_tests_OBJECTS): $(javahl_tests_SRC)
$(COMPILE_JAVAHL_JAVAC) -d subversion/bindings/javahl/classes -classpath subversion/bindings/javahl/classes:$(javahl_tests_CLASSPATH) $(javahl_tests_SRC)
javahl_types_javah_PATH = subversion/bindings/javahl/include
javahl_types_javah_HEADERS = subversion/bindings/javahl/include/org_apache_subversion_javahl_types_ChangePath.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Checksum.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_ConflictVersion.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_CopySource.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Depth.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_DiffOptions.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_DirEntry.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_ExternalItem.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Info.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Lock.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_LogDate.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Mergeinfo.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_NativeInputStream.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_NativeOutputStream.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_NodeKind.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Property.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Revision.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_RevisionRange.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_RevisionRangeList.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_RuntimeVersion.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Status.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Tristate.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Version.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_VersionExtended.h
javahl_types_javah_OBJECTS =
javahl_types_javah_DEPS = $(javahl_types_javah_HEADERS) $(javahl_types_javah_OBJECTS) $(javahl_java_DEPS)
javahl-types-javah: $(javahl_types_javah_DEPS)
javahl_types_javah_CLASS_FILENAMES = subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ChangePath.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Checksum.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ConflictVersion.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/CopySource.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Depth.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DiffOptions.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DirEntry.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ExternalItem.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Info.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Lock.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/LogDate.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Mergeinfo.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeInputStream.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeOutputStream.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NodeKind.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Property.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Revision.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRange.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRangeList.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RuntimeVersion.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Status.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Tristate.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Version.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/VersionExtended.class
javahl_types_javah_CLASSES = org.apache.subversion.javahl.types.ChangePath org.apache.subversion.javahl.types.Checksum org.apache.subversion.javahl.types.ConflictVersion org.apache.subversion.javahl.types.CopySource org.apache.subversion.javahl.types.Depth org.apache.subversion.javahl.types.DiffOptions org.apache.subversion.javahl.types.DirEntry org.apache.subversion.javahl.types.ExternalItem org.apache.subversion.javahl.types.Info org.apache.subversion.javahl.types.Lock org.apache.subversion.javahl.types.LogDate org.apache.subversion.javahl.types.Mergeinfo org.apache.subversion.javahl.types.NativeInputStream org.apache.subversion.javahl.types.NativeOutputStream org.apache.subversion.javahl.types.NodeKind org.apache.subversion.javahl.types.Property org.apache.subversion.javahl.types.Revision org.apache.subversion.javahl.types.RevisionRange org.apache.subversion.javahl.types.RevisionRangeList org.apache.subversion.javahl.types.RuntimeVersion org.apache.subversion.javahl.types.Status org.apache.subversion.javahl.types.Tristate org.apache.subversion.javahl.types.Version org.apache.subversion.javahl.types.VersionExtended
$(javahl_types_javah_HEADERS): $(javahl_types_javah_CLASS_FILENAMES)
$(COMPILE_JAVAHL_JAVAH) -force -d subversion/bindings/javahl/include -classpath subversion/bindings/javahl/classes:$(javahl_types_javah_CLASSPATH) $(javahl_types_javah_CLASSES)
javahl_util_javah_PATH = subversion/bindings/javahl/include
javahl_util_javah_HEADERS = subversion/bindings/javahl/include/org_apache_subversion_javahl_util_ConfigImpl.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_ConfigLib.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_DiffLib.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_PropLib.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_RequestChannel.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_ResponseChannel.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_SubstLib.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_TunnelChannel.h
javahl_util_javah_OBJECTS =
javahl_util_javah_DEPS = $(javahl_util_javah_HEADERS) $(javahl_util_javah_OBJECTS) $(javahl_java_DEPS)
javahl-util-javah: $(javahl_util_javah_DEPS)
javahl_util_javah_CLASS_FILENAMES = subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigImpl.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/DiffLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/PropLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/RequestChannel.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ResponseChannel.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/SubstLib.class subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/TunnelChannel.class
javahl_util_javah_CLASSES = org.apache.subversion.javahl.util.ConfigImpl org.apache.subversion.javahl.util.ConfigLib org.apache.subversion.javahl.util.DiffLib org.apache.subversion.javahl.util.PropLib org.apache.subversion.javahl.util.RequestChannel org.apache.subversion.javahl.util.ResponseChannel org.apache.subversion.javahl.util.SubstLib org.apache.subversion.javahl.util.TunnelChannel
$(javahl_util_javah_HEADERS): $(javahl_util_javah_CLASS_FILENAMES)
$(COMPILE_JAVAHL_JAVAH) -force -d subversion/bindings/javahl/include -classpath subversion/bindings/javahl/classes:$(javahl_util_javah_CLASSPATH) $(javahl_util_javah_CLASSES)
libgmock_PATH = gmock-fused
libgmock_DEPS =
libgmock_OBJECTS =
gmock-fused/libgmock-1.la: $(libgmock_DEPS)
if $(SVN_USE_GMOCK) ; then cd gmock-fused && $(LINK_CXX_LIB) $(libgmock_LDFLAGS) -o libgmock-1.la $(LT_NO_UNDEFINED) $(libgmock_OBJECTS) $(LIBS) ; else echo "fake" > gmock-fused/libgmock-1.la ; fi
libsvn_auth_gnome_keyring_PATH = subversion/libsvn_auth_gnome_keyring
libsvn_auth_gnome_keyring_DEPS = subversion/libsvn_auth_gnome_keyring/gnome_keyring.lo subversion/libsvn_auth_gnome_keyring/version.lo subversion/libsvn_subr/libsvn_subr-1.la
libsvn_auth_gnome_keyring_OBJECTS = gnome_keyring.lo version.lo
subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring-1.la: $(libsvn_auth_gnome_keyring_DEPS)
cd subversion/libsvn_auth_gnome_keyring && $(LINK_LIB) $(libsvn_auth_gnome_keyring_LDFLAGS) -o libsvn_auth_gnome_keyring-1.la $(LT_NO_UNDEFINED) $(libsvn_auth_gnome_keyring_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(SVN_GNOME_KEYRING_LIBS) $(LIBS)
libsvn_auth_kwallet_PATH = subversion/libsvn_auth_kwallet
libsvn_auth_kwallet_DEPS = subversion/libsvn_auth_kwallet/kwallet.lo subversion/libsvn_auth_kwallet/version.lo subversion/libsvn_subr/libsvn_subr-1.la
libsvn_auth_kwallet_OBJECTS = kwallet.lo version.lo
subversion/libsvn_auth_kwallet/libsvn_auth_kwallet-1.la: $(libsvn_auth_kwallet_DEPS)
cd subversion/libsvn_auth_kwallet && $(LINK_CXX_LIB) $(libsvn_auth_kwallet_LDFLAGS) -o libsvn_auth_kwallet-1.la $(LT_NO_UNDEFINED) $(libsvn_auth_kwallet_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(SVN_KWALLET_LIBS) $(LIBS)
libsvn_client_PATH = subversion/libsvn_client
libsvn_client_DEPS = subversion/libsvn_client/add.lo subversion/libsvn_client/blame.lo subversion/libsvn_client/cat.lo subversion/libsvn_client/changelist.lo subversion/libsvn_client/checkout.lo subversion/libsvn_client/cleanup.lo subversion/libsvn_client/cmdline.lo subversion/libsvn_client/commit.lo subversion/libsvn_client/commit_util.lo subversion/libsvn_client/compat_providers.lo subversion/libsvn_client/copy.lo subversion/libsvn_client/copy_foreign.lo subversion/libsvn_client/ctx.lo subversion/libsvn_client/delete.lo subversion/libsvn_client/deprecated.lo subversion/libsvn_client/diff.lo subversion/libsvn_client/diff_local.lo subversion/libsvn_client/diff_summarize.lo subversion/libsvn_client/export.lo subversion/libsvn_client/externals.lo subversion/libsvn_client/import.lo subversion/libsvn_client/info.lo subversion/libsvn_client/iprops.lo subversion/libsvn_client/list.lo subversion/libsvn_client/locking_commands.lo subversion/libsvn_client/log.lo subversion/libsvn_client/merge.lo subversion/libsvn_client/mergeinfo.lo subversion/libsvn_client/mtcc.lo subversion/libsvn_client/patch.lo subversion/libsvn_client/prop_commands.lo subversion/libsvn_client/ra.lo subversion/libsvn_client/relocate.lo subversion/libsvn_client/repos_diff.lo subversion/libsvn_client/resolved.lo subversion/libsvn_client/revert.lo subversion/libsvn_client/revisions.lo subversion/libsvn_client/status.lo subversion/libsvn_client/switch.lo subversion/libsvn_client/update.lo subversion/libsvn_client/upgrade.lo subversion/libsvn_client/url.lo subversion/libsvn_client/util.lo subversion/libsvn_client/version.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_client_OBJECTS = add.lo blame.lo cat.lo changelist.lo checkout.lo cleanup.lo cmdline.lo commit.lo commit_util.lo compat_providers.lo copy.lo copy_foreign.lo ctx.lo delete.lo deprecated.lo diff.lo diff_local.lo diff_summarize.lo export.lo externals.lo import.lo info.lo iprops.lo list.lo locking_commands.lo log.lo merge.lo mergeinfo.lo mtcc.lo patch.lo prop_commands.lo ra.lo relocate.lo repos_diff.lo resolved.lo revert.lo revisions.lo status.lo switch.lo update.lo upgrade.lo url.lo util.lo version.lo
subversion/libsvn_client/libsvn_client-1.la: $(libsvn_client_DEPS)
cd subversion/libsvn_client && $(LINK_LIB) $(libsvn_client_LDFLAGS) -o libsvn_client-1.la $(LT_NO_UNDEFINED) $(libsvn_client_OBJECTS) ../../subversion/libsvn_wc/libsvn_wc-1.la ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_delta_PATH = subversion/libsvn_delta
libsvn_delta_DEPS = subversion/libsvn_delta/cancel.lo subversion/libsvn_delta/compat.lo subversion/libsvn_delta/compose_delta.lo subversion/libsvn_delta/debug_editor.lo subversion/libsvn_delta/default_editor.lo subversion/libsvn_delta/deprecated.lo subversion/libsvn_delta/depth_filter_editor.lo subversion/libsvn_delta/editor.lo subversion/libsvn_delta/path_driver.lo subversion/libsvn_delta/svndiff.lo subversion/libsvn_delta/text_delta.lo subversion/libsvn_delta/version.lo subversion/libsvn_delta/xdelta.lo subversion/libsvn_subr/libsvn_subr-1.la
libsvn_delta_OBJECTS = cancel.lo compat.lo compose_delta.lo debug_editor.lo default_editor.lo deprecated.lo depth_filter_editor.lo editor.lo path_driver.lo svndiff.lo text_delta.lo version.lo xdelta.lo
subversion/libsvn_delta/libsvn_delta-1.la: $(libsvn_delta_DEPS)
cd subversion/libsvn_delta && $(LINK_LIB) $(libsvn_delta_LDFLAGS) -o libsvn_delta-1.la $(LT_NO_UNDEFINED) $(libsvn_delta_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_ZLIB_LIBS) $(LIBS)
libsvn_diff_PATH = subversion/libsvn_diff
libsvn_diff_DEPS = subversion/libsvn_diff/binary_diff.lo subversion/libsvn_diff/deprecated.lo subversion/libsvn_diff/diff.lo subversion/libsvn_diff/diff3.lo subversion/libsvn_diff/diff4.lo subversion/libsvn_diff/diff_file.lo subversion/libsvn_diff/diff_memory.lo subversion/libsvn_diff/diff_tree.lo subversion/libsvn_diff/lcs.lo subversion/libsvn_diff/parse-diff.lo subversion/libsvn_diff/token.lo subversion/libsvn_diff/util.lo subversion/libsvn_subr/libsvn_subr-1.la
libsvn_diff_OBJECTS = binary_diff.lo deprecated.lo diff.lo diff3.lo diff4.lo diff_file.lo diff_memory.lo diff_tree.lo lcs.lo parse-diff.lo token.lo util.lo
subversion/libsvn_diff/libsvn_diff-1.la: $(libsvn_diff_DEPS)
cd subversion/libsvn_diff && $(LINK_LIB) $(libsvn_diff_LDFLAGS) -o libsvn_diff-1.la $(LT_NO_UNDEFINED) $(libsvn_diff_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_ZLIB_LIBS) $(LIBS)
libsvn_fs_PATH = subversion/libsvn_fs
install-ramod-lib: $(SVN_FS_LIB_INSTALL_DEPS)
libsvn_fs_DEPS = $(SVN_FS_LIB_DEPS) subversion/libsvn_fs/access.lo subversion/libsvn_fs/deprecated.lo subversion/libsvn_fs/editor.lo subversion/libsvn_fs/fs-loader.lo subversion/libsvn_fs_util/libsvn_fs_util-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_fs_OBJECTS = access.lo deprecated.lo editor.lo fs-loader.lo
subversion/libsvn_fs/libsvn_fs-1.la: $(libsvn_fs_DEPS)
cd subversion/libsvn_fs && $(LINK_LIB) $(libsvn_fs_LDFLAGS) -o libsvn_fs-1.la $(LT_NO_UNDEFINED) $(libsvn_fs_OBJECTS) ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_FS_LIB_LINK) $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_fs_base_PATH = subversion/libsvn_fs_base
libsvn_fs_base_DEPS = subversion/libsvn_fs_base/bdb/bdb-err.lo subversion/libsvn_fs_base/bdb/bdb_compat.lo subversion/libsvn_fs_base/bdb/changes-table.lo subversion/libsvn_fs_base/bdb/checksum-reps-table.lo subversion/libsvn_fs_base/bdb/copies-table.lo subversion/libsvn_fs_base/bdb/dbt.lo subversion/libsvn_fs_base/bdb/env.lo subversion/libsvn_fs_base/bdb/lock-tokens-table.lo subversion/libsvn_fs_base/bdb/locks-table.lo subversion/libsvn_fs_base/bdb/miscellaneous-table.lo subversion/libsvn_fs_base/bdb/node-origins-table.lo subversion/libsvn_fs_base/bdb/nodes-table.lo subversion/libsvn_fs_base/bdb/reps-table.lo subversion/libsvn_fs_base/bdb/rev-table.lo subversion/libsvn_fs_base/bdb/strings-table.lo subversion/libsvn_fs_base/bdb/txn-table.lo subversion/libsvn_fs_base/bdb/uuids-table.lo subversion/libsvn_fs_base/dag.lo subversion/libsvn_fs_base/err.lo subversion/libsvn_fs_base/fs.lo subversion/libsvn_fs_base/id.lo subversion/libsvn_fs_base/key-gen.lo subversion/libsvn_fs_base/lock.lo subversion/libsvn_fs_base/node-rev.lo subversion/libsvn_fs_base/reps-strings.lo subversion/libsvn_fs_base/revs-txns.lo subversion/libsvn_fs_base/trail.lo subversion/libsvn_fs_base/tree.lo subversion/libsvn_fs_base/util/fs_skels.lo subversion/libsvn_fs_base/uuid.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la
libsvn_fs_base_OBJECTS = bdb/bdb-err.lo bdb/bdb_compat.lo bdb/changes-table.lo bdb/checksum-reps-table.lo bdb/copies-table.lo bdb/dbt.lo bdb/env.lo bdb/lock-tokens-table.lo bdb/locks-table.lo bdb/miscellaneous-table.lo bdb/node-origins-table.lo bdb/nodes-table.lo bdb/reps-table.lo bdb/rev-table.lo bdb/strings-table.lo bdb/txn-table.lo bdb/uuids-table.lo dag.lo err.lo fs.lo id.lo key-gen.lo lock.lo node-rev.lo reps-strings.lo revs-txns.lo trail.lo tree.lo util/fs_skels.lo uuid.lo
subversion/libsvn_fs_base/libsvn_fs_base-1.la: $(libsvn_fs_base_DEPS)
cd subversion/libsvn_fs_base && $(LINK_LIB) $(libsvn_fs_base_LDFLAGS) -o libsvn_fs_base-1.la $(LT_NO_UNDEFINED) $(libsvn_fs_base_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_DB_LIBS) ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la $(LIBS)
libsvn_fs_fs_PATH = subversion/libsvn_fs_fs
libsvn_fs_fs_DEPS = subversion/libsvn_fs_fs/cached_data.lo subversion/libsvn_fs_fs/caching.lo subversion/libsvn_fs_fs/dag.lo subversion/libsvn_fs_fs/dump-index.lo subversion/libsvn_fs_fs/fs.lo subversion/libsvn_fs_fs/fs_fs.lo subversion/libsvn_fs_fs/hotcopy.lo subversion/libsvn_fs_fs/id.lo subversion/libsvn_fs_fs/index.lo subversion/libsvn_fs_fs/load-index.lo subversion/libsvn_fs_fs/lock.lo subversion/libsvn_fs_fs/low_level.lo subversion/libsvn_fs_fs/pack.lo subversion/libsvn_fs_fs/recovery.lo subversion/libsvn_fs_fs/rep-cache.lo subversion/libsvn_fs_fs/rev_file.lo subversion/libsvn_fs_fs/revprops.lo subversion/libsvn_fs_fs/stats.lo subversion/libsvn_fs_fs/temp_serializer.lo subversion/libsvn_fs_fs/transaction.lo subversion/libsvn_fs_fs/tree.lo subversion/libsvn_fs_fs/util.lo subversion/libsvn_fs_fs/verify.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la
libsvn_fs_fs_OBJECTS = cached_data.lo caching.lo dag.lo dump-index.lo fs.lo fs_fs.lo hotcopy.lo id.lo index.lo load-index.lo lock.lo low_level.lo pack.lo recovery.lo rep-cache.lo rev_file.lo revprops.lo stats.lo temp_serializer.lo transaction.lo tree.lo util.lo verify.lo
subversion/libsvn_fs_fs/libsvn_fs_fs-1.la: $(libsvn_fs_fs_DEPS)
cd subversion/libsvn_fs_fs && $(LINK_LIB) $(libsvn_fs_fs_LDFLAGS) -o libsvn_fs_fs-1.la $(LT_NO_UNDEFINED) $(libsvn_fs_fs_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la $(LIBS)
libsvn_fs_util_PATH = subversion/libsvn_fs_util
libsvn_fs_util_DEPS = subversion/libsvn_fs_util/fs-util.lo subversion/libsvn_subr/libsvn_subr-1.la
libsvn_fs_util_OBJECTS = fs-util.lo
subversion/libsvn_fs_util/libsvn_fs_util-1.la: $(libsvn_fs_util_DEPS)
cd subversion/libsvn_fs_util && $(LINK_LIB) $(libsvn_fs_util_LDFLAGS) -o libsvn_fs_util-1.la $(LT_NO_UNDEFINED) $(libsvn_fs_util_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_fs_x_PATH = subversion/libsvn_fs_x
libsvn_fs_x_DEPS = subversion/libsvn_fs_x/cached_data.lo subversion/libsvn_fs_x/caching.lo subversion/libsvn_fs_x/changes.lo subversion/libsvn_fs_x/dag.lo subversion/libsvn_fs_x/fs.lo subversion/libsvn_fs_x/fs_id.lo subversion/libsvn_fs_x/fs_x.lo subversion/libsvn_fs_x/hotcopy.lo subversion/libsvn_fs_x/id.lo subversion/libsvn_fs_x/index.lo subversion/libsvn_fs_x/lock.lo subversion/libsvn_fs_x/low_level.lo subversion/libsvn_fs_x/noderevs.lo subversion/libsvn_fs_x/pack.lo subversion/libsvn_fs_x/recovery.lo subversion/libsvn_fs_x/rep-cache.lo subversion/libsvn_fs_x/reps.lo subversion/libsvn_fs_x/rev_file.lo subversion/libsvn_fs_x/revprops.lo subversion/libsvn_fs_x/string_table.lo subversion/libsvn_fs_x/temp_serializer.lo subversion/libsvn_fs_x/transaction.lo subversion/libsvn_fs_x/tree.lo subversion/libsvn_fs_x/util.lo subversion/libsvn_fs_x/verify.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la
libsvn_fs_x_OBJECTS = cached_data.lo caching.lo changes.lo dag.lo fs.lo fs_id.lo fs_x.lo hotcopy.lo id.lo index.lo lock.lo low_level.lo noderevs.lo pack.lo recovery.lo rep-cache.lo reps.lo rev_file.lo revprops.lo string_table.lo temp_serializer.lo transaction.lo tree.lo util.lo verify.lo
subversion/libsvn_fs_x/libsvn_fs_x-1.la: $(libsvn_fs_x_DEPS)
cd subversion/libsvn_fs_x && $(LINK_LIB) $(libsvn_fs_x_LDFLAGS) -o libsvn_fs_x-1.la $(LT_NO_UNDEFINED) $(libsvn_fs_x_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) ../../subversion/libsvn_fs_util/libsvn_fs_util-1.la $(LIBS)
libsvn_ra_PATH = subversion/libsvn_ra
install-lib: $(SVN_RA_LIB_INSTALL_DEPS)
libsvn_ra_DEPS = $(SVN_RA_LIB_DEPS) subversion/libsvn_ra/compat.lo subversion/libsvn_ra/debug_reporter.lo subversion/libsvn_ra/deprecated.lo subversion/libsvn_ra/editor.lo subversion/libsvn_ra/ra_loader.lo subversion/libsvn_ra/util.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_ra_OBJECTS = compat.lo debug_reporter.lo deprecated.lo editor.lo ra_loader.lo util.lo
subversion/libsvn_ra/libsvn_ra-1.la: $(libsvn_ra_DEPS)
cd subversion/libsvn_ra && $(LINK_LIB) $(libsvn_ra_LDFLAGS) -o libsvn_ra-1.la $(LT_NO_UNDEFINED) $(libsvn_ra_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_RA_LIB_LINK) $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_ra_local_PATH = subversion/libsvn_ra_local
libsvn_ra_local_DEPS = subversion/libsvn_ra_local/ra_plugin.lo subversion/libsvn_ra_local/split_url.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_ra_local_OBJECTS = ra_plugin.lo split_url.lo
subversion/libsvn_ra_local/libsvn_ra_local-1.la: $(libsvn_ra_local_DEPS)
cd subversion/libsvn_ra_local && $(LINK_LIB) $(libsvn_ra_local_LDFLAGS) -o libsvn_ra_local-1.la $(LT_NO_UNDEFINED) $(libsvn_ra_local_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_ra_serf_PATH = subversion/libsvn_ra_serf
libsvn_ra_serf_DEPS = subversion/libsvn_ra_serf/blame.lo subversion/libsvn_ra_serf/blncache.lo subversion/libsvn_ra_serf/commit.lo subversion/libsvn_ra_serf/eagain_bucket.lo subversion/libsvn_ra_serf/get_deleted_rev.lo subversion/libsvn_ra_serf/get_file.lo subversion/libsvn_ra_serf/get_lock.lo subversion/libsvn_ra_serf/getdate.lo subversion/libsvn_ra_serf/getlocations.lo subversion/libsvn_ra_serf/getlocationsegments.lo subversion/libsvn_ra_serf/getlocks.lo subversion/libsvn_ra_serf/inherited_props.lo subversion/libsvn_ra_serf/lock.lo subversion/libsvn_ra_serf/log.lo subversion/libsvn_ra_serf/merge.lo subversion/libsvn_ra_serf/mergeinfo.lo subversion/libsvn_ra_serf/multistatus.lo subversion/libsvn_ra_serf/options.lo subversion/libsvn_ra_serf/property.lo subversion/libsvn_ra_serf/replay.lo subversion/libsvn_ra_serf/sb_bucket.lo subversion/libsvn_ra_serf/serf.lo subversion/libsvn_ra_serf/stat.lo subversion/libsvn_ra_serf/update.lo subversion/libsvn_ra_serf/util.lo subversion/libsvn_ra_serf/util_error.lo subversion/libsvn_ra_serf/xml.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_ra_serf_OBJECTS = blame.lo blncache.lo commit.lo eagain_bucket.lo get_deleted_rev.lo get_file.lo get_lock.lo getdate.lo getlocations.lo getlocationsegments.lo getlocks.lo inherited_props.lo lock.lo log.lo merge.lo mergeinfo.lo multistatus.lo options.lo property.lo replay.lo sb_bucket.lo serf.lo stat.lo update.lo util.lo util_error.lo xml.lo
subversion/libsvn_ra_serf/libsvn_ra_serf-1.la: $(libsvn_ra_serf_DEPS)
cd subversion/libsvn_ra_serf && $(LINK_LIB) $(libsvn_ra_serf_LDFLAGS) -o libsvn_ra_serf-1.la $(LT_NO_UNDEFINED) $(libsvn_ra_serf_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_SERF_LIBS) $(SVN_XML_LIBS) $(SVN_ZLIB_LIBS) $(LIBS)
libsvn_ra_svn_PATH = subversion/libsvn_ra_svn
libsvn_ra_svn_DEPS = subversion/libsvn_ra_svn/client.lo subversion/libsvn_ra_svn/cram.lo subversion/libsvn_ra_svn/cyrus_auth.lo subversion/libsvn_ra_svn/deprecated.lo subversion/libsvn_ra_svn/editorp.lo subversion/libsvn_ra_svn/internal_auth.lo subversion/libsvn_ra_svn/marshal.lo subversion/libsvn_ra_svn/streams.lo subversion/libsvn_ra_svn/version.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_ra_svn_OBJECTS = client.lo cram.lo cyrus_auth.lo deprecated.lo editorp.lo internal_auth.lo marshal.lo streams.lo version.lo
subversion/libsvn_ra_svn/libsvn_ra_svn-1.la: $(libsvn_ra_svn_DEPS)
cd subversion/libsvn_ra_svn && $(LINK_LIB) $(libsvn_ra_svn_LDFLAGS) -o libsvn_ra_svn-1.la $(LT_NO_UNDEFINED) $(libsvn_ra_svn_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_SASL_LIBS) $(LIBS)
libsvn_repos_PATH = subversion/libsvn_repos
libsvn_repos_DEPS = subversion/libsvn_repos/authz.lo subversion/libsvn_repos/authz_pool.lo subversion/libsvn_repos/commit.lo subversion/libsvn_repos/config_pool.lo subversion/libsvn_repos/delta.lo subversion/libsvn_repos/deprecated.lo subversion/libsvn_repos/dump.lo subversion/libsvn_repos/fs-wrap.lo subversion/libsvn_repos/hooks.lo subversion/libsvn_repos/load-fs-vtable.lo subversion/libsvn_repos/load.lo subversion/libsvn_repos/log.lo subversion/libsvn_repos/node_tree.lo subversion/libsvn_repos/notify.lo subversion/libsvn_repos/replay.lo subversion/libsvn_repos/reporter.lo subversion/libsvn_repos/repos.lo subversion/libsvn_repos/rev_hunt.lo subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_repos_OBJECTS = authz.lo authz_pool.lo commit.lo config_pool.lo delta.lo deprecated.lo dump.lo fs-wrap.lo hooks.lo load-fs-vtable.lo load.lo log.lo node_tree.lo notify.lo replay.lo reporter.lo repos.lo rev_hunt.lo
subversion/libsvn_repos/libsvn_repos-1.la: $(libsvn_repos_DEPS)
cd subversion/libsvn_repos && $(LINK_LIB) $(libsvn_repos_LDFLAGS) -o libsvn_repos-1.la $(LT_NO_UNDEFINED) $(libsvn_repos_OBJECTS) ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_subr_PATH = subversion/libsvn_subr
libsvn_subr_DEPS = subversion/libsvn_subr/adler32.lo subversion/libsvn_subr/atomic.lo subversion/libsvn_subr/auth.lo subversion/libsvn_subr/base64.lo subversion/libsvn_subr/bit_array.lo subversion/libsvn_subr/cache-inprocess.lo subversion/libsvn_subr/cache-membuffer.lo subversion/libsvn_subr/cache-memcache.lo subversion/libsvn_subr/cache.lo subversion/libsvn_subr/cache_config.lo subversion/libsvn_subr/checksum.lo subversion/libsvn_subr/cmdline.lo subversion/libsvn_subr/compat.lo subversion/libsvn_subr/compress.lo subversion/libsvn_subr/config.lo subversion/libsvn_subr/config_auth.lo subversion/libsvn_subr/config_file.lo subversion/libsvn_subr/config_win.lo subversion/libsvn_subr/crypto.lo subversion/libsvn_subr/ctype.lo subversion/libsvn_subr/date.lo subversion/libsvn_subr/debug.lo subversion/libsvn_subr/deprecated.lo subversion/libsvn_subr/dirent_uri.lo subversion/libsvn_subr/dso.lo subversion/libsvn_subr/eol.lo subversion/libsvn_subr/error.lo subversion/libsvn_subr/fnv1a.lo subversion/libsvn_subr/gpg_agent.lo subversion/libsvn_subr/hash.lo subversion/libsvn_subr/io.lo subversion/libsvn_subr/iter.lo subversion/libsvn_subr/lock.lo subversion/libsvn_subr/log.lo subversion/libsvn_subr/macos_keychain.lo subversion/libsvn_subr/magic.lo subversion/libsvn_subr/md5.lo subversion/libsvn_subr/mergeinfo.lo subversion/libsvn_subr/mutex.lo subversion/libsvn_subr/nls.lo subversion/libsvn_subr/object_pool.lo subversion/libsvn_subr/opt.lo subversion/libsvn_subr/packed_data.lo subversion/libsvn_subr/path.lo subversion/libsvn_subr/pool.lo subversion/libsvn_subr/prefix_string.lo subversion/libsvn_subr/prompt.lo subversion/libsvn_subr/properties.lo subversion/libsvn_subr/quoprint.lo subversion/libsvn_subr/root_pools.lo subversion/libsvn_subr/simple_providers.lo subversion/libsvn_subr/skel.lo subversion/libsvn_subr/sorts.lo subversion/libsvn_subr/spillbuf.lo subversion/libsvn_subr/sqlite.lo subversion/libsvn_subr/sqlite3wrapper.lo subversion/libsvn_subr/ssl_client_cert_providers.lo subversion/libsvn_subr/ssl_client_cert_pw_providers.lo subversion/libsvn_subr/ssl_server_trust_providers.lo subversion/libsvn_subr/stream.lo subversion/libsvn_subr/string.lo subversion/libsvn_subr/subst.lo subversion/libsvn_subr/sysinfo.lo subversion/libsvn_subr/target.lo subversion/libsvn_subr/temp_serializer.lo subversion/libsvn_subr/time.lo subversion/libsvn_subr/token.lo subversion/libsvn_subr/types.lo subversion/libsvn_subr/user.lo subversion/libsvn_subr/username_providers.lo subversion/libsvn_subr/utf.lo subversion/libsvn_subr/utf8proc.lo subversion/libsvn_subr/utf_validate.lo subversion/libsvn_subr/utf_width.lo subversion/libsvn_subr/validate.lo subversion/libsvn_subr/version.lo subversion/libsvn_subr/win32_crashrpt.lo subversion/libsvn_subr/win32_crypto.lo subversion/libsvn_subr/win32_xlate.lo subversion/libsvn_subr/x509info.lo subversion/libsvn_subr/x509parse.lo subversion/libsvn_subr/xml.lo
libsvn_subr_OBJECTS = adler32.lo atomic.lo auth.lo base64.lo bit_array.lo cache-inprocess.lo cache-membuffer.lo cache-memcache.lo cache.lo cache_config.lo checksum.lo cmdline.lo compat.lo compress.lo config.lo config_auth.lo config_file.lo config_win.lo crypto.lo ctype.lo date.lo debug.lo deprecated.lo dirent_uri.lo dso.lo eol.lo error.lo fnv1a.lo gpg_agent.lo hash.lo io.lo iter.lo lock.lo log.lo macos_keychain.lo magic.lo md5.lo mergeinfo.lo mutex.lo nls.lo object_pool.lo opt.lo packed_data.lo path.lo pool.lo prefix_string.lo prompt.lo properties.lo quoprint.lo root_pools.lo simple_providers.lo skel.lo sorts.lo spillbuf.lo sqlite.lo sqlite3wrapper.lo ssl_client_cert_providers.lo ssl_client_cert_pw_providers.lo ssl_server_trust_providers.lo stream.lo string.lo subst.lo sysinfo.lo target.lo temp_serializer.lo time.lo token.lo types.lo user.lo username_providers.lo utf.lo utf8proc.lo utf_validate.lo utf_width.lo validate.lo version.lo win32_crashrpt.lo win32_crypto.lo win32_xlate.lo x509info.lo x509parse.lo xml.lo
subversion/libsvn_subr/libsvn_subr-1.la: $(libsvn_subr_DEPS)
cd subversion/libsvn_subr && $(LINK_LIB) $(libsvn_subr_LDFLAGS) -o libsvn_subr-1.la $(LT_NO_UNDEFINED) $(libsvn_subr_OBJECTS) $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_XML_LIBS) $(SVN_ZLIB_LIBS) $(SVN_APR_MEMCACHE_LIBS) $(SVN_SQLITE_LIBS) $(SVN_MAGIC_LIBS) $(SVN_INTL_LIBS) $(LIBS)
libsvn_swig_perl_PATH = subversion/bindings/swig/perl/libsvn_swig_perl
libsvn_swig_perl_DEPS = subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_swig_perl_OBJECTS = swigutil_pl.lo
subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la: $(libsvn_swig_perl_DEPS)
cd subversion/bindings/swig/perl/libsvn_swig_perl && $(LINK_LIB) $(libsvn_swig_perl_LDFLAGS) -o libsvn_swig_perl-1.la $(LT_NO_UNDEFINED) $(libsvn_swig_perl_OBJECTS) ../../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_PERL_LIBS) $(SVN_SWIG_LIBS) $(LIBS)
libsvn_swig_py_PATH = subversion/bindings/swig/python/libsvn_swig_py
libsvn_swig_py_DEPS = subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.lo subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_swig_py_OBJECTS = swigutil_py.lo
subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la: $(libsvn_swig_py_DEPS)
cd subversion/bindings/swig/python/libsvn_swig_py && $(LINK) $(libsvn_swig_py_LDFLAGS) -o libsvn_swig_py-1.la $(LT_NO_UNDEFINED) $(libsvn_swig_py_OBJECTS) ../../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_PYTHON_LIBS) $(SVN_SWIG_LIBS) $(LIBS)
libsvn_swig_ruby_PATH = subversion/bindings/swig/ruby/libsvn_swig_ruby
libsvn_swig_ruby_DEPS = subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.lo subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_swig_ruby_OBJECTS = swigutil_rb.lo
subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la: $(libsvn_swig_ruby_DEPS)
cd subversion/bindings/swig/ruby/libsvn_swig_ruby && $(LINK) $(SWIG_RB_LIBS) $(libsvn_swig_ruby_LDFLAGS) -o libsvn_swig_ruby-1.la $(LT_NO_UNDEFINED) $(libsvn_swig_ruby_OBJECTS) ../../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_RUBY_LIBS) $(SVN_SWIG_LIBS) $(LIBS)
libsvn_test_PATH = subversion/tests
libsvn_test_DEPS = subversion/tests/svn_test_fs.lo subversion/tests/svn_test_main.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_test_OBJECTS = svn_test_fs.lo svn_test_main.lo
subversion/tests/libsvn_test-1.la: $(libsvn_test_DEPS)
cd subversion/tests && $(LINK_LIB) $(libsvn_test_LDFLAGS) -o libsvn_test-1.la $(libsvn_test_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvn_wc_PATH = subversion/libsvn_wc
libsvn_wc_DEPS = subversion/libsvn_wc/adm_crawler.lo subversion/libsvn_wc/adm_files.lo subversion/libsvn_wc/adm_ops.lo subversion/libsvn_wc/ambient_depth_filter_editor.lo subversion/libsvn_wc/cleanup.lo subversion/libsvn_wc/conflicts.lo subversion/libsvn_wc/context.lo subversion/libsvn_wc/copy.lo subversion/libsvn_wc/crop.lo subversion/libsvn_wc/delete.lo subversion/libsvn_wc/deprecated.lo subversion/libsvn_wc/diff_editor.lo subversion/libsvn_wc/diff_local.lo subversion/libsvn_wc/entries.lo subversion/libsvn_wc/externals.lo subversion/libsvn_wc/info.lo subversion/libsvn_wc/lock.lo subversion/libsvn_wc/merge.lo subversion/libsvn_wc/node.lo subversion/libsvn_wc/old-and-busted.lo subversion/libsvn_wc/props.lo subversion/libsvn_wc/questions.lo subversion/libsvn_wc/relocate.lo subversion/libsvn_wc/revert.lo subversion/libsvn_wc/revision_status.lo subversion/libsvn_wc/status.lo subversion/libsvn_wc/translate.lo subversion/libsvn_wc/tree_conflicts.lo subversion/libsvn_wc/update_editor.lo subversion/libsvn_wc/upgrade.lo subversion/libsvn_wc/util.lo subversion/libsvn_wc/wc_db.lo subversion/libsvn_wc/wc_db_pristine.lo subversion/libsvn_wc/wc_db_update_move.lo subversion/libsvn_wc/wc_db_util.lo subversion/libsvn_wc/wc_db_wcroot.lo subversion/libsvn_wc/wcroot_anchor.lo subversion/libsvn_wc/workqueue.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
libsvn_wc_OBJECTS = adm_crawler.lo adm_files.lo adm_ops.lo ambient_depth_filter_editor.lo cleanup.lo conflicts.lo context.lo copy.lo crop.lo delete.lo deprecated.lo diff_editor.lo diff_local.lo entries.lo externals.lo info.lo lock.lo merge.lo node.lo old-and-busted.lo props.lo questions.lo relocate.lo revert.lo revision_status.lo status.lo translate.lo tree_conflicts.lo update_editor.lo upgrade.lo util.lo wc_db.lo wc_db_pristine.lo wc_db_update_move.lo wc_db_util.lo wc_db_wcroot.lo wcroot_anchor.lo workqueue.lo
subversion/libsvn_wc/libsvn_wc-1.la: $(libsvn_wc_DEPS)
cd subversion/libsvn_wc && $(LINK_LIB) $(libsvn_wc_LDFLAGS) -o libsvn_wc-1.la $(LT_NO_UNDEFINED) $(libsvn_wc_OBJECTS) ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvncxxhl_PATH = subversion/bindings/cxxhl
libsvncxxhl_DEPS = subversion/bindings/cxxhl/src/aprwrap/impl.lo subversion/bindings/cxxhl/src/exception.lo subversion/bindings/cxxhl/src/tristate.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs/libsvn_fs-1.la
libsvncxxhl_OBJECTS = src/aprwrap/impl.lo src/exception.lo src/tristate.lo
subversion/bindings/cxxhl/libsvncxxhl-1.la: $(libsvncxxhl_DEPS)
cd subversion/bindings/cxxhl && $(LINK_CXX_LIB) $(libsvncxxhl_LDFLAGS) -o libsvncxxhl-1.la $(LT_NO_UNDEFINED) $(libsvncxxhl_OBJECTS) ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
libsvnjavahl_PATH = subversion/bindings/javahl/native
libsvnjavahl_DEPS = $(javahl_java_DEPS) $(javahl_callback_javah_DEPS) $(javahl_remote_javah_DEPS) $(javahl_types_javah_DEPS) $(javahl_util_javah_DEPS) $(javahl_javah_DEPS) subversion/bindings/javahl/native/Array.lo subversion/bindings/javahl/native/AuthnCallback.lo subversion/bindings/javahl/native/BlameCallback.lo subversion/bindings/javahl/native/ChangelistCallback.lo subversion/bindings/javahl/native/ClientContext.lo subversion/bindings/javahl/native/CommitCallback.lo subversion/bindings/javahl/native/CommitEditor.lo subversion/bindings/javahl/native/CommitMessage.lo subversion/bindings/javahl/native/CopySources.lo subversion/bindings/javahl/native/CreateJ.lo subversion/bindings/javahl/native/Credential.lo subversion/bindings/javahl/native/DiffOptions.lo subversion/bindings/javahl/native/DiffSummaryReceiver.lo subversion/bindings/javahl/native/EditorCallbacks.lo subversion/bindings/javahl/native/EditorProxy.lo subversion/bindings/javahl/native/EnumMapper.lo subversion/bindings/javahl/native/ExternalItem.lo subversion/bindings/javahl/native/File.lo subversion/bindings/javahl/native/ImportFilterCallback.lo subversion/bindings/javahl/native/InfoCallback.lo subversion/bindings/javahl/native/InputStream.lo subversion/bindings/javahl/native/Iterator.lo subversion/bindings/javahl/native/JNIByteArray.lo subversion/bindings/javahl/native/JNICriticalSection.lo subversion/bindings/javahl/native/JNIMutex.lo subversion/bindings/javahl/native/JNIStackElement.lo subversion/bindings/javahl/native/JNIStringHolder.lo subversion/bindings/javahl/native/JNIUtil.lo subversion/bindings/javahl/native/ListCallback.lo subversion/bindings/javahl/native/LockTokenTable.lo subversion/bindings/javahl/native/LogMessageCallback.lo subversion/bindings/javahl/native/MessageReceiver.lo subversion/bindings/javahl/native/NativeStream.lo subversion/bindings/javahl/native/OperationContext.lo subversion/bindings/javahl/native/OutputStream.lo subversion/bindings/javahl/native/PatchCallback.lo subversion/bindings/javahl/native/Path.lo subversion/bindings/javahl/native/Pool.lo subversion/bindings/javahl/native/Prompter.lo subversion/bindings/javahl/native/PropertyTable.lo subversion/bindings/javahl/native/ProplistCallback.lo subversion/bindings/javahl/native/RemoteSession.lo subversion/bindings/javahl/native/RemoteSessionContext.lo subversion/bindings/javahl/native/ReposFreezeAction.lo subversion/bindings/javahl/native/ReposNotifyCallback.lo subversion/bindings/javahl/native/ReposVerifyCallback.lo subversion/bindings/javahl/native/Revision.lo subversion/bindings/javahl/native/RevisionRange.lo subversion/bindings/javahl/native/RevisionRangeList.lo subversion/bindings/javahl/native/SVNBase.lo subversion/bindings/javahl/native/SVNClient.lo subversion/bindings/javahl/native/SVNRepos.lo subversion/bindings/javahl/native/StateReporter.lo subversion/bindings/javahl/native/StatusCallback.lo subversion/bindings/javahl/native/StringArray.lo subversion/bindings/javahl/native/SubversionException.lo subversion/bindings/javahl/native/Targets.lo subversion/bindings/javahl/native/Utility.lo subversion/bindings/javahl/native/VersionExtended.lo subversion/bindings/javahl/native/deprecated.lo subversion/bindings/javahl/native/jniwrapper/jni_base.lo subversion/bindings/javahl/native/jniwrapper/jni_channel.lo subversion/bindings/javahl/native/jniwrapper/jni_class_cache.lo subversion/bindings/javahl/native/jniwrapper/jni_io_stream.lo subversion/bindings/javahl/native/jniwrapper/jni_iterator.lo subversion/bindings/javahl/native/jniwrapper/jni_list.lo subversion/bindings/javahl/native/jniwrapper/jni_string_map.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs/libsvn_fs-1.la
libsvnjavahl_OBJECTS = Array.lo AuthnCallback.lo BlameCallback.lo ChangelistCallback.lo ClientContext.lo CommitCallback.lo CommitEditor.lo CommitMessage.lo CopySources.lo CreateJ.lo Credential.lo DiffOptions.lo DiffSummaryReceiver.lo EditorCallbacks.lo EditorProxy.lo EnumMapper.lo ExternalItem.lo File.lo ImportFilterCallback.lo InfoCallback.lo InputStream.lo Iterator.lo JNIByteArray.lo JNICriticalSection.lo JNIMutex.lo JNIStackElement.lo JNIStringHolder.lo JNIUtil.lo ListCallback.lo LockTokenTable.lo LogMessageCallback.lo MessageReceiver.lo NativeStream.lo OperationContext.lo OutputStream.lo PatchCallback.lo Path.lo Pool.lo Prompter.lo PropertyTable.lo ProplistCallback.lo RemoteSession.lo RemoteSessionContext.lo ReposFreezeAction.lo ReposNotifyCallback.lo ReposVerifyCallback.lo Revision.lo RevisionRange.lo RevisionRangeList.lo SVNBase.lo SVNClient.lo SVNRepos.lo StateReporter.lo StatusCallback.lo StringArray.lo SubversionException.lo Targets.lo Utility.lo VersionExtended.lo deprecated.lo jniwrapper/jni_base.lo jniwrapper/jni_channel.lo jniwrapper/jni_class_cache.lo jniwrapper/jni_io_stream.lo jniwrapper/jni_iterator.lo jniwrapper/jni_list.lo jniwrapper/jni_string_map.lo org_apache_subversion_javahl_NativeResources.lo org_apache_subversion_javahl_SVNClient.lo org_apache_subversion_javahl_SVNRepos.lo org_apache_subversion_javahl_remote_CommitEditor.lo org_apache_subversion_javahl_remote_RemoteFactory.lo org_apache_subversion_javahl_remote_RemoteSession.lo org_apache_subversion_javahl_remote_StateReporter.lo org_apache_subversion_javahl_types_RevisionRangeList.lo org_apache_subversion_javahl_types_RuntimeVersion.lo org_apache_subversion_javahl_types_Version.lo org_apache_subversion_javahl_types_VersionExtended.lo org_apache_subversion_javahl_util_ConfigImpl_Category.lo org_apache_subversion_javahl_util_ConfigLib.lo org_apache_subversion_javahl_util_DiffLib.lo org_apache_subversion_javahl_util_PropLib.lo org_apache_subversion_javahl_util_SubstLib.lo org_apache_subversion_javahl_util_TunnelChannel.lo
subversion/bindings/javahl/native/libsvnjavahl-1.la: $(libsvnjavahl_DEPS)
cd subversion/bindings/javahl/native && $(LINK_JAVAHL_CXX) $(libsvnjavahl_LDFLAGS) -o libsvnjavahl-1.la $(LT_NO_UNDEFINED) $(libsvnjavahl_OBJECTS) ../../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la ../../../../subversion/libsvn_fs/libsvn_fs-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_JAVA_SDK_LIBS) $(LIBS)
locale_PATH = subversion/po
locale_DEPS = subversion/po/de.mo subversion/po/es.mo subversion/po/fr.mo subversion/po/it.mo subversion/po/ja.mo subversion/po/ko.mo subversion/po/nb.mo subversion/po/pl.mo subversion/po/pt_BR.mo subversion/po/sv.mo subversion/po/zh_CN.mo subversion/po/zh_TW.mo
locale: $(locale_DEPS)
lock_helper_PATH = subversion/tests/cmdline
lock_helper_DEPS = subversion/tests/cmdline/lock-helper.lo subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la
lock_helper_OBJECTS = lock-helper.lo
subversion/tests/cmdline/lock-helper$(EXEEXT): $(lock_helper_DEPS)
cd subversion/tests/cmdline && $(LINK) $(lock_helper_LDFLAGS) -o lock-helper$(EXEEXT) $(lock_helper_OBJECTS) ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
locks_test_PATH = subversion/tests/libsvn_fs
locks_test_DEPS = subversion/tests/libsvn_fs/locks-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
locks_test_OBJECTS = locks-test.lo
subversion/tests/libsvn_fs/locks-test$(EXEEXT): $(locks_test_DEPS)
cd subversion/tests/libsvn_fs && $(LINK) $(locks_test_LDFLAGS) -o locks-test$(EXEEXT) $(locks_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
mergeinfo_test_PATH = subversion/tests/libsvn_subr
mergeinfo_test_DEPS = subversion/tests/libsvn_subr/mergeinfo-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
mergeinfo_test_OBJECTS = mergeinfo-test.lo
subversion/tests/libsvn_subr/mergeinfo-test$(EXEEXT): $(mergeinfo_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(mergeinfo_test_LDFLAGS) -o mergeinfo-test$(EXEEXT) $(mergeinfo_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
mod_authz_svn_PATH = subversion/mod_authz_svn
mod_authz_svn_DEPS = subversion/mod_authz_svn/mod_authz_svn.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/mod_dav_svn/mod_dav_svn.la
mod_authz_svn_OBJECTS = mod_authz_svn.lo
subversion/mod_authz_svn/mod_authz_svn.la: $(mod_authz_svn_DEPS)
if $(INSTALL_APACHE_MODS) ; then cd subversion/mod_authz_svn && $(LINK_APACHE_MOD) $(mod_authz_svn_LDFLAGS) -o mod_authz_svn.la $(LT_NO_UNDEFINED) $(mod_authz_svn_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_HTTPD_LIBS) $(LIBS) ; else echo "fake" > subversion/mod_authz_svn/mod_authz_svn.la ; fi
mod_dav_svn_PATH = subversion/mod_dav_svn
mod_dav_svn_DEPS = subversion/mod_dav_svn/activity.lo subversion/mod_dav_svn/authz.lo subversion/mod_dav_svn/deadprops.lo subversion/mod_dav_svn/liveprops.lo subversion/mod_dav_svn/lock.lo subversion/mod_dav_svn/merge.lo subversion/mod_dav_svn/mirror.lo subversion/mod_dav_svn/mod_dav_svn.lo subversion/mod_dav_svn/posts/create_txn.lo subversion/mod_dav_svn/reports/dated-rev.lo subversion/mod_dav_svn/reports/deleted-rev.lo subversion/mod_dav_svn/reports/file-revs.lo subversion/mod_dav_svn/reports/get-location-segments.lo subversion/mod_dav_svn/reports/get-locations.lo subversion/mod_dav_svn/reports/get-locks.lo subversion/mod_dav_svn/reports/inherited-props.lo subversion/mod_dav_svn/reports/log.lo subversion/mod_dav_svn/reports/mergeinfo.lo subversion/mod_dav_svn/reports/replay.lo subversion/mod_dav_svn/reports/update.lo subversion/mod_dav_svn/repos.lo subversion/mod_dav_svn/status.lo subversion/mod_dav_svn/util.lo subversion/mod_dav_svn/version.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
mod_dav_svn_OBJECTS = activity.lo authz.lo deadprops.lo liveprops.lo lock.lo merge.lo mirror.lo mod_dav_svn.lo posts/create_txn.lo reports/dated-rev.lo reports/deleted-rev.lo reports/file-revs.lo reports/get-location-segments.lo reports/get-locations.lo reports/get-locks.lo reports/inherited-props.lo reports/log.lo reports/mergeinfo.lo reports/replay.lo reports/update.lo repos.lo status.lo util.lo version.lo
subversion/mod_dav_svn/mod_dav_svn.la: $(mod_dav_svn_DEPS)
if $(INSTALL_APACHE_MODS) ; then cd subversion/mod_dav_svn && $(LINK_APACHE_MOD) $(mod_dav_svn_LDFLAGS) -o mod_dav_svn.la $(LT_NO_UNDEFINED) $(mod_dav_svn_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_HTTPD_LIBS) $(SVN_MOD_DAV_LIBS) $(LIBS) ; else echo "fake" > subversion/mod_dav_svn/mod_dav_svn.la ; fi
mod_dontdothat_PATH = tools/server-side/mod_dontdothat
mod_dontdothat_DEPS = tools/server-side/mod_dontdothat/mod_dontdothat.lo subversion/libsvn_subr/libsvn_subr-1.la subversion/mod_dav_svn/mod_dav_svn.la
mod_dontdothat_OBJECTS = mod_dontdothat.lo
tools/server-side/mod_dontdothat/mod_dontdothat.la: $(mod_dontdothat_DEPS)
if $(INSTALL_APACHE_MODS) ; then cd tools/server-side/mod_dontdothat && $(LINK_APACHE_MOD) $(mod_dontdothat_LDFLAGS) -o mod_dontdothat.la $(LT_NO_UNDEFINED) $(mod_dontdothat_OBJECTS) ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_XML_LIBS) $(SVN_HTTPD_LIBS) $(LIBS) ; else echo "fake" > tools/server-side/mod_dontdothat/mod_dontdothat.la ; fi
mtcc_test_PATH = subversion/tests/libsvn_client
mtcc_test_DEPS = subversion/tests/libsvn_client/mtcc-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
mtcc_test_OBJECTS = mtcc-test.lo
subversion/tests/libsvn_client/mtcc-test$(EXEEXT): $(mtcc_test_DEPS)
cd subversion/tests/libsvn_client && $(LINK) $(mtcc_test_LDFLAGS) -o mtcc-test$(EXEEXT) $(mtcc_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
op_depth_test_PATH = subversion/tests/libsvn_wc
op_depth_test_DEPS = subversion/tests/libsvn_wc/op-depth-test.lo subversion/tests/libsvn_wc/utils.lo subversion/libsvn_client/libsvn_client-1.la subversion/tests/libsvn_test-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
op_depth_test_OBJECTS = op-depth-test.lo utils.lo
subversion/tests/libsvn_wc/op-depth-test$(EXEEXT): $(op_depth_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(op_depth_test_LDFLAGS) -o op-depth-test$(EXEEXT) $(op_depth_test_OBJECTS) ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
opt_test_PATH = subversion/tests/libsvn_subr
opt_test_DEPS = subversion/tests/libsvn_subr/opt-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
opt_test_OBJECTS = opt-test.lo
subversion/tests/libsvn_subr/opt-test$(EXEEXT): $(opt_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(opt_test_LDFLAGS) -o opt-test$(EXEEXT) $(opt_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
packed_data_test_PATH = subversion/tests/libsvn_subr
packed_data_test_DEPS = subversion/tests/libsvn_subr/packed-data-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
packed_data_test_OBJECTS = packed-data-test.lo
subversion/tests/libsvn_subr/packed-data-test$(EXEEXT): $(packed_data_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(packed_data_test_LDFLAGS) -o packed-data-test$(EXEEXT) $(packed_data_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
parse_diff_test_PATH = subversion/tests/libsvn_diff
parse_diff_test_DEPS = subversion/tests/libsvn_diff/parse-diff-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
parse_diff_test_OBJECTS = parse-diff-test.lo
subversion/tests/libsvn_diff/parse-diff-test$(EXEEXT): $(parse_diff_test_DEPS)
cd subversion/tests/libsvn_diff && $(LINK) $(parse_diff_test_LDFLAGS) -o parse-diff-test$(EXEEXT) $(parse_diff_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
path_test_PATH = subversion/tests/libsvn_subr
path_test_DEPS = subversion/tests/libsvn_subr/path-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
path_test_OBJECTS = path-test.lo
subversion/tests/libsvn_subr/path-test$(EXEEXT): $(path_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(path_test_LDFLAGS) -o path-test$(EXEEXT) $(path_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
perl_client_PATH = subversion/bindings/swig/perl/native
perl_client_DEPS = subversion/bindings/swig/perl/native/svn_client.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_client_OBJECTS = svn_client.lo
subversion/bindings/swig/perl/native/_Client.la: $(perl_client_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_client_LDFLAGS) -o _Client.la $(LT_NO_UNDEFINED) $(perl_client_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_core_PATH = subversion/bindings/swig/perl/native
perl_core_DEPS = subversion/bindings/swig/perl/native/core.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
perl_core_OBJECTS = core.lo
subversion/bindings/swig/perl/native/_Core.la: $(perl_core_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_core_LDFLAGS) -o _Core.la $(LT_NO_UNDEFINED) $(perl_core_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_delta_PATH = subversion/bindings/swig/perl/native
perl_delta_DEPS = subversion/bindings/swig/perl/native/svn_delta.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_delta_OBJECTS = svn_delta.lo
subversion/bindings/swig/perl/native/_Delta.la: $(perl_delta_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_delta_LDFLAGS) -o _Delta.la $(LT_NO_UNDEFINED) $(perl_delta_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_diff_PATH = subversion/bindings/swig/perl/native
perl_diff_DEPS = subversion/bindings/swig/perl/native/svn_diff.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_diff_OBJECTS = svn_diff.lo
subversion/bindings/swig/perl/native/_Diff.la: $(perl_diff_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_diff_LDFLAGS) -o _Diff.la $(LT_NO_UNDEFINED) $(perl_diff_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_fs_PATH = subversion/bindings/swig/perl/native
perl_fs_DEPS = subversion/bindings/swig/perl/native/svn_fs.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_fs_OBJECTS = svn_fs.lo
subversion/bindings/swig/perl/native/_Fs.la: $(perl_fs_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_fs_LDFLAGS) -o _Fs.la $(LT_NO_UNDEFINED) $(perl_fs_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_ra_PATH = subversion/bindings/swig/perl/native
perl_ra_DEPS = subversion/bindings/swig/perl/native/svn_ra.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_ra_OBJECTS = svn_ra.lo
subversion/bindings/swig/perl/native/_Ra.la: $(perl_ra_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_ra_LDFLAGS) -o _Ra.la $(LT_NO_UNDEFINED) $(perl_ra_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_repos_PATH = subversion/bindings/swig/perl/native
perl_repos_DEPS = subversion/bindings/swig/perl/native/svn_repos.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_repos_OBJECTS = svn_repos.lo
subversion/bindings/swig/perl/native/_Repos.la: $(perl_repos_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_repos_LDFLAGS) -o _Repos.la $(LT_NO_UNDEFINED) $(perl_repos_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
perl_wc_PATH = subversion/bindings/swig/perl/native
perl_wc_DEPS = subversion/bindings/swig/perl/native/svn_wc.lo subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/perl/native/_Core.la
perl_wc_OBJECTS = svn_wc.lo
subversion/bindings/swig/perl/native/_Wc.la: $(perl_wc_DEPS)
cd subversion/bindings/swig/perl/native && $(LINK_PL_WRAPPER) $(perl_wc_LDFLAGS) -o _Wc.la $(LT_NO_UNDEFINED) $(perl_wc_OBJECTS) ../../../../../subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la ../../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
prefix_string_test_PATH = subversion/tests/libsvn_subr
prefix_string_test_DEPS = subversion/tests/libsvn_subr/prefix-string-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
prefix_string_test_OBJECTS = prefix-string-test.lo
subversion/tests/libsvn_subr/prefix-string-test$(EXEEXT): $(prefix_string_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(prefix_string_test_LDFLAGS) -o prefix-string-test$(EXEEXT) $(prefix_string_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
priority_queue_test_PATH = subversion/tests/libsvn_subr
priority_queue_test_DEPS = subversion/tests/libsvn_subr/priority-queue-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
priority_queue_test_OBJECTS = priority-queue-test.lo
subversion/tests/libsvn_subr/priority-queue-test$(EXEEXT): $(priority_queue_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(priority_queue_test_LDFLAGS) -o priority-queue-test$(EXEEXT) $(priority_queue_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
pristine_store_test_PATH = subversion/tests/libsvn_wc
pristine_store_test_DEPS = subversion/tests/libsvn_wc/pristine-store-test.lo subversion/tests/libsvn_wc/utils.lo subversion/libsvn_client/libsvn_client-1.la subversion/tests/libsvn_test-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
pristine_store_test_OBJECTS = pristine-store-test.lo utils.lo
subversion/tests/libsvn_wc/pristine-store-test$(EXEEXT): $(pristine_store_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(pristine_store_test_LDFLAGS) -o pristine-store-test$(EXEEXT) $(pristine_store_test_OBJECTS) ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
python_client_PATH = subversion/bindings/swig/python
python_client_DEPS = subversion/bindings/swig/python/svn_client.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_client_OBJECTS = svn_client.lo
subversion/bindings/swig/python/_client.la: $(python_client_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_client_LDFLAGS) -o _client.la $(LT_NO_UNDEFINED) $(python_client_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_core_PATH = subversion/bindings/swig/python
python_core_DEPS = subversion/bindings/swig/python/core.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
python_core_OBJECTS = core.lo
subversion/bindings/swig/python/_core.la: $(python_core_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_core_LDFLAGS) -o _core.la $(LT_NO_UNDEFINED) $(python_core_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_delta_PATH = subversion/bindings/swig/python
python_delta_DEPS = subversion/bindings/swig/python/svn_delta.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_delta_OBJECTS = svn_delta.lo
subversion/bindings/swig/python/_delta.la: $(python_delta_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_delta_LDFLAGS) -o _delta.la $(LT_NO_UNDEFINED) $(python_delta_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_diff_PATH = subversion/bindings/swig/python
python_diff_DEPS = subversion/bindings/swig/python/svn_diff.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_diff_OBJECTS = svn_diff.lo
subversion/bindings/swig/python/_diff.la: $(python_diff_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_diff_LDFLAGS) -o _diff.la $(LT_NO_UNDEFINED) $(python_diff_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_fs_PATH = subversion/bindings/swig/python
python_fs_DEPS = subversion/bindings/swig/python/svn_fs.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_fs_OBJECTS = svn_fs.lo
subversion/bindings/swig/python/_fs.la: $(python_fs_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_fs_LDFLAGS) -o _fs.la $(LT_NO_UNDEFINED) $(python_fs_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_ra_PATH = subversion/bindings/swig/python
python_ra_DEPS = subversion/bindings/swig/python/svn_ra.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_ra_OBJECTS = svn_ra.lo
subversion/bindings/swig/python/_ra.la: $(python_ra_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_ra_LDFLAGS) -o _ra.la $(LT_NO_UNDEFINED) $(python_ra_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_repos_PATH = subversion/bindings/swig/python
python_repos_DEPS = subversion/bindings/swig/python/svn_repos.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_repos_OBJECTS = svn_repos.lo
subversion/bindings/swig/python/_repos.la: $(python_repos_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_repos_LDFLAGS) -o _repos.la $(LT_NO_UNDEFINED) $(python_repos_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
python_wc_PATH = subversion/bindings/swig/python
python_wc_DEPS = subversion/bindings/swig/python/svn_wc.lo subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/python/_core.la
python_wc_OBJECTS = svn_wc.lo
subversion/bindings/swig/python/_wc.la: $(python_wc_DEPS)
cd subversion/bindings/swig/python && $(LINK_PY_WRAPPER) $(python_wc_LDFLAGS) -o _wc.la $(LT_NO_UNDEFINED) $(python_wc_OBJECTS) ../../../../subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la ../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ra_local_test_PATH = subversion/tests/libsvn_ra_local
ra_local_test_DEPS = subversion/tests/libsvn_ra_local/ra-local-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_ra_local/libsvn_ra_local-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
ra_local_test_OBJECTS = ra-local-test.lo
subversion/tests/libsvn_ra_local/ra-local-test$(EXEEXT): $(ra_local_test_DEPS)
cd subversion/tests/libsvn_ra_local && $(LINK) $(ra_local_test_LDFLAGS) -o ra-local-test$(EXEEXT) $(ra_local_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_ra_local/libsvn_ra_local-1.la ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
ra_test_PATH = subversion/tests/libsvn_ra
ra_test_DEPS = subversion/tests/libsvn_ra/ra-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_ra_svn/libsvn_ra_svn-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
ra_test_OBJECTS = ra-test.lo
subversion/tests/libsvn_ra/ra-test$(EXEEXT): $(ra_test_DEPS)
cd subversion/tests/libsvn_ra && $(LINK) $(ra_test_LDFLAGS) -o ra-test$(EXEEXT) $(ra_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_ra_svn/libsvn_ra_svn-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
random_test_PATH = subversion/tests/libsvn_delta
random_test_DEPS = subversion/tests/libsvn_delta/random-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
random_test_OBJECTS = random-test.lo
subversion/tests/libsvn_delta/random-test$(EXEEXT): $(random_test_DEPS)
cd subversion/tests/libsvn_delta && $(LINK) $(random_test_LDFLAGS) -o random-test$(EXEEXT) $(random_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
repos_test_PATH = subversion/tests/libsvn_repos
repos_test_DEPS = subversion/tests/libsvn_repos/dir-delta-editor.lo subversion/tests/libsvn_repos/repos-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
repos_test_OBJECTS = dir-delta-editor.lo repos-test.lo
subversion/tests/libsvn_repos/repos-test$(EXEEXT): $(repos_test_DEPS)
cd subversion/tests/libsvn_repos && $(LINK) $(repos_test_LDFLAGS) -o repos-test$(EXEEXT) $(repos_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
revision_test_PATH = subversion/tests/libsvn_subr
revision_test_DEPS = subversion/tests/libsvn_subr/revision-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
revision_test_OBJECTS = revision-test.lo
subversion/tests/libsvn_subr/revision-test$(EXEEXT): $(revision_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(revision_test_LDFLAGS) -o revision-test$(EXEEXT) $(revision_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
root_pools_test_PATH = subversion/tests/libsvn_subr
root_pools_test_DEPS = subversion/tests/libsvn_subr/root-pools-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
root_pools_test_OBJECTS = root-pools-test.lo
subversion/tests/libsvn_subr/root-pools-test$(EXEEXT): $(root_pools_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(root_pools_test_LDFLAGS) -o root-pools-test$(EXEEXT) $(root_pools_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
ruby_client_PATH = subversion/bindings/swig/ruby
ruby_client_DEPS = subversion/bindings/swig/ruby/svn_client.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_client_OBJECTS = svn_client.lo
subversion/bindings/swig/ruby/client.la: $(ruby_client_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_client_LDFLAGS) -o client.la $(LT_NO_UNDEFINED) $(ruby_client_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_core_PATH = subversion/bindings/swig/ruby
ruby_core_DEPS = subversion/bindings/swig/ruby/core.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
ruby_core_OBJECTS = core.lo
subversion/bindings/swig/ruby/core.la: $(ruby_core_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_core_LDFLAGS) -o core.la $(LT_NO_UNDEFINED) $(ruby_core_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_delta_PATH = subversion/bindings/swig/ruby
ruby_delta_DEPS = subversion/bindings/swig/ruby/svn_delta.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_delta_OBJECTS = svn_delta.lo
subversion/bindings/swig/ruby/delta.la: $(ruby_delta_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_delta_LDFLAGS) -o delta.la $(LT_NO_UNDEFINED) $(ruby_delta_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_diff_PATH = subversion/bindings/swig/ruby
ruby_diff_DEPS = subversion/bindings/swig/ruby/svn_diff.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_diff_OBJECTS = svn_diff.lo
subversion/bindings/swig/ruby/diff.la: $(ruby_diff_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_diff_LDFLAGS) -o diff.la $(LT_NO_UNDEFINED) $(ruby_diff_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_fs_PATH = subversion/bindings/swig/ruby
ruby_fs_DEPS = subversion/bindings/swig/ruby/svn_fs.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_fs_OBJECTS = svn_fs.lo
subversion/bindings/swig/ruby/fs.la: $(ruby_fs_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_fs_LDFLAGS) -o fs.la $(LT_NO_UNDEFINED) $(ruby_fs_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_ra_PATH = subversion/bindings/swig/ruby
ruby_ra_DEPS = subversion/bindings/swig/ruby/svn_ra.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_ra_OBJECTS = svn_ra.lo
subversion/bindings/swig/ruby/ra.la: $(ruby_ra_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_ra_LDFLAGS) -o ra.la $(LT_NO_UNDEFINED) $(ruby_ra_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_repos_PATH = subversion/bindings/swig/ruby
ruby_repos_DEPS = subversion/bindings/swig/ruby/svn_repos.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_repos_OBJECTS = svn_repos.lo
subversion/bindings/swig/ruby/repos.la: $(ruby_repos_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_repos_LDFLAGS) -o repos.la $(LT_NO_UNDEFINED) $(ruby_repos_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
ruby_wc_PATH = subversion/bindings/swig/ruby
ruby_wc_DEPS = subversion/bindings/swig/ruby/svn_wc.lo subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/bindings/swig/ruby/core.la
ruby_wc_OBJECTS = svn_wc.lo
subversion/bindings/swig/ruby/wc.la: $(ruby_wc_DEPS)
cd subversion/bindings/swig/ruby && $(LINK_RB_WRAPPER) $(ruby_wc_LDFLAGS) -o wc.la $(LT_NO_UNDEFINED) $(ruby_wc_OBJECTS) ../../../../subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la ../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
skel_test_PATH = subversion/tests/libsvn_subr
skel_test_DEPS = subversion/tests/libsvn_subr/skel-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
skel_test_OBJECTS = skel-test.lo
subversion/tests/libsvn_subr/skel-test$(EXEEXT): $(skel_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(skel_test_LDFLAGS) -o skel-test$(EXEEXT) $(skel_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
spillbuf_test_PATH = subversion/tests/libsvn_subr
spillbuf_test_DEPS = subversion/tests/libsvn_subr/spillbuf-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
spillbuf_test_OBJECTS = spillbuf-test.lo
subversion/tests/libsvn_subr/spillbuf-test$(EXEEXT): $(spillbuf_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(spillbuf_test_LDFLAGS) -o spillbuf-test$(EXEEXT) $(spillbuf_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
sqlite_test_PATH = subversion/tests/libsvn_subr
sqlite_test_DEPS = subversion/tests/libsvn_subr/sqlite-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
sqlite_test_OBJECTS = sqlite-test.lo
subversion/tests/libsvn_subr/sqlite-test$(EXEEXT): $(sqlite_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(sqlite_test_LDFLAGS) -o sqlite-test$(EXEEXT) $(sqlite_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
stream_test_PATH = subversion/tests/libsvn_subr
stream_test_DEPS = subversion/tests/libsvn_subr/stream-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
stream_test_OBJECTS = stream-test.lo
subversion/tests/libsvn_subr/stream-test$(EXEEXT): $(stream_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(stream_test_LDFLAGS) -o stream-test$(EXEEXT) $(stream_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
string_table_test_PATH = subversion/tests/libsvn_fs_x
string_table_test_DEPS = subversion/tests/libsvn_fs_x/string-table-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs_x/libsvn_fs_x-1.la subversion/libsvn_subr/libsvn_subr-1.la
string_table_test_OBJECTS = string-table-test.lo
subversion/tests/libsvn_fs_x/string-table-test$(EXEEXT): $(string_table_test_DEPS)
cd subversion/tests/libsvn_fs_x && $(LINK) $(string_table_test_LDFLAGS) -o string-table-test$(EXEEXT) $(string_table_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs_x/libsvn_fs_x-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
string_test_PATH = subversion/tests/libsvn_subr
string_test_DEPS = subversion/tests/libsvn_subr/string-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
string_test_OBJECTS = string-test.lo
subversion/tests/libsvn_subr/string-test$(EXEEXT): $(string_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(string_test_LDFLAGS) -o string-test$(EXEEXT) $(string_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
strings_reps_test_PATH = subversion/tests/libsvn_fs_base
strings_reps_test_DEPS = subversion/tests/libsvn_fs_base/strings-reps-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_base/libsvn_fs_base-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
strings_reps_test_OBJECTS = strings-reps-test.lo
subversion/tests/libsvn_fs_base/strings-reps-test$(EXEEXT): $(strings_reps_test_DEPS)
cd subversion/tests/libsvn_fs_base && $(LINK) $(strings_reps_test_LDFLAGS) -o strings-reps-test$(EXEEXT) $(strings_reps_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la ../../../subversion/libsvn_fs_base/libsvn_fs_base-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
subst_translate_test_PATH = subversion/tests/libsvn_subr
subst_translate_test_DEPS = subversion/tests/libsvn_subr/subst_translate-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
subst_translate_test_OBJECTS = subst_translate-test.lo
subversion/tests/libsvn_subr/subst_translate-test$(EXEEXT): $(subst_translate_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(subst_translate_test_LDFLAGS) -o subst_translate-test$(EXEEXT) $(subst_translate_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svn_PATH = subversion/svn
svn_DEPS = subversion/svn/add-cmd.lo subversion/svn/auth-cmd.lo subversion/svn/blame-cmd.lo subversion/svn/cat-cmd.lo subversion/svn/changelist-cmd.lo subversion/svn/checkout-cmd.lo subversion/svn/cl-conflicts.lo subversion/svn/cleanup-cmd.lo subversion/svn/commit-cmd.lo subversion/svn/conflict-callbacks.lo subversion/svn/copy-cmd.lo subversion/svn/delete-cmd.lo subversion/svn/deprecated.lo subversion/svn/diff-cmd.lo subversion/svn/export-cmd.lo subversion/svn/file-merge.lo subversion/svn/help-cmd.lo subversion/svn/import-cmd.lo subversion/svn/info-cmd.lo subversion/svn/list-cmd.lo subversion/svn/lock-cmd.lo subversion/svn/log-cmd.lo subversion/svn/merge-cmd.lo subversion/svn/mergeinfo-cmd.lo subversion/svn/mkdir-cmd.lo subversion/svn/move-cmd.lo subversion/svn/notify.lo subversion/svn/patch-cmd.lo subversion/svn/propdel-cmd.lo subversion/svn/propedit-cmd.lo subversion/svn/propget-cmd.lo subversion/svn/proplist-cmd.lo subversion/svn/props.lo subversion/svn/propset-cmd.lo subversion/svn/relocate-cmd.lo subversion/svn/resolve-cmd.lo subversion/svn/resolved-cmd.lo subversion/svn/revert-cmd.lo subversion/svn/similarity.lo subversion/svn/status-cmd.lo subversion/svn/status.lo subversion/svn/svn.lo subversion/svn/switch-cmd.lo subversion/svn/unlock-cmd.lo subversion/svn/update-cmd.lo subversion/svn/upgrade-cmd.lo subversion/svn/util.lo subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
svn_OBJECTS = add-cmd.lo auth-cmd.lo blame-cmd.lo cat-cmd.lo changelist-cmd.lo checkout-cmd.lo cl-conflicts.lo cleanup-cmd.lo commit-cmd.lo conflict-callbacks.lo copy-cmd.lo delete-cmd.lo deprecated.lo diff-cmd.lo export-cmd.lo file-merge.lo help-cmd.lo import-cmd.lo info-cmd.lo list-cmd.lo lock-cmd.lo log-cmd.lo merge-cmd.lo mergeinfo-cmd.lo mkdir-cmd.lo move-cmd.lo notify.lo patch-cmd.lo propdel-cmd.lo propedit-cmd.lo propget-cmd.lo proplist-cmd.lo props.lo propset-cmd.lo relocate-cmd.lo resolve-cmd.lo resolved-cmd.lo revert-cmd.lo similarity.lo status-cmd.lo status.lo svn.lo switch-cmd.lo unlock-cmd.lo update-cmd.lo upgrade-cmd.lo util.lo
subversion/svn/svn$(EXEEXT): $(svn_DEPS)
cd subversion/svn && $(LINK) $(svn_LDFLAGS) -o svn$(EXEEXT) $(svn_OBJECTS) ../../subversion/libsvn_client/libsvn_client-1.la ../../subversion/libsvn_wc/libsvn_wc-1.la ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svn_populate_node_origins_index_PATH = tools/server-side
svn_populate_node_origins_index_DEPS = tools/server-side/svn-populate-node-origins-index.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la
svn_populate_node_origins_index_OBJECTS = svn-populate-node-origins-index.lo
tools/server-side/svn-populate-node-origins-index$(EXEEXT): $(svn_populate_node_origins_index_DEPS)
cd tools/server-side && $(LINK) $(svn_populate_node_origins_index_LDFLAGS) -o svn-populate-node-origins-index$(EXEEXT) $(svn_populate_node_origins_index_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
svn_wc_db_tester_PATH = tools/dev/wc-ng
svn_wc_db_tester_DEPS = tools/dev/wc-ng/svn-wc-db-tester.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
svn_wc_db_tester_OBJECTS = svn-wc-db-tester.lo
tools/dev/wc-ng/svn-wc-db-tester$(EXEEXT): $(svn_wc_db_tester_DEPS)
cd tools/dev/wc-ng && $(LINK) $(svn_wc_db_tester_LDFLAGS) -o svn-wc-db-tester$(EXEEXT) $(svn_wc_db_tester_OBJECTS) ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
svnadmin_PATH = subversion/svnadmin
svnadmin_DEPS = subversion/svnadmin/svnadmin.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnadmin_OBJECTS = svnadmin.lo
subversion/svnadmin/svnadmin$(EXEEXT): $(svnadmin_DEPS)
cd subversion/svnadmin && $(LINK) $(svnadmin_LDFLAGS) -o svnadmin$(EXEEXT) $(svnadmin_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnauthz_PATH = tools/server-side
svnauthz_DEPS = tools/server-side/svnauthz.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnauthz_OBJECTS = svnauthz.lo
tools/server-side/svnauthz$(EXEEXT): $(svnauthz_DEPS)
cd tools/server-side && $(LINK) $(svnauthz_LDFLAGS) -o svnauthz$(EXEEXT) $(svnauthz_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
svnauthz_validate_PATH = tools/server-side
svnauthz_validate_DEPS = tools/server-side/svnauthz.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnauthz_validate_OBJECTS = svnauthz.lo
tools/server-side/svnauthz-validate$(EXEEXT): $(svnauthz_validate_DEPS)
cd tools/server-side && $(LINK) $(svnauthz_validate_LDFLAGS) -o svnauthz-validate$(EXEEXT) $(svnauthz_validate_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
svnbench_PATH = subversion/svnbench
svnbench_DEPS = subversion/svnbench/help-cmd.lo subversion/svnbench/notify.lo subversion/svnbench/null-blame-cmd.lo subversion/svnbench/null-export-cmd.lo subversion/svnbench/null-info-cmd.lo subversion/svnbench/null-list-cmd.lo subversion/svnbench/null-log-cmd.lo subversion/svnbench/svnbench.lo subversion/svnbench/util.lo subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_delta/libsvn_delta-1.la
svnbench_OBJECTS = help-cmd.lo notify.lo null-blame-cmd.lo null-export-cmd.lo null-info-cmd.lo null-list-cmd.lo null-log-cmd.lo svnbench.lo util.lo
subversion/svnbench/svnbench$(EXEEXT): $(svnbench_DEPS)
cd subversion/svnbench && $(LINK) $(svnbench_LDFLAGS) -o svnbench$(EXEEXT) $(svnbench_OBJECTS) ../../subversion/libsvn_client/libsvn_client-1.la ../../subversion/libsvn_wc/libsvn_wc-1.la ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svndiff_test_PATH = subversion/tests/libsvn_delta
svndiff_test_DEPS = subversion/tests/libsvn_delta/svndiff-test.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
svndiff_test_OBJECTS = svndiff-test.lo
subversion/tests/libsvn_delta/svndiff-test$(EXEEXT): $(svndiff_test_DEPS)
cd subversion/tests/libsvn_delta && $(LINK) $(svndiff_test_LDFLAGS) -o svndiff-test$(EXEEXT) $(svndiff_test_OBJECTS) ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svndumpfilter_PATH = subversion/svndumpfilter
svndumpfilter_DEPS = subversion/svndumpfilter/svndumpfilter.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
svndumpfilter_OBJECTS = svndumpfilter.lo
subversion/svndumpfilter/svndumpfilter$(EXEEXT): $(svndumpfilter_DEPS)
cd subversion/svndumpfilter && $(LINK) $(svndumpfilter_LDFLAGS) -o svndumpfilter$(EXEEXT) $(svndumpfilter_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnfsfs_PATH = subversion/svnfsfs
svnfsfs_DEPS = subversion/svnfsfs/dump-index-cmd.lo subversion/svnfsfs/load-index-cmd.lo subversion/svnfsfs/stats-cmd.lo subversion/svnfsfs/svnfsfs.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnfsfs_OBJECTS = dump-index-cmd.lo load-index-cmd.lo stats-cmd.lo svnfsfs.lo
subversion/svnfsfs/svnfsfs$(EXEEXT): $(svnfsfs_DEPS)
cd subversion/svnfsfs && $(LINK) $(svnfsfs_LDFLAGS) -o svnfsfs$(EXEEXT) $(svnfsfs_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_fs_fs/libsvn_fs_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnlook_PATH = subversion/svnlook
svnlook_DEPS = subversion/svnlook/svnlook.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnlook_OBJECTS = svnlook.lo
subversion/svnlook/svnlook$(EXEEXT): $(svnlook_DEPS)
cd subversion/svnlook && $(LINK) $(svnlook_LDFLAGS) -o svnlook$(EXEEXT) $(svnlook_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnmucc_PATH = subversion/svnmucc
svnmucc_DEPS = subversion/svnmucc/svnmucc.lo subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_delta/libsvn_delta-1.la
svnmucc_OBJECTS = svnmucc.lo
subversion/svnmucc/svnmucc$(EXEEXT): $(svnmucc_DEPS)
cd subversion/svnmucc && $(LINK) $(svnmucc_LDFLAGS) -o svnmucc$(EXEEXT) $(svnmucc_OBJECTS) ../../subversion/libsvn_client/libsvn_client-1.la ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnraisetreeconflict_PATH = tools/dev/svnraisetreeconflict
svnraisetreeconflict_DEPS = tools/dev/svnraisetreeconflict/svnraisetreeconflict.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnraisetreeconflict_OBJECTS = svnraisetreeconflict.lo
tools/dev/svnraisetreeconflict/svnraisetreeconflict$(EXEEXT): $(svnraisetreeconflict_DEPS)
cd tools/dev/svnraisetreeconflict && $(LINK) $(svnraisetreeconflict_LDFLAGS) -o svnraisetreeconflict$(EXEEXT) $(svnraisetreeconflict_OBJECTS) ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnrdump_PATH = subversion/svnrdump
svnrdump_DEPS = subversion/svnrdump/dump_editor.lo subversion/svnrdump/load_editor.lo subversion/svnrdump/svnrdump.lo subversion/svnrdump/util.lo subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnrdump_OBJECTS = dump_editor.lo load_editor.lo svnrdump.lo util.lo
subversion/svnrdump/svnrdump$(EXEEXT): $(svnrdump_DEPS)
cd subversion/svnrdump && $(LINK) $(svnrdump_LDFLAGS) -o svnrdump$(EXEEXT) $(svnrdump_OBJECTS) ../../subversion/libsvn_client/libsvn_client-1.la ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
svnserve_PATH = subversion/svnserve
svnserve_DEPS = subversion/svnserve/cyrus_auth.lo subversion/svnserve/log-escape.lo subversion/svnserve/logger.lo subversion/svnserve/serve.lo subversion/svnserve/svnserve.lo subversion/svnserve/winservice.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_ra_svn/libsvn_ra_svn-1.la
svnserve_OBJECTS = cyrus_auth.lo log-escape.lo logger.lo serve.lo svnserve.lo winservice.lo
subversion/svnserve/svnserve$(EXEEXT): $(svnserve_DEPS)
cd subversion/svnserve && $(LINK) $(svnserve_LDFLAGS) -o svnserve$(EXEEXT) $(svnserve_OBJECTS) ../../subversion/libsvn_repos/libsvn_repos-1.la ../../subversion/libsvn_fs/libsvn_fs-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la ../../subversion/libsvn_ra_svn/libsvn_ra_svn-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_SASL_LIBS) $(LIBS)
svnsync_PATH = subversion/svnsync
svnsync_DEPS = subversion/svnsync/svnsync.lo subversion/svnsync/sync.lo subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnsync_OBJECTS = svnsync.lo sync.lo
subversion/svnsync/svnsync$(EXEEXT): $(svnsync_DEPS)
cd subversion/svnsync && $(LINK) $(svnsync_LDFLAGS) -o svnsync$(EXEEXT) $(svnsync_OBJECTS) ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
svnversion_PATH = subversion/svnversion
svnversion_DEPS = subversion/svnversion/svnversion.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
svnversion_OBJECTS = svnversion.lo
subversion/svnversion/svnversion$(EXEEXT): $(svnversion_DEPS)
cd subversion/svnversion && $(LINK) $(svnversion_LDFLAGS) -o svnversion$(EXEEXT) $(svnversion_OBJECTS) ../../subversion/libsvn_wc/libsvn_wc-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
time_test_PATH = subversion/tests/libsvn_subr
time_test_DEPS = subversion/tests/libsvn_subr/time-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
time_test_OBJECTS = time-test.lo
subversion/tests/libsvn_subr/time-test$(EXEEXT): $(time_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(time_test_LDFLAGS) -o time-test$(EXEEXT) $(time_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
translate_test_PATH = subversion/tests/libsvn_subr
translate_test_DEPS = subversion/tests/libsvn_subr/translate-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
translate_test_OBJECTS = translate-test.lo
subversion/tests/libsvn_subr/translate-test$(EXEEXT): $(translate_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(translate_test_LDFLAGS) -o translate-test$(EXEEXT) $(translate_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
utf_test_PATH = subversion/tests/libsvn_subr
utf_test_DEPS = subversion/tests/libsvn_subr/utf-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
utf_test_OBJECTS = utf-test.lo
subversion/tests/libsvn_subr/utf-test$(EXEEXT): $(utf_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(utf_test_LDFLAGS) -o utf-test$(EXEEXT) $(utf_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
vdelta_test_PATH = subversion/tests/libsvn_delta
vdelta_test_DEPS = subversion/tests/libsvn_delta/vdelta-test.lo subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
vdelta_test_OBJECTS = vdelta-test.lo
subversion/tests/libsvn_delta/vdelta-test$(EXEEXT): $(vdelta_test_DEPS)
cd subversion/tests/libsvn_delta && $(LINK) $(vdelta_test_LDFLAGS) -o vdelta-test$(EXEEXT) $(vdelta_test_OBJECTS) ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
wc_incomplete_tester_PATH = subversion/tests/libsvn_wc
wc_incomplete_tester_DEPS = subversion/tests/libsvn_wc/wc-incomplete-tester.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
wc_incomplete_tester_OBJECTS = wc-incomplete-tester.lo
subversion/tests/libsvn_wc/wc-incomplete-tester$(EXEEXT): $(wc_incomplete_tester_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(wc_incomplete_tester_LDFLAGS) -o wc-incomplete-tester$(EXEEXT) $(wc_incomplete_tester_OBJECTS) ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
wc_lock_tester_PATH = subversion/tests/libsvn_wc
wc_lock_tester_DEPS = subversion/tests/libsvn_wc/wc-lock-tester.lo subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
wc_lock_tester_OBJECTS = wc-lock-tester.lo
subversion/tests/libsvn_wc/wc-lock-tester$(EXEEXT): $(wc_lock_tester_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(wc_lock_tester_LDFLAGS) -o wc-lock-tester$(EXEEXT) $(wc_lock_tester_OBJECTS) ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
wc_queries_test_PATH = subversion/tests/libsvn_wc
wc_queries_test_DEPS = subversion/libsvn_subr/sqlite3wrapper.lo subversion/tests/libsvn_wc/wc-queries-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
wc_queries_test_OBJECTS = ../../libsvn_subr/sqlite3wrapper.lo wc-queries-test.lo
subversion/tests/libsvn_wc/wc-queries-test$(EXEEXT): $(wc_queries_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(wc_queries_test_LDFLAGS) -o wc-queries-test$(EXEEXT) $(wc_queries_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_SQLITE_LIBS) $(LIBS)
wc_test_PATH = subversion/tests/libsvn_wc
wc_test_DEPS = subversion/tests/libsvn_wc/utils.lo subversion/tests/libsvn_wc/wc-test.lo subversion/libsvn_client/libsvn_client-1.la subversion/tests/libsvn_test-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_subr/libsvn_subr-1.la
wc_test_OBJECTS = utils.lo wc-test.lo
subversion/tests/libsvn_wc/wc-test$(EXEEXT): $(wc_test_DEPS)
cd subversion/tests/libsvn_wc && $(LINK) $(wc_test_LDFLAGS) -o wc-test$(EXEEXT) $(wc_test_OBJECTS) ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
window_test_PATH = subversion/tests/libsvn_delta
window_test_DEPS = subversion/tests/libsvn_delta/window-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_subr/libsvn_subr-1.la
window_test_OBJECTS = window-test.lo
subversion/tests/libsvn_delta/window-test$(EXEEXT): $(window_test_DEPS)
cd subversion/tests/libsvn_delta && $(LINK) $(window_test_LDFLAGS) -o window-test$(EXEEXT) $(window_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
x509_parser_PATH = tools/dev
x509_parser_DEPS = tools/dev/x509-parser.lo subversion/libsvn_subr/libsvn_subr-1.la
x509_parser_OBJECTS = x509-parser.lo
tools/dev/x509-parser$(EXEEXT): $(x509_parser_DEPS)
cd tools/dev && $(LINK) $(x509_parser_LDFLAGS) -o x509-parser$(EXEEXT) $(x509_parser_OBJECTS) ../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APR_LIBS) $(LIBS)
x509_test_PATH = subversion/tests/libsvn_subr
x509_test_DEPS = subversion/tests/libsvn_subr/x509-test.lo subversion/tests/libsvn_test-1.la subversion/libsvn_subr/libsvn_subr-1.la
x509_test_OBJECTS = x509-test.lo
subversion/tests/libsvn_subr/x509-test$(EXEEXT): $(x509_test_DEPS)
cd subversion/tests/libsvn_subr && $(LINK) $(x509_test_LDFLAGS) -o x509-test$(EXEEXT) $(x509_test_OBJECTS) ../../../subversion/tests/libsvn_test-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS)
########################################
# Section 6: Install-Group build targets
########################################
apache-mod: subversion/mod_authz_svn/mod_authz_svn.la subversion/mod_dav_svn/mod_dav_svn.la
bdb-lib: subversion/libsvn_fs_base/libsvn_fs_base-1.la
bdb-test: subversion/tests/libsvn_fs_base/changes-test$(EXEEXT) subversion/tests/libsvn_fs_base/fs-base-test$(EXEEXT) subversion/tests/libsvn_fs_base/strings-reps-test$(EXEEXT)
bin: subversion/svn/svn$(EXEEXT) subversion/svnadmin/svnadmin$(EXEEXT) subversion/svnbench/svnbench$(EXEEXT) subversion/svndumpfilter/svndumpfilter$(EXEEXT) subversion/svnfsfs/svnfsfs$(EXEEXT) subversion/svnlook/svnlook$(EXEEXT) subversion/svnmucc/svnmucc$(EXEEXT) subversion/svnrdump/svnrdump$(EXEEXT) subversion/svnserve/svnserve$(EXEEXT) subversion/svnsync/svnsync$(EXEEXT) subversion/svnversion/svnversion$(EXEEXT)
cxxhl-lib: subversion/bindings/cxxhl/libsvncxxhl-1.la
fsmod-lib: subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la subversion/libsvn_fs_x/libsvn_fs_x-1.la subversion/libsvn_subr/libsvn_subr-1.la
gnome-keyring-lib: subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring-1.la
javahl-callback-javah:
javahl-compat-java:
javahl-compat-tests:
javahl-java:
javahl-javah:
javahl-lib: subversion/bindings/javahl/native/libsvnjavahl-1.la
javahl-remote-javah:
javahl-tests:
javahl-types-javah:
javahl-util-javah:
kwallet-lib: subversion/libsvn_auth_kwallet/libsvn_auth_kwallet-1.la
lib: subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_wc/libsvn_wc-1.la
locale:
ramod-lib: subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_ra_local/libsvn_ra_local-1.la subversion/libsvn_ra_svn/libsvn_ra_svn-1.la subversion/libsvn_repos/libsvn_repos-1.la
serf-lib: subversion/libsvn_ra_serf/libsvn_ra_serf-1.la
sub-test: subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test$(EXEEXT)
swig-pl-lib: subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la
swig-py: subversion/bindings/swig/python/_client.la subversion/bindings/swig/python/_core.la subversion/bindings/swig/python/_delta.la subversion/bindings/swig/python/_diff.la subversion/bindings/swig/python/_fs.la subversion/bindings/swig/python/_ra.la subversion/bindings/swig/python/_repos.la subversion/bindings/swig/python/_wc.la
swig-py-lib: subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la
swig-rb: subversion/bindings/swig/ruby/client.la subversion/bindings/swig/ruby/core.la subversion/bindings/swig/ruby/delta.la subversion/bindings/swig/ruby/diff.la subversion/bindings/swig/ruby/fs.la subversion/bindings/swig/ruby/ra.la subversion/bindings/swig/ruby/repos.la subversion/bindings/swig/ruby/wc.la
swig-rb-lib: subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la
test: subversion/tests/cmdline/atomic-ra-revprop-change$(EXEEXT) subversion/tests/libsvn_subr/auth-test$(EXEEXT) subversion/tests/libsvn_subr/bit-array-test$(EXEEXT) subversion/tests/libsvn_subr/cache-test$(EXEEXT) subversion/tests/libsvn_subr/checksum-test$(EXEEXT) subversion/tests/libsvn_client/client-test$(EXEEXT) subversion/tests/libsvn_subr/compat-test$(EXEEXT) subversion/tests/libsvn_subr/config-test$(EXEEXT) subversion/tests/libsvn_wc/conflict-data-test$(EXEEXT) subversion/tests/libsvn_subr/crypto-test$(EXEEXT) subversion/tests/libsvn_wc/db-test$(EXEEXT) subversion/tests/libsvn_diff/diff-diff3-test$(EXEEXT) subversion/tests/libsvn_subr/dirent_uri-test$(EXEEXT) subversion/tests/libsvn_repos/dump-load-test$(EXEEXT) subversion/tests/libsvn_wc/entries-compat-test$(EXEEXT) subversion/tests/cmdline/entries-dump$(EXEEXT) subversion/tests/libsvn_subr/error-code-test$(EXEEXT) subversion/tests/libsvn_subr/error-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-pack-test$(EXEEXT) subversion/tests/libsvn_fs_fs/fs-fs-private-test$(EXEEXT) subversion/tests/libsvn_fs/fs-test$(EXEEXT) subversion/tests/libsvn_fs_x/fs-x-pack-test$(EXEEXT) subversion/tests/libsvn_subr/hashdump-test$(EXEEXT) subversion/tests/libsvn_subr/io-test$(EXEEXT) subversion/tests/libsvn_test-1.la subversion/tests/cmdline/lock-helper$(EXEEXT) subversion/tests/libsvn_fs/locks-test$(EXEEXT) subversion/tests/libsvn_subr/mergeinfo-test$(EXEEXT) subversion/tests/libsvn_client/mtcc-test$(EXEEXT) subversion/tests/libsvn_wc/op-depth-test$(EXEEXT) subversion/tests/libsvn_subr/opt-test$(EXEEXT) subversion/tests/libsvn_subr/packed-data-test$(EXEEXT) subversion/tests/libsvn_diff/parse-diff-test$(EXEEXT) subversion/tests/libsvn_subr/path-test$(EXEEXT) subversion/tests/libsvn_subr/prefix-string-test$(EXEEXT) subversion/tests/libsvn_subr/priority-queue-test$(EXEEXT) subversion/tests/libsvn_wc/pristine-store-test$(EXEEXT) subversion/tests/libsvn_ra_local/ra-local-test$(EXEEXT) subversion/tests/libsvn_ra/ra-test$(EXEEXT) subversion/tests/libsvn_delta/random-test$(EXEEXT) subversion/tests/libsvn_repos/repos-test$(EXEEXT) subversion/tests/libsvn_subr/revision-test$(EXEEXT) subversion/tests/libsvn_subr/root-pools-test$(EXEEXT) subversion/tests/libsvn_subr/skel-test$(EXEEXT) subversion/tests/libsvn_subr/spillbuf-test$(EXEEXT) subversion/tests/libsvn_subr/sqlite-test$(EXEEXT) subversion/tests/libsvn_subr/stream-test$(EXEEXT) subversion/tests/libsvn_fs_x/string-table-test$(EXEEXT) subversion/tests/libsvn_subr/string-test$(EXEEXT) subversion/tests/libsvn_subr/subst_translate-test$(EXEEXT) tools/dev/wc-ng/svn-wc-db-tester$(EXEEXT) subversion/tests/libsvn_delta/svndiff-test$(EXEEXT) subversion/tests/libsvn_subr/time-test$(EXEEXT) subversion/tests/libsvn_subr/translate-test$(EXEEXT) subversion/tests/libsvn_subr/utf-test$(EXEEXT) subversion/tests/libsvn_delta/vdelta-test$(EXEEXT) subversion/tests/libsvn_wc/wc-incomplete-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-lock-tester$(EXEEXT) subversion/tests/libsvn_wc/wc-queries-test$(EXEEXT) subversion/tests/libsvn_wc/wc-test$(EXEEXT) subversion/tests/libsvn_delta/window-test$(EXEEXT) subversion/tests/libsvn_subr/x509-test$(EXEEXT)
tests: subversion/bindings/cxxhl/cxxhl-tests$(EXEEXT) gmock-fused/libgmock-1.la
tools: tools/diff/diff$(EXEEXT) tools/diff/diff3$(EXEEXT) tools/diff/diff4$(EXEEXT) tools/dev/fsfs-access-map$(EXEEXT) tools/server-side/mod_dontdothat/mod_dontdothat.la tools/server-side/svn-populate-node-origins-index$(EXEEXT) tools/server-side/svnauthz$(EXEEXT) tools/server-side/svnauthz-validate$(EXEEXT) tools/dev/svnraisetreeconflict/svnraisetreeconflict$(EXEEXT) tools/dev/x509-parser$(EXEEXT)
########################################
# Section 7: Install-Group install targets
########################################
install-mods-shared: subversion/mod_dav_svn/mod_dav_svn.la subversion/mod_authz_svn/mod_authz_svn.la
if $(INSTALL_APACHE_MODS) ; then cd subversion/mod_dav_svn ; $(MKDIR) "$(APACHE_LIBEXECDIR)" ; $(INSTALL_MOD_SHARED) -n dav_svn mod_dav_svn.la ; fi
if $(INSTALL_APACHE_MODS) ; then cd subversion/mod_authz_svn ; $(MKDIR) "$(APACHE_LIBEXECDIR)" ; $(INSTALL_MOD_SHARED) -n authz_svn mod_authz_svn.la ; fi
install-bdb-lib: subversion/libsvn_fs_base/libsvn_fs_base-1.la
$(MKDIR) $(DESTDIR)$(bdb_libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_fs_base ; $(INSTALL_BDB_LIB) libsvn_fs_base-1.la $(DESTDIR)$(bdb_libdir)/libsvn_fs_base-1.la
$(INSTALL_DATA) subversion/libsvn_fs_base/libsvn_fs_base.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_fs_base.pc
install-bin: subversion/svn/svn$(EXEEXT) subversion/svnadmin/svnadmin$(EXEEXT) subversion/svnbench/svnbench$(EXEEXT) subversion/svndumpfilter/svndumpfilter$(EXEEXT) subversion/svnfsfs/svnfsfs$(EXEEXT) subversion/svnlook/svnlook$(EXEEXT) subversion/svnmucc/svnmucc$(EXEEXT) subversion/svnrdump/svnrdump$(EXEEXT) subversion/svnserve/svnserve$(EXEEXT) subversion/svnsync/svnsync$(EXEEXT) subversion/svnversion/svnversion$(EXEEXT)
$(MKDIR) $(DESTDIR)$(bindir)
cd subversion/svn ; $(INSTALL_BIN) svn$(EXEEXT) $(DESTDIR)$(bindir)/svn$(EXEEXT)
cd subversion/svnadmin ; $(INSTALL_BIN) svnadmin$(EXEEXT) $(DESTDIR)$(bindir)/svnadmin$(EXEEXT)
cd subversion/svnbench ; $(INSTALL_BIN) svnbench$(EXEEXT) $(DESTDIR)$(bindir)/svnbench$(EXEEXT)
cd subversion/svndumpfilter ; $(INSTALL_BIN) svndumpfilter$(EXEEXT) $(DESTDIR)$(bindir)/svndumpfilter$(EXEEXT)
cd subversion/svnfsfs ; $(INSTALL_BIN) svnfsfs$(EXEEXT) $(DESTDIR)$(bindir)/svnfsfs$(EXEEXT)
cd subversion/svnlook ; $(INSTALL_BIN) svnlook$(EXEEXT) $(DESTDIR)$(bindir)/svnlook$(EXEEXT)
cd subversion/svnmucc ; $(INSTALL_BIN) svnmucc$(EXEEXT) $(DESTDIR)$(bindir)/svnmucc$(EXEEXT)
cd subversion/svnrdump ; $(INSTALL_BIN) svnrdump$(EXEEXT) $(DESTDIR)$(bindir)/svnrdump$(EXEEXT)
cd subversion/svnserve ; $(INSTALL_BIN) svnserve$(EXEEXT) $(DESTDIR)$(bindir)/svnserve$(EXEEXT)
cd subversion/svnsync ; $(INSTALL_BIN) svnsync$(EXEEXT) $(DESTDIR)$(bindir)/svnsync$(EXEEXT)
cd subversion/svnversion ; $(INSTALL_BIN) svnversion$(EXEEXT) $(DESTDIR)$(bindir)/svnversion$(EXEEXT)
install-cxxhl-lib: subversion/bindings/cxxhl/libsvncxxhl-1.la
$(MKDIR) $(DESTDIR)$(cxxhl_libdir)
cd subversion/bindings/cxxhl ; $(INSTALL_CXXHL_LIB) libsvncxxhl-1.la $(DESTDIR)$(cxxhl_libdir)/libsvncxxhl-1.la
$(INSTALL_EXTRA_CXXHL_LIB)
install-fsmod-lib: subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_fs_util/libsvn_fs_util-1.la subversion/libsvn_fs_fs/libsvn_fs_fs-1.la subversion/libsvn_fs_x/libsvn_fs_x-1.la
$(MKDIR) $(DESTDIR)$(fsmod_libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_subr ; $(INSTALL_FSMOD_LIB) libsvn_subr-1.la $(DESTDIR)$(fsmod_libdir)/libsvn_subr-1.la
$(INSTALL_DATA) subversion/libsvn_subr/libsvn_subr.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_subr.pc
cd subversion/libsvn_delta ; $(INSTALL_FSMOD_LIB) libsvn_delta-1.la $(DESTDIR)$(fsmod_libdir)/libsvn_delta-1.la
$(INSTALL_DATA) subversion/libsvn_delta/libsvn_delta.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_delta.pc
cd subversion/libsvn_fs_util ; $(INSTALL_FSMOD_LIB) libsvn_fs_util-1.la $(DESTDIR)$(fsmod_libdir)/libsvn_fs_util-1.la
$(INSTALL_DATA) subversion/libsvn_fs_util/libsvn_fs_util.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_fs_util.pc
cd subversion/libsvn_fs_fs ; $(INSTALL_FSMOD_LIB) libsvn_fs_fs-1.la $(DESTDIR)$(fsmod_libdir)/libsvn_fs_fs-1.la
$(INSTALL_DATA) subversion/libsvn_fs_fs/libsvn_fs_fs.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_fs_fs.pc
cd subversion/libsvn_fs_x ; $(INSTALL_FSMOD_LIB) libsvn_fs_x-1.la $(DESTDIR)$(fsmod_libdir)/libsvn_fs_x-1.la
$(INSTALL_DATA) subversion/libsvn_fs_x/libsvn_fs_x.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_fs_x.pc
install-gnome-keyring-lib: subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring-1.la
$(MKDIR) $(DESTDIR)$(gnome_keyring_libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_auth_gnome_keyring ; $(INSTALL_GNOME_KEYRING_LIB) libsvn_auth_gnome_keyring-1.la $(DESTDIR)$(gnome_keyring_libdir)/libsvn_auth_gnome_keyring-1.la
$(INSTALL_DATA) subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_auth_gnome_keyring.pc
install-javahl-callback-javah:
$(MKDIR) $(DESTDIR)$(javahl_callback_javahdir)
$(INSTALL_EXTRA_JAVAHL_CALLBACK_JAVAH)
install-javahl-compat-java:
$(MKDIR) $(DESTDIR)$(javahl_compat_javadir)
$(INSTALL_EXTRA_JAVAHL_COMPAT_JAVA)
install-javahl-compat-tests:
$(MKDIR) $(DESTDIR)$(javahl_compat_testsdir)
$(INSTALL_EXTRA_JAVAHL_COMPAT_TESTS)
install-javahl-java:
$(MKDIR) $(DESTDIR)$(javahl_javadir)
$(INSTALL_EXTRA_JAVAHL_JAVA)
install-javahl-javah:
$(MKDIR) $(DESTDIR)$(javahl_javahdir)
$(INSTALL_EXTRA_JAVAHL_JAVAH)
install-javahl-lib: subversion/bindings/javahl/native/libsvnjavahl-1.la
$(MKDIR) $(DESTDIR)$(javahl_libdir)
cd subversion/bindings/javahl/native ; $(INSTALL_JAVAHL_LIB) libsvnjavahl-1.la $(DESTDIR)$(javahl_libdir)/libsvnjavahl-1.la
$(INSTALL_EXTRA_JAVAHL_LIB)
install-javahl-remote-javah:
$(MKDIR) $(DESTDIR)$(javahl_remote_javahdir)
$(INSTALL_EXTRA_JAVAHL_REMOTE_JAVAH)
install-javahl-tests:
$(MKDIR) $(DESTDIR)$(javahl_testsdir)
$(INSTALL_EXTRA_JAVAHL_TESTS)
install-javahl-types-javah:
$(MKDIR) $(DESTDIR)$(javahl_types_javahdir)
$(INSTALL_EXTRA_JAVAHL_TYPES_JAVAH)
install-javahl-util-javah:
$(MKDIR) $(DESTDIR)$(javahl_util_javahdir)
$(INSTALL_EXTRA_JAVAHL_UTIL_JAVAH)
install-kwallet-lib: subversion/libsvn_auth_kwallet/libsvn_auth_kwallet-1.la
$(MKDIR) $(DESTDIR)$(kwallet_libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_auth_kwallet ; $(INSTALL_KWALLET_LIB) libsvn_auth_kwallet-1.la $(DESTDIR)$(kwallet_libdir)/libsvn_auth_kwallet-1.la
$(INSTALL_DATA) subversion/libsvn_auth_kwallet/libsvn_auth_kwallet.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_auth_kwallet.pc
install-lib: subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_client/libsvn_client-1.la
$(MKDIR) $(DESTDIR)$(libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_diff ; $(INSTALL_LIB) libsvn_diff-1.la $(DESTDIR)$(libdir)/libsvn_diff-1.la
$(INSTALL_DATA) subversion/libsvn_diff/libsvn_diff.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_diff.pc
cd subversion/libsvn_ra ; $(INSTALL_LIB) libsvn_ra-1.la $(DESTDIR)$(libdir)/libsvn_ra-1.la
$(INSTALL_DATA) subversion/libsvn_ra/libsvn_ra.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_ra.pc
cd subversion/libsvn_wc ; $(INSTALL_LIB) libsvn_wc-1.la $(DESTDIR)$(libdir)/libsvn_wc-1.la
$(INSTALL_DATA) subversion/libsvn_wc/libsvn_wc.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_wc.pc
cd subversion/libsvn_client ; $(INSTALL_LIB) libsvn_client-1.la $(DESTDIR)$(libdir)/libsvn_client-1.la
$(INSTALL_DATA) subversion/libsvn_client/libsvn_client.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_client.pc
install-locale: subversion/po/de.mo subversion/po/es.mo subversion/po/fr.mo subversion/po/it.mo subversion/po/ja.mo subversion/po/ko.mo subversion/po/nb.mo subversion/po/pl.mo subversion/po/pt_BR.mo subversion/po/sv.mo subversion/po/zh_CN.mo subversion/po/zh_TW.mo
$(MKDIR) $(DESTDIR)$(localedir)
$(MKDIR) $(DESTDIR)$(localedir)/de/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) de.mo $(DESTDIR)$(localedir)/de/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/es/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) es.mo $(DESTDIR)$(localedir)/es/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/fr/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) fr.mo $(DESTDIR)$(localedir)/fr/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/it/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) it.mo $(DESTDIR)$(localedir)/it/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/ja/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) ja.mo $(DESTDIR)$(localedir)/ja/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/ko/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) ko.mo $(DESTDIR)$(localedir)/ko/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/nb/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) nb.mo $(DESTDIR)$(localedir)/nb/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/pl/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) pl.mo $(DESTDIR)$(localedir)/pl/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/pt_BR/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) pt_BR.mo $(DESTDIR)$(localedir)/pt_BR/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/sv/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) sv.mo $(DESTDIR)$(localedir)/sv/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/zh_CN/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) zh_CN.mo $(DESTDIR)$(localedir)/zh_CN/LC_MESSAGES/$(PACKAGE_NAME).mo
$(MKDIR) $(DESTDIR)$(localedir)/zh_TW/LC_MESSAGES
cd subversion/po ; $(INSTALL_LOCALE) zh_TW.mo $(DESTDIR)$(localedir)/zh_TW/LC_MESSAGES/$(PACKAGE_NAME).mo
install-ramod-lib: subversion/libsvn_fs/libsvn_fs-1.la subversion/libsvn_ra_svn/libsvn_ra_svn-1.la subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_ra_local/libsvn_ra_local-1.la
$(MKDIR) $(DESTDIR)$(ramod_libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_fs ; $(INSTALL_RAMOD_LIB) libsvn_fs-1.la $(DESTDIR)$(ramod_libdir)/libsvn_fs-1.la
$(INSTALL_DATA) subversion/libsvn_fs/libsvn_fs.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_fs.pc
cd subversion/libsvn_ra_svn ; $(INSTALL_RAMOD_LIB) libsvn_ra_svn-1.la $(DESTDIR)$(ramod_libdir)/libsvn_ra_svn-1.la
$(INSTALL_DATA) subversion/libsvn_ra_svn/libsvn_ra_svn.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_ra_svn.pc
cd subversion/libsvn_repos ; $(INSTALL_RAMOD_LIB) libsvn_repos-1.la $(DESTDIR)$(ramod_libdir)/libsvn_repos-1.la
$(INSTALL_DATA) subversion/libsvn_repos/libsvn_repos.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_repos.pc
cd subversion/libsvn_ra_local ; $(INSTALL_RAMOD_LIB) libsvn_ra_local-1.la $(DESTDIR)$(ramod_libdir)/libsvn_ra_local-1.la
$(INSTALL_DATA) subversion/libsvn_ra_local/libsvn_ra_local.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_ra_local.pc
install-serf-lib: subversion/libsvn_ra_serf/libsvn_ra_serf-1.la
$(MKDIR) $(DESTDIR)$(serf_libdir) $(DESTDIR)$(pkgconfig_dir)
cd subversion/libsvn_ra_serf ; $(INSTALL_SERF_LIB) libsvn_ra_serf-1.la $(DESTDIR)$(serf_libdir)/libsvn_ra_serf-1.la
$(INSTALL_DATA) subversion/libsvn_ra_serf/libsvn_ra_serf.pc $(DESTDIR)$(pkgconfig_dir)/libsvn_ra_serf.pc
install-sub-test: subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test$(EXEEXT)
$(MKDIR) $(DESTDIR)$(sub_testdir)
cd subversion/tests/libsvn_fs_fs ; $(INSTALL_SUB_TEST) fs-fs-fuzzy-test$(EXEEXT) $(DESTDIR)$(sub_testdir)/fs-fs-fuzzy-test$(EXEEXT)
install-swig-pl-lib: subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la
$(MKDIR) $(DESTDIR)$(swig_pl_libdir)
cd subversion/bindings/swig/perl/libsvn_swig_perl ; $(INSTALL_SWIG_PL_LIB) libsvn_swig_perl-1.la $(DESTDIR)$(swig_pl_libdir)/libsvn_swig_perl-1.la
install-swig-py: subversion/bindings/swig/python/_core.la subversion/bindings/swig/python/_client.la subversion/bindings/swig/python/_delta.la subversion/bindings/swig/python/_diff.la subversion/bindings/swig/python/_fs.la subversion/bindings/swig/python/_ra.la subversion/bindings/swig/python/_repos.la subversion/bindings/swig/python/_wc.la
$(MKDIR) $(DESTDIR)$(swig_pydir)
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _core.la $(DESTDIR)$(swig_pydir)/_core.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _client.la $(DESTDIR)$(swig_pydir)/_client.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _delta.la $(DESTDIR)$(swig_pydir)/_delta.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _diff.la $(DESTDIR)$(swig_pydir)/_diff.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _fs.la $(DESTDIR)$(swig_pydir)/_fs.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _ra.la $(DESTDIR)$(swig_pydir)/_ra.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _repos.la $(DESTDIR)$(swig_pydir)/_repos.la
cd subversion/bindings/swig/python ; $(INSTALL_SWIG_PY) _wc.la $(DESTDIR)$(swig_pydir)/_wc.la
$(INSTALL_EXTRA_SWIG_PY)
install-swig-py-lib: subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la
$(MKDIR) $(DESTDIR)$(swig_py_libdir)
cd subversion/bindings/swig/python/libsvn_swig_py ; $(INSTALL_SWIG_PY_LIB) libsvn_swig_py-1.la $(DESTDIR)$(swig_py_libdir)/libsvn_swig_py-1.la
install-swig-rb: subversion/bindings/swig/ruby/core.la subversion/bindings/swig/ruby/client.la subversion/bindings/swig/ruby/delta.la subversion/bindings/swig/ruby/diff.la subversion/bindings/swig/ruby/fs.la subversion/bindings/swig/ruby/ra.la subversion/bindings/swig/ruby/repos.la subversion/bindings/swig/ruby/wc.la
$(MKDIR) $(DESTDIR)$(swig_rbdir)
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) core.la $(DESTDIR)$(swig_rbdir)/core.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) client.la $(DESTDIR)$(swig_rbdir)/client.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) delta.la $(DESTDIR)$(swig_rbdir)/delta.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) diff.la $(DESTDIR)$(swig_rbdir)/diff.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) fs.la $(DESTDIR)$(swig_rbdir)/fs.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) ra.la $(DESTDIR)$(swig_rbdir)/ra.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) repos.la $(DESTDIR)$(swig_rbdir)/repos.la
cd subversion/bindings/swig/ruby ; $(INSTALL_SWIG_RB) wc.la $(DESTDIR)$(swig_rbdir)/wc.la
$(INSTALL_EXTRA_SWIG_RB)
install-swig-rb-lib: subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la
$(MKDIR) $(DESTDIR)$(swig_rb_libdir)
cd subversion/bindings/swig/ruby/libsvn_swig_ruby ; $(INSTALL_SWIG_RB_LIB) libsvn_swig_ruby-1.la $(DESTDIR)$(swig_rb_libdir)/libsvn_swig_ruby-1.la
install-tests: gmock-fused/libgmock-1.la subversion/bindings/cxxhl/cxxhl-tests$(EXEEXT)
$(MKDIR) $(DESTDIR)$(testsdir)
if $(SVN_USE_GMOCK) ; then cd gmock-fused ; $(INSTALL_TESTS) libgmock-1.la $(DESTDIR)$(testsdir)/libgmock-1.la ; fi
if $(SVN_USE_GMOCK) ; then cd subversion/bindings/cxxhl ; $(INSTALL_TESTS) cxxhl-tests$(EXEEXT) $(DESTDIR)$(testsdir)/cxxhl-tests$(EXEEXT) ; fi
install-tools: tools/diff/diff$(EXEEXT) tools/diff/diff3$(EXEEXT) tools/diff/diff4$(EXEEXT) tools/dev/fsfs-access-map$(EXEEXT) tools/server-side/mod_dontdothat/mod_dontdothat.la tools/server-side/svn-populate-node-origins-index$(EXEEXT) tools/server-side/svnauthz$(EXEEXT) tools/server-side/svnauthz-validate$(EXEEXT) tools/dev/svnraisetreeconflict/svnraisetreeconflict$(EXEEXT) tools/dev/x509-parser$(EXEEXT)
$(MKDIR) $(DESTDIR)$(toolsdir)
cd tools/diff ; $(INSTALL_TOOLS) diff$(EXEEXT) $(DESTDIR)$(toolsdir)/diff$(EXEEXT)
cd tools/diff ; $(INSTALL_TOOLS) diff3$(EXEEXT) $(DESTDIR)$(toolsdir)/diff3$(EXEEXT)
cd tools/diff ; $(INSTALL_TOOLS) diff4$(EXEEXT) $(DESTDIR)$(toolsdir)/diff4$(EXEEXT)
cd tools/dev ; $(INSTALL_TOOLS) fsfs-access-map$(EXEEXT) $(DESTDIR)$(toolsdir)/fsfs-access-map$(EXEEXT)
if $(INSTALL_APACHE_MODS) ; then cd tools/server-side/mod_dontdothat ; $(MKDIR) "$(APACHE_LIBEXECDIR)" ; $(INSTALL_MOD_SHARED) -n dontdothat mod_dontdothat.la ; fi
cd tools/server-side ; $(INSTALL_TOOLS) svn-populate-node-origins-index$(EXEEXT) $(DESTDIR)$(toolsdir)/svn-populate-node-origins-index$(EXEEXT)
cd tools/server-side ; $(INSTALL_TOOLS) svnauthz$(EXEEXT) $(DESTDIR)$(toolsdir)/svnauthz$(EXEEXT)
cd tools/server-side ; $(INSTALL_TOOLS) svnauthz-validate$(EXEEXT) $(DESTDIR)$(toolsdir)/svnauthz-validate$(EXEEXT)
cd tools/dev/svnraisetreeconflict ; $(INSTALL_TOOLS) svnraisetreeconflict$(EXEEXT) $(DESTDIR)$(toolsdir)/svnraisetreeconflict$(EXEEXT)
cd tools/dev ; $(INSTALL_TOOLS) x509-parser$(EXEEXT) $(DESTDIR)$(toolsdir)/x509-parser$(EXEEXT)
$(INSTALL_EXTRA_TOOLS)
########################################
# Section 8: The install-include rule
########################################
install-include: subversion/include/mod_authz_svn.h subversion/include/mod_dav_svn.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_md5.h subversion/include/svn_mergeinfo.h subversion/include/svn_nls.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_quoprint.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/include/svn_x509.h subversion/include/svn_xml.h
$(MKDIR) $(DESTDIR)$(includedir)/subversion-1
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/mod_authz_svn.h $(DESTDIR)$(includedir)/subversion-1/mod_authz_svn.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/mod_dav_svn.h $(DESTDIR)$(includedir)/subversion-1/mod_dav_svn.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_auth.h $(DESTDIR)$(includedir)/subversion-1/svn_auth.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_base64.h $(DESTDIR)$(includedir)/subversion-1/svn_base64.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_cache_config.h $(DESTDIR)$(includedir)/subversion-1/svn_cache_config.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_checksum.h $(DESTDIR)$(includedir)/subversion-1/svn_checksum.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_client.h $(DESTDIR)$(includedir)/subversion-1/svn_client.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_cmdline.h $(DESTDIR)$(includedir)/subversion-1/svn_cmdline.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_compat.h $(DESTDIR)$(includedir)/subversion-1/svn_compat.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_config.h $(DESTDIR)$(includedir)/subversion-1/svn_config.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_ctype.h $(DESTDIR)$(includedir)/subversion-1/svn_ctype.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_dav.h $(DESTDIR)$(includedir)/subversion-1/svn_dav.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_delta.h $(DESTDIR)$(includedir)/subversion-1/svn_delta.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_diff.h $(DESTDIR)$(includedir)/subversion-1/svn_diff.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_dirent_uri.h $(DESTDIR)$(includedir)/subversion-1/svn_dirent_uri.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_dso.h $(DESTDIR)$(includedir)/subversion-1/svn_dso.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_error.h $(DESTDIR)$(includedir)/subversion-1/svn_error.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_error_codes.h $(DESTDIR)$(includedir)/subversion-1/svn_error_codes.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_fs.h $(DESTDIR)$(includedir)/subversion-1/svn_fs.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_hash.h $(DESTDIR)$(includedir)/subversion-1/svn_hash.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_io.h $(DESTDIR)$(includedir)/subversion-1/svn_io.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_iter.h $(DESTDIR)$(includedir)/subversion-1/svn_iter.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_md5.h $(DESTDIR)$(includedir)/subversion-1/svn_md5.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_mergeinfo.h $(DESTDIR)$(includedir)/subversion-1/svn_mergeinfo.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_nls.h $(DESTDIR)$(includedir)/subversion-1/svn_nls.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_opt.h $(DESTDIR)$(includedir)/subversion-1/svn_opt.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_path.h $(DESTDIR)$(includedir)/subversion-1/svn_path.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_pools.h $(DESTDIR)$(includedir)/subversion-1/svn_pools.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_props.h $(DESTDIR)$(includedir)/subversion-1/svn_props.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_quoprint.h $(DESTDIR)$(includedir)/subversion-1/svn_quoprint.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_ra.h $(DESTDIR)$(includedir)/subversion-1/svn_ra.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_ra_svn.h $(DESTDIR)$(includedir)/subversion-1/svn_ra_svn.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_repos.h $(DESTDIR)$(includedir)/subversion-1/svn_repos.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_sorts.h $(DESTDIR)$(includedir)/subversion-1/svn_sorts.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_string.h $(DESTDIR)$(includedir)/subversion-1/svn_string.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_subst.h $(DESTDIR)$(includedir)/subversion-1/svn_subst.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_time.h $(DESTDIR)$(includedir)/subversion-1/svn_time.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_types.h $(DESTDIR)$(includedir)/subversion-1/svn_types.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_user.h $(DESTDIR)$(includedir)/subversion-1/svn_user.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_utf.h $(DESTDIR)$(includedir)/subversion-1/svn_utf.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_version.h $(DESTDIR)$(includedir)/subversion-1/svn_version.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_wc.h $(DESTDIR)$(includedir)/subversion-1/svn_wc.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_x509.h $(DESTDIR)$(includedir)/subversion-1/svn_x509.h
$(INSTALL_INCLUDE) $(abs_srcdir)/subversion/include/svn_xml.h $(DESTDIR)$(includedir)/subversion-1/svn_xml.h
########################################
# Section 9: Shortcut targets for manual builds of specific items
########################################
atomic-ra-revprop-change: subversion/tests/cmdline/atomic-ra-revprop-change$(EXEEXT)
auth-test: subversion/tests/libsvn_subr/auth-test$(EXEEXT)
bit-array-test: subversion/tests/libsvn_subr/bit-array-test$(EXEEXT)
cache-test: subversion/tests/libsvn_subr/cache-test$(EXEEXT)
changes-test: subversion/tests/libsvn_fs_base/changes-test$(EXEEXT)
checksum-test: subversion/tests/libsvn_subr/checksum-test$(EXEEXT)
client-test: subversion/tests/libsvn_client/client-test$(EXEEXT)
compat-test: subversion/tests/libsvn_subr/compat-test$(EXEEXT)
config-test: subversion/tests/libsvn_subr/config-test$(EXEEXT)
conflict-data-test: subversion/tests/libsvn_wc/conflict-data-test$(EXEEXT)
crypto-test: subversion/tests/libsvn_subr/crypto-test$(EXEEXT)
cxxhl-tests: subversion/bindings/cxxhl/cxxhl-tests$(EXEEXT)
db-test: subversion/tests/libsvn_wc/db-test$(EXEEXT)
diff: tools/diff/diff$(EXEEXT)
diff-diff3-test: subversion/tests/libsvn_diff/diff-diff3-test$(EXEEXT)
diff3: tools/diff/diff3$(EXEEXT)
diff4: tools/diff/diff4$(EXEEXT)
dirent_uri-test: subversion/tests/libsvn_subr/dirent_uri-test$(EXEEXT)
dump-load-test: subversion/tests/libsvn_repos/dump-load-test$(EXEEXT)
entries-compat-test: subversion/tests/libsvn_wc/entries-compat-test$(EXEEXT)
entries-dump: subversion/tests/cmdline/entries-dump$(EXEEXT)
error-code-test: subversion/tests/libsvn_subr/error-code-test$(EXEEXT)
error-test: subversion/tests/libsvn_subr/error-test$(EXEEXT)
fs-base-test: subversion/tests/libsvn_fs_base/fs-base-test$(EXEEXT)
fs-fs-fuzzy-test: subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test$(EXEEXT)
fs-fs-pack-test: subversion/tests/libsvn_fs_fs/fs-fs-pack-test$(EXEEXT)
fs-fs-private-test: subversion/tests/libsvn_fs_fs/fs-fs-private-test$(EXEEXT)
fs-test: subversion/tests/libsvn_fs/fs-test$(EXEEXT)
fs-x-pack-test: subversion/tests/libsvn_fs_x/fs-x-pack-test$(EXEEXT)
fsfs-access-map: tools/dev/fsfs-access-map$(EXEEXT)
hashdump-test: subversion/tests/libsvn_subr/hashdump-test$(EXEEXT)
io-test: subversion/tests/libsvn_subr/io-test$(EXEEXT)
libgmock: gmock-fused/libgmock-1.la
libsvn_auth_gnome_keyring: subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring-1.la
libsvn_auth_kwallet: subversion/libsvn_auth_kwallet/libsvn_auth_kwallet-1.la
libsvn_client: subversion/libsvn_client/libsvn_client-1.la
libsvn_delta: subversion/libsvn_delta/libsvn_delta-1.la
libsvn_diff: subversion/libsvn_diff/libsvn_diff-1.la
libsvn_fs: subversion/libsvn_fs/libsvn_fs-1.la
libsvn_fs_base: subversion/libsvn_fs_base/libsvn_fs_base-1.la
libsvn_fs_fs: subversion/libsvn_fs_fs/libsvn_fs_fs-1.la
libsvn_fs_util: subversion/libsvn_fs_util/libsvn_fs_util-1.la
libsvn_fs_x: subversion/libsvn_fs_x/libsvn_fs_x-1.la
libsvn_ra: subversion/libsvn_ra/libsvn_ra-1.la
libsvn_ra_local: subversion/libsvn_ra_local/libsvn_ra_local-1.la
libsvn_ra_serf: subversion/libsvn_ra_serf/libsvn_ra_serf-1.la
libsvn_ra_svn: subversion/libsvn_ra_svn/libsvn_ra_svn-1.la
libsvn_repos: subversion/libsvn_repos/libsvn_repos-1.la
libsvn_subr: subversion/libsvn_subr/libsvn_subr-1.la
libsvn_swig_perl: subversion/bindings/swig/perl/libsvn_swig_perl/libsvn_swig_perl-1.la
libsvn_swig_py: subversion/bindings/swig/python/libsvn_swig_py/libsvn_swig_py-1.la
libsvn_swig_ruby: subversion/bindings/swig/ruby/libsvn_swig_ruby/libsvn_swig_ruby-1.la
libsvn_test: subversion/tests/libsvn_test-1.la
libsvn_wc: subversion/libsvn_wc/libsvn_wc-1.la
libsvncxxhl: subversion/bindings/cxxhl/libsvncxxhl-1.la
libsvnjavahl: subversion/bindings/javahl/native/libsvnjavahl-1.la
lock-helper: subversion/tests/cmdline/lock-helper$(EXEEXT)
locks-test: subversion/tests/libsvn_fs/locks-test$(EXEEXT)
mergeinfo-test: subversion/tests/libsvn_subr/mergeinfo-test$(EXEEXT)
mod_authz_svn: subversion/mod_authz_svn/mod_authz_svn.la
mod_dav_svn: subversion/mod_dav_svn/mod_dav_svn.la
mod_dontdothat: tools/server-side/mod_dontdothat/mod_dontdothat.la
mtcc-test: subversion/tests/libsvn_client/mtcc-test$(EXEEXT)
op-depth-test: subversion/tests/libsvn_wc/op-depth-test$(EXEEXT)
opt-test: subversion/tests/libsvn_subr/opt-test$(EXEEXT)
packed-data-test: subversion/tests/libsvn_subr/packed-data-test$(EXEEXT)
parse-diff-test: subversion/tests/libsvn_diff/parse-diff-test$(EXEEXT)
path-test: subversion/tests/libsvn_subr/path-test$(EXEEXT)
perl_client: subversion/bindings/swig/perl/native/_Client.la
perl_core: subversion/bindings/swig/perl/native/_Core.la
perl_delta: subversion/bindings/swig/perl/native/_Delta.la
perl_diff: subversion/bindings/swig/perl/native/_Diff.la
perl_fs: subversion/bindings/swig/perl/native/_Fs.la
perl_ra: subversion/bindings/swig/perl/native/_Ra.la
perl_repos: subversion/bindings/swig/perl/native/_Repos.la
perl_wc: subversion/bindings/swig/perl/native/_Wc.la
prefix-string-test: subversion/tests/libsvn_subr/prefix-string-test$(EXEEXT)
priority-queue-test: subversion/tests/libsvn_subr/priority-queue-test$(EXEEXT)
pristine-store-test: subversion/tests/libsvn_wc/pristine-store-test$(EXEEXT)
python_client: subversion/bindings/swig/python/_client.la
python_core: subversion/bindings/swig/python/_core.la
python_delta: subversion/bindings/swig/python/_delta.la
python_diff: subversion/bindings/swig/python/_diff.la
python_fs: subversion/bindings/swig/python/_fs.la
python_ra: subversion/bindings/swig/python/_ra.la
python_repos: subversion/bindings/swig/python/_repos.la
python_wc: subversion/bindings/swig/python/_wc.la
ra-local-test: subversion/tests/libsvn_ra_local/ra-local-test$(EXEEXT)
ra-test: subversion/tests/libsvn_ra/ra-test$(EXEEXT)
random-test: subversion/tests/libsvn_delta/random-test$(EXEEXT)
repos-test: subversion/tests/libsvn_repos/repos-test$(EXEEXT)
revision-test: subversion/tests/libsvn_subr/revision-test$(EXEEXT)
root-pools-test: subversion/tests/libsvn_subr/root-pools-test$(EXEEXT)
ruby_client: subversion/bindings/swig/ruby/client.la
ruby_core: subversion/bindings/swig/ruby/core.la
ruby_delta: subversion/bindings/swig/ruby/delta.la
ruby_diff: subversion/bindings/swig/ruby/diff.la
ruby_fs: subversion/bindings/swig/ruby/fs.la
ruby_ra: subversion/bindings/swig/ruby/ra.la
ruby_repos: subversion/bindings/swig/ruby/repos.la
ruby_wc: subversion/bindings/swig/ruby/wc.la
skel-test: subversion/tests/libsvn_subr/skel-test$(EXEEXT)
spillbuf-test: subversion/tests/libsvn_subr/spillbuf-test$(EXEEXT)
sqlite-test: subversion/tests/libsvn_subr/sqlite-test$(EXEEXT)
stream-test: subversion/tests/libsvn_subr/stream-test$(EXEEXT)
string-table-test: subversion/tests/libsvn_fs_x/string-table-test$(EXEEXT)
string-test: subversion/tests/libsvn_subr/string-test$(EXEEXT)
strings-reps-test: subversion/tests/libsvn_fs_base/strings-reps-test$(EXEEXT)
subst_translate-test: subversion/tests/libsvn_subr/subst_translate-test$(EXEEXT)
svn: subversion/svn/svn$(EXEEXT)
svn-populate-node-origins-index: tools/server-side/svn-populate-node-origins-index$(EXEEXT)
svn-wc-db-tester: tools/dev/wc-ng/svn-wc-db-tester$(EXEEXT)
svnadmin: subversion/svnadmin/svnadmin$(EXEEXT)
svnauthz: tools/server-side/svnauthz$(EXEEXT)
svnauthz-validate: tools/server-side/svnauthz-validate$(EXEEXT)
svnbench: subversion/svnbench/svnbench$(EXEEXT)
svndiff-test: subversion/tests/libsvn_delta/svndiff-test$(EXEEXT)
svndumpfilter: subversion/svndumpfilter/svndumpfilter$(EXEEXT)
svnfsfs: subversion/svnfsfs/svnfsfs$(EXEEXT)
svnlook: subversion/svnlook/svnlook$(EXEEXT)
svnmucc: subversion/svnmucc/svnmucc$(EXEEXT)
svnraisetreeconflict: tools/dev/svnraisetreeconflict/svnraisetreeconflict$(EXEEXT)
svnrdump: subversion/svnrdump/svnrdump$(EXEEXT)
svnserve: subversion/svnserve/svnserve$(EXEEXT)
svnsync: subversion/svnsync/svnsync$(EXEEXT)
svnversion: subversion/svnversion/svnversion$(EXEEXT)
time-test: subversion/tests/libsvn_subr/time-test$(EXEEXT)
translate-test: subversion/tests/libsvn_subr/translate-test$(EXEEXT)
utf-test: subversion/tests/libsvn_subr/utf-test$(EXEEXT)
vdelta-test: subversion/tests/libsvn_delta/vdelta-test$(EXEEXT)
wc-incomplete-tester: subversion/tests/libsvn_wc/wc-incomplete-tester$(EXEEXT)
wc-lock-tester: subversion/tests/libsvn_wc/wc-lock-tester$(EXEEXT)
wc-queries-test: subversion/tests/libsvn_wc/wc-queries-test$(EXEEXT)
wc-test: subversion/tests/libsvn_wc/wc-test$(EXEEXT)
window-test: subversion/tests/libsvn_delta/window-test$(EXEEXT)
x509-parser: tools/dev/x509-parser$(EXEEXT)
x509-test: subversion/tests/libsvn_subr/x509-test$(EXEEXT)
########################################
# Section 10: Rules to build all other kinds of object-like files
########################################
subversion/bindings/cxxhl/src/aprwrap/impl.lo: subversion/bindings/cxxhl/src/aprwrap/impl.cpp subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp subversion/bindings/cxxhl/include/svncxxhl/exception.hpp subversion/bindings/cxxhl/src/aprwrap/hash.hpp subversion/bindings/cxxhl/src/aprwrap/pool.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_CXXHL_CXX) $(canonicalized_srcdir)subversion/bindings/cxxhl/src/aprwrap/impl.cpp
subversion/bindings/cxxhl/src/exception.lo: subversion/bindings/cxxhl/src/exception.cpp subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp subversion/bindings/cxxhl/include/svncxxhl/exception.hpp subversion/bindings/cxxhl/src/aprwrap.hpp subversion/bindings/cxxhl/src/aprwrap/array.hpp subversion/bindings/cxxhl/src/aprwrap/hash.hpp subversion/bindings/cxxhl/src/aprwrap/pool.hpp subversion/bindings/cxxhl/src/private.hpp subversion/bindings/cxxhl/src/private/exception-private.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_error_private.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
$(COMPILE_CXXHL_CXX) $(canonicalized_srcdir)subversion/bindings/cxxhl/src/exception.cpp
subversion/bindings/cxxhl/src/tristate.lo: subversion/bindings/cxxhl/src/tristate.cpp subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h
$(COMPILE_CXXHL_CXX) $(canonicalized_srcdir)subversion/bindings/cxxhl/src/tristate.cpp
subversion/bindings/cxxhl/tests/cxxhl-tests.lo: subversion/bindings/cxxhl/tests/cxxhl-tests.cpp
if $(SVN_USE_GMOCK) ; then $(COMPILE_CXXHL_GMOCK_CXX) $(canonicalized_srcdir)subversion/bindings/cxxhl/tests/cxxhl-tests.cpp ; else echo "fake" > subversion/bindings/cxxhl/tests/cxxhl-tests.lo ; fi
subversion/bindings/cxxhl/tests/test_aprwrap.lo: subversion/bindings/cxxhl/tests/test_aprwrap.cpp subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp subversion/bindings/cxxhl/include/svncxxhl/exception.hpp subversion/bindings/cxxhl/src/aprwrap.hpp subversion/bindings/cxxhl/src/aprwrap/array.hpp subversion/bindings/cxxhl/src/aprwrap/hash.hpp subversion/bindings/cxxhl/src/aprwrap/pool.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h subversion/svn_private_config.h
if $(SVN_USE_GMOCK) ; then $(COMPILE_CXXHL_GMOCK_CXX) $(canonicalized_srcdir)subversion/bindings/cxxhl/tests/test_aprwrap.cpp ; else echo "fake" > subversion/bindings/cxxhl/tests/test_aprwrap.lo ; fi
subversion/bindings/cxxhl/tests/test_exception.lo: subversion/bindings/cxxhl/tests/test_exception.cpp subversion/bindings/cxxhl/include/svncxxhl.hpp subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp subversion/bindings/cxxhl/include/svncxxhl/exception.hpp subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp subversion/bindings/cxxhl/src/private.hpp subversion/bindings/cxxhl/src/private/exception-private.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h
if $(SVN_USE_GMOCK) ; then $(COMPILE_CXXHL_GMOCK_CXX) $(canonicalized_srcdir)subversion/bindings/cxxhl/tests/test_exception.cpp ; else echo "fake" > subversion/bindings/cxxhl/tests/test_exception.lo ; fi
subversion/bindings/javahl/classes/org/apache/subversion/javahl/BasicTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientException.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientNotifyInformation.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitInfo.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItem.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItemStateFlags.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItemStateFlags.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictDescriptor.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictResult.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/DiffSummary.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ExceptionTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNClient.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNConfig.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNEditor.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRemote.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNReporter.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReporter.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRepos.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIError.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIObject.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeException.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeResources.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/OperationContext.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/OperationContext.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ProgressEvent.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/ReposNotifyInformation.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/RunTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNClient.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNRemoteTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNRepos.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNReposTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNUtil.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/SubversionException.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/UtilTests.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/WC.class: subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/AuthnCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/BlameCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ChangelistCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ChangelistCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ClientNotifyCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ClientNotifyCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/CommitCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitMessageCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/CommitMessageCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConfigEvent.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConfigEvent.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConflictResolverCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConflictResolverCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/DiffSummaryCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/DiffSummaryCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ImportFilterCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ImportFilterCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InfoCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/InfoCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InheritedProplistCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/InheritedProplistCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ListCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ListCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/LogMessageCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/PatchCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/PatchCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProgressCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProgressCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProplistCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteStatus.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteStatus.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposFreezeAction.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposFreezeAction.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposNotifyCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposNotifyCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposVerifyCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposVerifyCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/StatusCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/StatusCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/TunnelAgent.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/TunnelAgent.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/UserPasswordCallback.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/CommitEditor.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/CommitEditor.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteFactory.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteFactory.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteSession.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RetryOpenSession.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RetryOpenSession.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StateReporter.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StateReporter.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StatusEditor.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ChangePath.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Checksum.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ConflictVersion.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ConflictVersion.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/CopySource.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Depth.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Depth.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DiffOptions.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DiffOptions.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DirEntry.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ExternalItem.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Info.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Lock.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/LogDate.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/LogDate.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Mergeinfo.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeInputStream.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeInputStream.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeOutputStream.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeOutputStream.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NodeKind.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NodeKind.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Property.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Revision.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRange.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRangeList.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RuntimeVersion.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RuntimeVersion.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Status.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Tristate.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Tristate.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Version.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/VersionExtended.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigImpl.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigImpl.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigLib.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/DiffLib.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/DiffLib.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/PropLib.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/RequestChannel.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/RequestChannel.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ResponseChannel.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ResponseChannel.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/SubstLib.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/SubstLib.java
subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/TunnelChannel.class: subversion/bindings/javahl/src/org/apache/subversion/javahl/util/TunnelChannel.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BasicTests.class: subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallback2.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback2.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallback3.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback3.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/BlameCallbackImpl.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallbackImpl.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ChangePath.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ChangePath.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ChangelistCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ChangelistCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ClientException.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ClientException.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CommitItem.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/CommitItem.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CommitItemStateFlags.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/CommitItemStateFlags.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CommitMessage.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/CommitMessage.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictDescriptor.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictDescriptor.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictResolverCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResolverCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictResult.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ConflictVersion.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictVersion.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/CopySource.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/CopySource.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Depth.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Depth.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/DiffSummary.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/DiffSummary.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/DiffSummaryReceiver.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/DiffSummaryReceiver.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/DirEntry.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/DirEntry.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ErrorCodes.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ErrorCodes.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Info.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Info2.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/InfoCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/InfoCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/InputInterface.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/InputInterface.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ListCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ListCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Lock.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Lock.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LockStatus.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/LockStatus.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LogDate.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/LogDate.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LogMessage.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/LogMessage.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/LogMessageCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/LogMessageCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Mergeinfo.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Mergeinfo.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/MergeinfoLogKind.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/MergeinfoLogKind.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NativeException.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/NativeException.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NodeKind.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/NodeKind.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Notify.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Notify.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Notify2.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Notify2.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NotifyAction.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/NotifyAction.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NotifyInformation.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/NotifyInformation.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/NotifyStatus.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/NotifyStatus.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Operation.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Operation.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/OutputInterface.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/OutputInterface.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Path.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProgressEvent.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProgressEvent.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProgressListener.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProgressListener.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PromptUserPassword.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/PromptUserPassword.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PromptUserPassword2.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/PromptUserPassword2.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PromptUserPassword3.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/PromptUserPassword3.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/PropertyData.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProplistCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ProplistCallbackImpl.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Revision.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Revision.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/RevisionKind.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/RevisionKind.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/RevisionRange.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/RevisionRange.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/RunTests.class: subversion/bindings/javahl/tests/org/tigris/subversion/javahl/RunTests.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNAdmin.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNAdminTests.class: subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNAdminTests.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClient.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClientInterface.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClientLogLevel.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientLogLevel.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNClientSynchronized.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientSynchronized.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNInputStream.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNInputStream.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNOutputStream.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNOutputStream.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SVNTests.class: subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/ScheduleKind.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/ScheduleKind.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Status.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Status.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/StatusCallback.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/StatusCallback.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/StatusKind.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/StatusKind.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/SubversionException.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/SubversionException.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/Version.class: subversion/bindings/javahl/src/org/tigris/subversion/javahl/Version.java
subversion/bindings/javahl/classes/org/tigris/subversion/javahl/WC.class: subversion/bindings/javahl/tests/org/tigris/subversion/javahl/WC.java
subversion/bindings/javahl/include/AuthnCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/AuthnCallback.class
subversion/bindings/javahl/include/BlameCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/BlameCallback.class
subversion/bindings/javahl/include/ChangePath.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ChangePath.class
subversion/bindings/javahl/include/ChangelistCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ChangelistCallback.class
subversion/bindings/javahl/include/Checksum.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Checksum.class
subversion/bindings/javahl/include/ClientException.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientException.class
subversion/bindings/javahl/include/ClientNotifyCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ClientNotifyCallback.class
subversion/bindings/javahl/include/ClientNotifyInformation.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ClientNotifyInformation.class
subversion/bindings/javahl/include/CommitCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitCallback.class
subversion/bindings/javahl/include/CommitEditor.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/CommitEditor.class
subversion/bindings/javahl/include/CommitInfo.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitInfo.class
subversion/bindings/javahl/include/CommitItem.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItem.class
subversion/bindings/javahl/include/CommitItemStateFlags.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/CommitItemStateFlags.class
subversion/bindings/javahl/include/CommitMessageCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/CommitMessageCallback.class
subversion/bindings/javahl/include/ConfigEvent.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConfigEvent.class
subversion/bindings/javahl/include/ConfigImpl.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigImpl.class
subversion/bindings/javahl/include/ConfigLib.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ConfigLib.class
subversion/bindings/javahl/include/ConflictDescriptor.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictDescriptor.class
subversion/bindings/javahl/include/ConflictResolverCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ConflictResolverCallback.class
subversion/bindings/javahl/include/ConflictResult.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ConflictResult.class
subversion/bindings/javahl/include/ConflictVersion.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ConflictVersion.class
subversion/bindings/javahl/include/CopySource.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/CopySource.class
subversion/bindings/javahl/include/Depth.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Depth.class
subversion/bindings/javahl/include/DiffLib.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/DiffLib.class
subversion/bindings/javahl/include/DiffOptions.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DiffOptions.class
subversion/bindings/javahl/include/DiffSummary.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/DiffSummary.class
subversion/bindings/javahl/include/DiffSummaryCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/DiffSummaryCallback.class
subversion/bindings/javahl/include/DirEntry.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/DirEntry.class
subversion/bindings/javahl/include/ExternalItem.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/ExternalItem.class
subversion/bindings/javahl/include/ISVNClient.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNClient.class
subversion/bindings/javahl/include/ISVNConfig.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNConfig.class
subversion/bindings/javahl/include/ISVNEditor.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNEditor.class
subversion/bindings/javahl/include/ISVNRemote.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRemote.class
subversion/bindings/javahl/include/ISVNReporter.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNReporter.class
subversion/bindings/javahl/include/ISVNRepos.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ISVNRepos.class
subversion/bindings/javahl/include/ImportFilterCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ImportFilterCallback.class
subversion/bindings/javahl/include/Info.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Info.class
subversion/bindings/javahl/include/InfoCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InfoCallback.class
subversion/bindings/javahl/include/InheritedProplistCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/InheritedProplistCallback.class
subversion/bindings/javahl/include/JNIError.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIError.class
subversion/bindings/javahl/include/JNIObject.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/JNIObject.class
subversion/bindings/javahl/include/ListCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ListCallback.class
subversion/bindings/javahl/include/Lock.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Lock.class
subversion/bindings/javahl/include/LogDate.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/LogDate.class
subversion/bindings/javahl/include/LogMessageCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/LogMessageCallback.class
subversion/bindings/javahl/include/Mergeinfo.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Mergeinfo.class
subversion/bindings/javahl/include/NativeException.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeException.class
subversion/bindings/javahl/include/NativeInputStream.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeInputStream.class
subversion/bindings/javahl/include/NativeOutputStream.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NativeOutputStream.class
subversion/bindings/javahl/include/NativeResources.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/NativeResources.class
subversion/bindings/javahl/include/NodeKind.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/NodeKind.class
subversion/bindings/javahl/include/OperationContext.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/OperationContext.class
subversion/bindings/javahl/include/PatchCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/PatchCallback.class
subversion/bindings/javahl/include/ProgressCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProgressCallback.class
subversion/bindings/javahl/include/ProgressEvent.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ProgressEvent.class
subversion/bindings/javahl/include/PropLib.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/PropLib.class
subversion/bindings/javahl/include/Property.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Property.class
subversion/bindings/javahl/include/ProplistCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ProplistCallback.class
subversion/bindings/javahl/include/RemoteFactory.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteFactory.class
subversion/bindings/javahl/include/RemoteFileRevisionsCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.class
subversion/bindings/javahl/include/RemoteLocationSegmentsCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.class
subversion/bindings/javahl/include/RemoteSession.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RemoteSession.class
subversion/bindings/javahl/include/RemoteStatus.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/RemoteStatus.class
subversion/bindings/javahl/include/ReposFreezeAction.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposFreezeAction.class
subversion/bindings/javahl/include/ReposNotifyCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposNotifyCallback.class
subversion/bindings/javahl/include/ReposNotifyInformation.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/ReposNotifyInformation.class
subversion/bindings/javahl/include/ReposVerifyCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/ReposVerifyCallback.class
subversion/bindings/javahl/include/RequestChannel.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/RequestChannel.class
subversion/bindings/javahl/include/ResponseChannel.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/ResponseChannel.class
subversion/bindings/javahl/include/RetryOpenSession.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/RetryOpenSession.class
subversion/bindings/javahl/include/Revision.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Revision.class
subversion/bindings/javahl/include/RevisionRange.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRange.class
subversion/bindings/javahl/include/RevisionRangeList.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RevisionRangeList.class
subversion/bindings/javahl/include/RuntimeVersion.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/RuntimeVersion.class
subversion/bindings/javahl/include/SVNClient.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNClient.class
subversion/bindings/javahl/include/SVNRepos.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNRepos.class
subversion/bindings/javahl/include/SVNUtil.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/SVNUtil.class
subversion/bindings/javahl/include/StateReporter.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StateReporter.class
subversion/bindings/javahl/include/Status.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Status.class
subversion/bindings/javahl/include/StatusCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/StatusCallback.class
subversion/bindings/javahl/include/StatusEditor.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/remote/StatusEditor.class
subversion/bindings/javahl/include/SubstLib.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/SubstLib.class
subversion/bindings/javahl/include/SubversionException.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/SubversionException.class
subversion/bindings/javahl/include/Tristate.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Tristate.class
subversion/bindings/javahl/include/TunnelAgent.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/TunnelAgent.class
subversion/bindings/javahl/include/TunnelChannel.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/util/TunnelChannel.class
subversion/bindings/javahl/include/UserPasswordCallback.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/callback/UserPasswordCallback.class
subversion/bindings/javahl/include/Version.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/Version.class
subversion/bindings/javahl/include/VersionExtended.h: subversion/bindings/javahl/classes/org/apache/subversion/javahl/types/VersionExtended.class
subversion/bindings/javahl/native/Array.lo: subversion/bindings/javahl/native/Array.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Array.cpp
subversion/bindings/javahl/native/AuthnCallback.lo: subversion/bindings/javahl/native/AuthnCallback.cpp subversion/bindings/javahl/native/AuthnCallback.hpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_list.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_x509.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/AuthnCallback.cpp
subversion/bindings/javahl/native/BlameCallback.lo: subversion/bindings/javahl/native/BlameCallback.cpp subversion/bindings/javahl/native/BlameCallback.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/BlameCallback.cpp
subversion/bindings/javahl/native/ChangelistCallback.lo: subversion/bindings/javahl/native/ChangelistCallback.cpp subversion/bindings/javahl/native/ChangelistCallback.h subversion/bindings/javahl/native/ClientContext.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNClient.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ChangelistCallback.cpp
subversion/bindings/javahl/native/ClientContext.lo: subversion/bindings/javahl/native/ClientContext.cpp subversion/bindings/javahl/native/ClientContext.h subversion/bindings/javahl/native/CommitMessage.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNICriticalSection.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ClientContext.cpp
subversion/bindings/javahl/native/CommitCallback.lo: subversion/bindings/javahl/native/CommitCallback.cpp subversion/bindings/javahl/native/CommitCallback.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/CommitCallback.cpp
subversion/bindings/javahl/native/CommitEditor.lo: subversion/bindings/javahl/native/CommitEditor.cpp subversion/bindings/javahl/native/CommitCallback.h subversion/bindings/javahl/native/CommitEditor.h subversion/bindings/javahl/native/EditorCallbacks.hpp subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/InputStream.h subversion/bindings/javahl/native/Iterator.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/LockTokenTable.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/PropertyTable.h subversion/bindings/javahl/native/RemoteSession.h subversion/bindings/javahl/native/RemoteSessionContext.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/CommitEditor.cpp
subversion/bindings/javahl/native/CommitMessage.lo: subversion/bindings/javahl/native/CommitMessage.cpp subversion/bindings/javahl/native/CommitMessage.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/CommitMessage.cpp
subversion/bindings/javahl/native/CopySources.lo: subversion/bindings/javahl/native/CopySources.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/CopySources.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Revision.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/CopySources.cpp
subversion/bindings/javahl/native/CreateJ.lo: subversion/bindings/javahl/native/CreateJ.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_CommitItemStateFlags.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Revision.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/RevisionRange.h subversion/bindings/javahl/native/RevisionRangeList.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/CreateJ.cpp
subversion/bindings/javahl/native/Credential.lo: subversion/bindings/javahl/native/Credential.cpp subversion/bindings/javahl/native/AuthnCallback.hpp subversion/bindings/javahl/native/Credential.hpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Credential.cpp
subversion/bindings/javahl/native/DiffOptions.lo: subversion/bindings/javahl/native/DiffOptions.cpp subversion/bindings/javahl/native/DiffOptions.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/DiffOptions.cpp
subversion/bindings/javahl/native/DiffSummaryReceiver.lo: subversion/bindings/javahl/native/DiffSummaryReceiver.cpp subversion/bindings/javahl/native/DiffSummaryReceiver.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/DiffSummaryReceiver.cpp
subversion/bindings/javahl/native/EditorCallbacks.lo: subversion/bindings/javahl/native/EditorCallbacks.cpp subversion/bindings/javahl/native/EditorCallbacks.hpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Utility.hpp subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/EditorCallbacks.cpp
subversion/bindings/javahl/native/EditorProxy.lo: subversion/bindings/javahl/native/EditorProxy.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EditorProxy.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/NativeStream.hpp subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/EditorProxy.cpp
subversion/bindings/javahl/native/EnumMapper.lo: subversion/bindings/javahl/native/EnumMapper.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_CommitItemStateFlags.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/EnumMapper.cpp
subversion/bindings/javahl/native/ExternalItem.lo: subversion/bindings/javahl/native/ExternalItem.cpp subversion/bindings/javahl/native/ExternalItem.hpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ExternalItem.cpp
subversion/bindings/javahl/native/File.lo: subversion/bindings/javahl/native/File.cpp subversion/bindings/javahl/native/File.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/File.cpp
subversion/bindings/javahl/native/ImportFilterCallback.lo: subversion/bindings/javahl/native/ImportFilterCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/ImportFilterCallback.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ImportFilterCallback.cpp
subversion/bindings/javahl/native/InfoCallback.lo: subversion/bindings/javahl/native/InfoCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/InfoCallback.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/InfoCallback.cpp
subversion/bindings/javahl/native/InputStream.lo: subversion/bindings/javahl/native/InputStream.cpp subversion/bindings/javahl/native/InputStream.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/InputStream.cpp
subversion/bindings/javahl/native/Iterator.lo: subversion/bindings/javahl/native/Iterator.cpp subversion/bindings/javahl/native/Iterator.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Iterator.cpp
subversion/bindings/javahl/native/JNIByteArray.lo: subversion/bindings/javahl/native/JNIByteArray.cpp subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/JNIByteArray.cpp
subversion/bindings/javahl/native/JNICriticalSection.lo: subversion/bindings/javahl/native/JNICriticalSection.cpp subversion/bindings/javahl/native/JNICriticalSection.h subversion/bindings/javahl/native/JNIMutex.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/JNICriticalSection.cpp
subversion/bindings/javahl/native/JNIMutex.lo: subversion/bindings/javahl/native/JNIMutex.cpp subversion/bindings/javahl/native/JNIMutex.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/JNIMutex.cpp
subversion/bindings/javahl/native/JNIStackElement.lo: subversion/bindings/javahl/native/JNIStackElement.cpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/JNIStackElement.cpp
subversion/bindings/javahl/native/JNIStringHolder.lo: subversion/bindings/javahl/native/JNIStringHolder.cpp subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/JNIStringHolder.cpp
subversion/bindings/javahl/native/JNIUtil.lo: subversion/bindings/javahl/native/JNIUtil.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/JNICriticalSection.h subversion/bindings/javahl/native/JNIMutex.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_auth.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/JNIUtil.cpp
subversion/bindings/javahl/native/ListCallback.lo: subversion/bindings/javahl/native/ListCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/ListCallback.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ListCallback.cpp
subversion/bindings/javahl/native/LockTokenTable.lo: subversion/bindings/javahl/native/LockTokenTable.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/LockTokenTable.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/LockTokenTable.cpp
subversion/bindings/javahl/native/LogMessageCallback.lo: subversion/bindings/javahl/native/LogMessageCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/LogMessageCallback.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/LogMessageCallback.cpp
subversion/bindings/javahl/native/MessageReceiver.lo: subversion/bindings/javahl/native/MessageReceiver.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/MessageReceiver.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/MessageReceiver.cpp
subversion/bindings/javahl/native/NativeStream.lo: subversion/bindings/javahl/native/NativeStream.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_types_NativeInputStream.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_NativeOutputStream.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/NativeStream.hpp subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/NativeStream.cpp
subversion/bindings/javahl/native/OperationContext.lo: subversion/bindings/javahl/native/OperationContext.cpp subversion/bindings/javahl/native/CommitMessage.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/GlobalConfig.h subversion/bindings/javahl/native/JNICriticalSection.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/OperationContext.cpp
subversion/bindings/javahl/native/OutputStream.lo: subversion/bindings/javahl/native/OutputStream.cpp subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/OutputStream.cpp
subversion/bindings/javahl/native/PatchCallback.lo: subversion/bindings/javahl/native/PatchCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/PatchCallback.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/PatchCallback.cpp
subversion/bindings/javahl/native/Path.lo: subversion/bindings/javahl/native/Path.cpp subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Path.cpp
subversion/bindings/javahl/native/Pool.lo: subversion/bindings/javahl/native/Pool.cpp subversion/bindings/javahl/native/JNICriticalSection.h subversion/bindings/javahl/native/JNIMutex.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Pool.cpp
subversion/bindings/javahl/native/Prompter.lo: subversion/bindings/javahl/native/Prompter.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_callback_UserPasswordCallback.h subversion/bindings/javahl/native/AuthnCallback.hpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Prompter.cpp
subversion/bindings/javahl/native/PropertyTable.lo: subversion/bindings/javahl/native/PropertyTable.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/PropertyTable.h subversion/include/private/svn_debug.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/PropertyTable.cpp
subversion/bindings/javahl/native/ProplistCallback.lo: subversion/bindings/javahl/native/ProplistCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/ProplistCallback.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ProplistCallback.cpp
subversion/bindings/javahl/native/RemoteSession.lo: subversion/bindings/javahl/native/RemoteSession.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EditorProxy.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/Iterator.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/LogMessageCallback.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/RemoteSession.h subversion/bindings/javahl/native/RemoteSessionContext.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/StateReporter.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/RemoteSession.cpp
subversion/bindings/javahl/native/RemoteSessionContext.lo: subversion/bindings/javahl/native/RemoteSessionContext.cpp subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/RemoteSessionContext.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/RemoteSessionContext.cpp
subversion/bindings/javahl/native/ReposFreezeAction.lo: subversion/bindings/javahl/native/ReposFreezeAction.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/ReposFreezeAction.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ReposFreezeAction.cpp
subversion/bindings/javahl/native/ReposNotifyCallback.lo: subversion/bindings/javahl/native/ReposNotifyCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/ReposNotifyCallback.h subversion/bindings/javahl/native/RevisionRange.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ReposNotifyCallback.cpp
subversion/bindings/javahl/native/ReposVerifyCallback.lo: subversion/bindings/javahl/native/ReposVerifyCallback.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/ReposVerifyCallback.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/ReposVerifyCallback.cpp
subversion/bindings/javahl/native/Revision.lo: subversion/bindings/javahl/native/Revision.cpp subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Revision.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Revision.cpp
subversion/bindings/javahl/native/RevisionRange.lo: subversion/bindings/javahl/native/RevisionRange.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/RevisionRange.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/RevisionRange.cpp
subversion/bindings/javahl/native/RevisionRangeList.lo: subversion/bindings/javahl/native/RevisionRangeList.cpp subversion/bindings/javahl/native/Iterator.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/RevisionRange.h subversion/bindings/javahl/native/RevisionRangeList.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/RevisionRangeList.cpp
subversion/bindings/javahl/native/SVNBase.lo: subversion/bindings/javahl/native/SVNBase.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/SVNBase.cpp
subversion/bindings/javahl/native/SVNClient.lo: subversion/bindings/javahl/native/SVNClient.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/BlameCallback.h subversion/bindings/javahl/native/ChangelistCallback.h subversion/bindings/javahl/native/ClientContext.h subversion/bindings/javahl/native/CommitCallback.h subversion/bindings/javahl/native/CommitMessage.h subversion/bindings/javahl/native/CopySources.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/DiffOptions.h subversion/bindings/javahl/native/DiffSummaryReceiver.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/ExternalItem.hpp subversion/bindings/javahl/native/ImportFilterCallback.h subversion/bindings/javahl/native/InfoCallback.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/ListCallback.h subversion/bindings/javahl/native/LogMessageCallback.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/PatchCallback.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/PropertyTable.h subversion/bindings/javahl/native/ProplistCallback.h subversion/bindings/javahl/native/RemoteSession.h subversion/bindings/javahl/native/RemoteSessionContext.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/RevisionRange.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNClient.h subversion/bindings/javahl/native/StatusCallback.h subversion/bindings/javahl/native/StringArray.h subversion/bindings/javahl/native/Targets.h subversion/bindings/javahl/native/VersionExtended.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_list.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/SVNClient.cpp
subversion/bindings/javahl/native/SVNRepos.lo: subversion/bindings/javahl/native/SVNRepos.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/File.h subversion/bindings/javahl/native/InputStream.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/MessageReceiver.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/ReposFreezeAction.h subversion/bindings/javahl/native/ReposNotifyCallback.h subversion/bindings/javahl/native/ReposVerifyCallback.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNRepos.h subversion/bindings/javahl/native/StringArray.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/SVNRepos.cpp
subversion/bindings/javahl/native/StateReporter.lo: subversion/bindings/javahl/native/StateReporter.cpp subversion/bindings/javahl/native/EditorProxy.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/StateReporter.h subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/StateReporter.cpp
subversion/bindings/javahl/native/StatusCallback.lo: subversion/bindings/javahl/native/StatusCallback.cpp subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/StatusCallback.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/StatusCallback.cpp
subversion/bindings/javahl/native/StringArray.lo: subversion/bindings/javahl/native/StringArray.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/StringArray.h subversion/include/private/svn_debug.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/StringArray.cpp
subversion/bindings/javahl/native/SubversionException.lo: subversion/bindings/javahl/native/SubversionException.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SubversionException.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/SubversionException.cpp
subversion/bindings/javahl/native/Targets.lo: subversion/bindings/javahl/native/Targets.cpp subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/StringArray.h subversion/bindings/javahl/native/Targets.h subversion/include/private/svn_debug.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Targets.cpp
subversion/bindings/javahl/native/Utility.lo: subversion/bindings/javahl/native/Utility.cpp subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Utility.hpp subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/Utility.cpp
subversion/bindings/javahl/native/VersionExtended.lo: subversion/bindings/javahl/native/VersionExtended.cpp subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/VersionExtended.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h subversion/include/svn_version.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/VersionExtended.cpp
subversion/bindings/javahl/native/deprecated.lo: subversion/bindings/javahl/native/deprecated.cpp subversion/bindings/javahl/native/ClientContext.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNClient.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/deprecated.cpp
subversion/bindings/javahl/native/jniwrapper/jni_base.lo: subversion/bindings/javahl/native/jniwrapper/jni_base.cpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
subversion/bindings/javahl/native/jniwrapper/jni_channel.lo: subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
subversion/bindings/javahl/native/jniwrapper/jni_class_cache.lo: subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp subversion/bindings/javahl/native/AuthnCallback.hpp subversion/bindings/javahl/native/Credential.hpp subversion/bindings/javahl/native/EditorCallbacks.hpp subversion/bindings/javahl/native/ExternalItem.hpp subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SubversionException.hpp subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_list.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
subversion/bindings/javahl/native/jniwrapper/jni_io_stream.lo: subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
subversion/bindings/javahl/native/jniwrapper/jni_iterator.lo: subversion/bindings/javahl/native/jniwrapper/jni_iterator.cpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_iterator.cpp
subversion/bindings/javahl/native/jniwrapper/jni_list.lo: subversion/bindings/javahl/native/jniwrapper/jni_list.cpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_list.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
subversion/bindings/javahl/native/jniwrapper/jni_string_map.lo: subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_NativeResources.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_SVNClient.h subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/BlameCallback.h subversion/bindings/javahl/native/ChangelistCallback.h subversion/bindings/javahl/native/ClientContext.h subversion/bindings/javahl/native/CommitCallback.h subversion/bindings/javahl/native/CommitMessage.h subversion/bindings/javahl/native/CopySources.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/DiffOptions.h subversion/bindings/javahl/native/DiffSummaryReceiver.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/ImportFilterCallback.h subversion/bindings/javahl/native/InfoCallback.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/ListCallback.h subversion/bindings/javahl/native/LogMessageCallback.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/PatchCallback.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/PropertyTable.h subversion/bindings/javahl/native/ProplistCallback.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/RevisionRange.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNClient.h subversion/bindings/javahl/native/StatusCallback.h subversion/bindings/javahl/native/StringArray.h subversion/bindings/javahl/native/Targets.h subversion/bindings/javahl/native/VersionExtended.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/version.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_SVNRepos.h subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/File.h subversion/bindings/javahl/native/InputStream.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/MessageReceiver.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/ReposFreezeAction.h subversion/bindings/javahl/native/ReposNotifyCallback.h subversion/bindings/javahl/native/ReposVerifyCallback.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNRepos.h subversion/bindings/javahl/native/StringArray.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_CommitEditor.h subversion/bindings/javahl/native/CommitCallback.h subversion/bindings/javahl/native/CommitEditor.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_RemoteFactory.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/RemoteSession.h subversion/bindings/javahl/native/RemoteSessionContext.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_RemoteSession.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/RemoteSession.h subversion/bindings/javahl/native/RemoteSessionContext.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_remote_StateReporter.h subversion/bindings/javahl/native/EditorProxy.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/StateReporter.h subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_types_RevisionRangeList.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/RevisionRangeList.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_types_RuntimeVersion.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_types_Version.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h subversion/include/svn_version.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_types_VersionExtended.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_VersionExtended_LinkedLib.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_VersionExtended_LinkedLibIterator.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_VersionExtended_LoadedLib.h subversion/bindings/javahl/include/org_apache_subversion_javahl_types_VersionExtended_LoadedLibIterator.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/VersionExtended.h subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_util_ConfigImpl_Category.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_util_ConfigLib.h subversion/bindings/javahl/native/AuthnCallback.hpp subversion/bindings/javahl/native/Credential.hpp subversion/bindings/javahl/native/GlobalConfig.h subversion/bindings/javahl/native/JNICriticalSection.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SubversionException.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_list.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_x509.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_util_DiffLib.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_util_PropLib.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/ExternalItem.hpp subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SubversionException.hpp subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_list.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_util_SubstLib.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/NativeStream.hpp subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/Utility.hpp subversion/bindings/javahl/native/jniwrapper/jni_array.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_util_RequestChannel.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_ResponseChannel.h subversion/bindings/javahl/include/org_apache_subversion_javahl_util_TunnelChannel.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h subversion/svn_private_config.h
$(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.cpp
subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.lo: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl__pre_perl.h subversion/bindings/swig/proxy/swig_perl_external_runtime.swg subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_SWIG_PL) $(canonicalized_srcdir)subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
subversion/bindings/swig/perl/native/core.lo: subversion/bindings/swig/perl/native/core.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_delta.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/core.c
subversion/bindings/swig/perl/native/svn_client.lo: subversion/bindings/swig/perl/native/svn_client.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_client.c
subversion/bindings/swig/perl/native/svn_delta.lo: subversion/bindings/swig/perl/native/svn_delta.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_delta.c
subversion/bindings/swig/perl/native/svn_diff.lo: subversion/bindings/swig/perl/native/svn_diff.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_delta.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_diff.c
subversion/bindings/swig/perl/native/svn_fs.lo: subversion/bindings/swig/perl/native/svn_fs.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_fs.c
subversion/bindings/swig/perl/native/svn_ra.lo: subversion/bindings/swig/perl/native/svn_ra.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_ra.c
subversion/bindings/swig/perl/native/svn_repos.lo: subversion/bindings/swig/perl/native/svn_repos.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_ra.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_repos.c
subversion/bindings/swig/perl/native/svn_wc.lo: subversion/bindings/swig/perl/native/svn_wc.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/svn_private_config.h
$(COMPILE_PL_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/perl/native/svn_wc.c
subversion/bindings/swig/python/core.lo: subversion/bindings/swig/python/core.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_delta.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/core.c
subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.lo: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c subversion/bindings/swig/proxy/swig_python_external_runtime.swg subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_SWIG_PY) $(canonicalized_srcdir)subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
subversion/bindings/swig/python/svn_client.lo: subversion/bindings/swig/python/svn_client.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_client.c
subversion/bindings/swig/python/svn_delta.lo: subversion/bindings/swig/python/svn_delta.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_delta.c
subversion/bindings/swig/python/svn_diff.lo: subversion/bindings/swig/python/svn_diff.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_delta.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_diff.c
subversion/bindings/swig/python/svn_fs.lo: subversion/bindings/swig/python/svn_fs.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_fs.c
subversion/bindings/swig/python/svn_ra.lo: subversion/bindings/swig/python/svn_ra.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_ra.c
subversion/bindings/swig/python/svn_repos.lo: subversion/bindings/swig/python/svn_repos.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_ra.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_repos.c
subversion/bindings/swig/python/svn_wc.lo: subversion/bindings/swig/python/svn_wc.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/svn_private_config.h
$(COMPILE_PY_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/python/svn_wc.c
subversion/bindings/swig/ruby/core.lo: subversion/bindings/swig/ruby/core.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_delta.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/core.c
subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.lo: subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_nls.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_SWIG_RB) $(canonicalized_srcdir)subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
subversion/bindings/swig/ruby/svn_client.lo: subversion/bindings/swig/ruby/svn_client.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_client.c
subversion/bindings/swig/ruby/svn_delta.lo: subversion/bindings/swig/ruby/svn_delta.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_delta.c
subversion/bindings/swig/ruby/svn_diff.lo: subversion/bindings/swig/ruby/svn_diff.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_delta.h subversion/include/svn_fs.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_diff.c
subversion/bindings/swig/ruby/svn_fs.lo: subversion/bindings/swig/ruby/svn_fs.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_fs.c
subversion/bindings/swig/ruby/svn_ra.lo: subversion/bindings/swig/ruby/svn_ra.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_ra.c
subversion/bindings/swig/ruby/svn_repos.lo: subversion/bindings/swig/ruby/svn_repos.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_ra.h subversion/include/svn_wc.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_repos.c
subversion/bindings/swig/ruby/svn_wc.lo: subversion/bindings/swig/ruby/svn_wc.c subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h subversion/include/svn_client.h subversion/include/svn_fs.h subversion/include/svn_repos.h subversion/svn_private_config.h
$(COMPILE_RB_WRAPPER) $(canonicalized_srcdir)subversion/bindings/swig/ruby/svn_wc.c
subversion/libsvn_auth_gnome_keyring/gnome_keyring.lo: subversion/libsvn_auth_gnome_keyring/gnome_keyring.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_auth_gnome_keyring/version.lo: subversion/libsvn_auth_gnome_keyring/version.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h
subversion/libsvn_auth_kwallet/kwallet.lo: subversion/libsvn_auth_kwallet/kwallet.cpp subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/svn_private_config.h
subversion/libsvn_auth_kwallet/version.lo: subversion/libsvn_auth_kwallet/version.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h
subversion/libsvn_client/add.lo: subversion/libsvn_client/add.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/blame.lo: subversion/libsvn_client/blame.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/cat.lo: subversion/libsvn_client/cat.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/changelist.lo: subversion/libsvn_client/changelist.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/checkout.lo: subversion/libsvn_client/checkout.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/cleanup.lo: subversion/libsvn_client/cleanup.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/cmdline.lo: subversion/libsvn_client/cmdline.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_opt_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/commit.lo: subversion/libsvn_client/commit.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/commit_util.lo: subversion/libsvn_client/commit_util.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/compat_providers.lo: subversion/libsvn_client/compat_providers.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h
subversion/libsvn_client/copy.lo: subversion/libsvn_client/copy.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/libsvn_client/mergeinfo.h subversion/svn_private_config.h
subversion/libsvn_client/copy_foreign.lo: subversion/libsvn_client/copy_foreign.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/ctx.lo: subversion/libsvn_client/ctx.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h
subversion/libsvn_client/delete.lo: subversion/libsvn_client/delete.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/deprecated.lo: subversion/libsvn_client/deprecated.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/libsvn_client/mergeinfo.h subversion/svn_private_config.h
subversion/libsvn_client/diff.lo: subversion/libsvn_client/diff.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_private.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_io_private.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/diff_local.lo: subversion/libsvn_client/diff_local.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/diff_summarize.lo: subversion/libsvn_client/diff_summarize.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h
subversion/libsvn_client/export.lo: subversion/libsvn_client/export.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/externals.lo: subversion/libsvn_client/externals.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/import.lo: subversion/libsvn_client/import.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/info.lo: subversion/libsvn_client/info.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/iprops.lo: subversion/libsvn_client/iprops.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/list.lo: subversion/libsvn_client/list.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/locking_commands.lo: subversion/libsvn_client/locking_commands.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/log.lo: subversion/libsvn_client/log.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/merge.lo: subversion/libsvn_client/merge.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_magic.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/libsvn_client/mergeinfo.h subversion/svn_private_config.h
subversion/libsvn_client/mergeinfo.lo: subversion/libsvn_client/mergeinfo.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_magic.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/libsvn_client/mergeinfo.h subversion/svn_private_config.h
subversion/libsvn_client/mtcc.lo: subversion/libsvn_client/mtcc.c subversion/include/private/svn_client_mtcc.h subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/patch.lo: subversion/libsvn_client/patch.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_eol_private.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/prop_commands.lo: subversion/libsvn_client/prop_commands.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/ra.lo: subversion/libsvn_client/ra.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/libsvn_client/mergeinfo.h subversion/svn_private_config.h
subversion/libsvn_client/relocate.lo: subversion/libsvn_client/relocate.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/repos_diff.lo: subversion/libsvn_client/repos_diff.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/resolved.lo: subversion/libsvn_client/resolved.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/revert.lo: subversion/libsvn_client/revert.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/revisions.lo: subversion/libsvn_client/revisions.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/status.lo: subversion/libsvn_client/status.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/switch.lo: subversion/libsvn_client/switch.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/update.lo: subversion/libsvn_client/update.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/upgrade.lo: subversion/libsvn_client/upgrade.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/url.lo: subversion/libsvn_client/url.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/util.lo: subversion/libsvn_client/util.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/svn_private_config.h
subversion/libsvn_client/version.lo: subversion/libsvn_client/version.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h
subversion/libsvn_delta/cancel.lo: subversion/libsvn_delta/cancel.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_delta/compat.lo: subversion/libsvn_delta/compat.c subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_delta/compose_delta.lo: subversion/libsvn_delta/compose_delta.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h
subversion/libsvn_delta/debug_editor.lo: subversion/libsvn_delta/debug_editor.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/debug_editor.h
subversion/libsvn_delta/default_editor.lo: subversion/libsvn_delta/default_editor.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_delta/deprecated.lo: subversion/libsvn_delta/deprecated.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_delta/depth_filter_editor.lo: subversion/libsvn_delta/depth_filter_editor.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_delta/editor.lo: subversion/libsvn_delta/editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_delta/path_driver.lo: subversion/libsvn_delta/path_driver.c subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_delta/svndiff.lo: subversion/libsvn_delta/svndiff.c subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_error_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h subversion/svn_private_config.h
subversion/libsvn_delta/text_delta.lo: subversion/libsvn_delta/text_delta.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h
subversion/libsvn_delta/version.lo: subversion/libsvn_delta/version.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h
subversion/libsvn_delta/xdelta.lo: subversion/libsvn_delta/xdelta.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h
subversion/libsvn_diff/binary_diff.lo: subversion/libsvn_diff/binary_diff.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_diff/deprecated.lo: subversion/libsvn_diff/deprecated.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_diff/diff.lo: subversion/libsvn_diff/diff.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_diff/diff.h
subversion/libsvn_diff/diff3.lo: subversion/libsvn_diff/diff3.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_diff/diff.h
subversion/libsvn_diff/diff4.lo: subversion/libsvn_diff/diff4.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_diff/diff.h
subversion/libsvn_diff/diff_file.lo: subversion/libsvn_diff/diff_file.c subversion/include/private/svn_adler32.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_private.h subversion/include/private/svn_eol_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_diff/diff.h subversion/svn_private_config.h
subversion/libsvn_diff/diff_memory.lo: subversion/libsvn_diff/diff_memory.c subversion/include/private/svn_adler32.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_private.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_diff/diff.h subversion/svn_private_config.h
subversion/libsvn_diff/diff_tree.lo: subversion/libsvn_diff/diff_tree.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/svn_checksum.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_diff/lcs.lo: subversion/libsvn_diff/lcs.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_diff/diff.h
subversion/libsvn_diff/parse-diff.lo: subversion/libsvn_diff/parse-diff.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_eol_private.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h
subversion/libsvn_diff/token.lo: subversion/libsvn_diff/token.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_diff/diff.h
subversion/libsvn_diff/util.lo: subversion/libsvn_diff/util.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_private.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_diff/diff.h subversion/svn_private_config.h
subversion/libsvn_fs/access.lo: subversion/libsvn_fs/access.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h
subversion/libsvn_fs/deprecated.lo: subversion/libsvn_fs/deprecated.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_fs/editor.lo: subversion/libsvn_fs/editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/svn_private_config.h
subversion/libsvn_fs/fs-loader.lo: subversion/libsvn_fs/fs-loader.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_fs/fs-loader.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/bdb-err.lo: subversion/libsvn_fs_base/bdb/bdb-err.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/bdb_compat.lo: subversion/libsvn_fs_base/bdb/bdb_compat.c subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/changes-table.lo: subversion/libsvn_fs_base/bdb/changes-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/changes-table.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/checksum-reps-table.lo: subversion/libsvn_fs_base/bdb/checksum-reps-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/checksum-reps-table.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/copies-table.lo: subversion/libsvn_fs_base/bdb/copies-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/copies-table.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/rev-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/dbt.lo: subversion/libsvn_fs_base/bdb/dbt.c subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/id.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/env.lo: subversion/libsvn_fs_base/bdb/env.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/lock-tokens-table.lo: subversion/libsvn_fs_base/bdb/lock-tokens-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/lock-tokens-table.h subversion/libsvn_fs_base/bdb/locks-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/locks-table.lo: subversion/libsvn_fs_base/bdb/locks-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/lock-tokens-table.h subversion/libsvn_fs_base/bdb/locks-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/miscellaneous-table.lo: subversion/libsvn_fs_base/bdb/miscellaneous-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/miscellaneous-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/node-origins-table.lo: subversion/libsvn_fs_base/bdb/node-origins-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/node-origins-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/nodes-table.lo: subversion/libsvn_fs_base/bdb/nodes-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/nodes-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/reps-table.lo: subversion/libsvn_fs_base/bdb/reps-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/reps-table.h subversion/libsvn_fs_base/bdb/strings-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/rev-table.lo: subversion/libsvn_fs_base/bdb/rev-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/rev-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/strings-table.lo: subversion/libsvn_fs_base/bdb/strings-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/strings-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/txn-table.lo: subversion/libsvn_fs_base/bdb/txn-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/txn-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/bdb/uuids-table.lo: subversion/libsvn_fs_base/bdb/uuids-table.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/dbt.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/uuids-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/dag.lo: subversion/libsvn_fs_base/dag.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/changes-table.h subversion/libsvn_fs_base/bdb/checksum-reps-table.h subversion/libsvn_fs_base/bdb/copies-table.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/node-origins-table.h subversion/libsvn_fs_base/bdb/nodes-table.h subversion/libsvn_fs_base/bdb/reps-table.h subversion/libsvn_fs_base/bdb/rev-table.h subversion/libsvn_fs_base/bdb/strings-table.h subversion/libsvn_fs_base/bdb/txn-table.h subversion/libsvn_fs_base/dag.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/node-rev.h subversion/libsvn_fs_base/reps-strings.h subversion/libsvn_fs_base/revs-txns.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/err.lo: subversion/libsvn_fs_base/err.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/id.h subversion/svn_private_config.h
subversion/libsvn_fs_base/fs.lo: subversion/libsvn_fs_base/fs.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/changes-table.h subversion/libsvn_fs_base/bdb/checksum-reps-table.h subversion/libsvn_fs_base/bdb/copies-table.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/lock-tokens-table.h subversion/libsvn_fs_base/bdb/locks-table.h subversion/libsvn_fs_base/bdb/miscellaneous-table.h subversion/libsvn_fs_base/bdb/node-origins-table.h subversion/libsvn_fs_base/bdb/nodes-table.h subversion/libsvn_fs_base/bdb/reps-table.h subversion/libsvn_fs_base/bdb/rev-table.h subversion/libsvn_fs_base/bdb/strings-table.h subversion/libsvn_fs_base/bdb/txn-table.h subversion/libsvn_fs_base/bdb/uuids-table.h subversion/libsvn_fs_base/dag.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/lock.h subversion/libsvn_fs_base/revs-txns.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/tree.h subversion/libsvn_fs_base/uuid.h subversion/svn_private_config.h
subversion/libsvn_fs_base/id.lo: subversion/libsvn_fs_base/id.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/id.h
subversion/libsvn_fs_base/key-gen.lo: subversion/libsvn_fs_base/key-gen.c subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_base/key-gen.h
subversion/libsvn_fs_base/lock.lo: subversion/libsvn_fs_base/lock.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/lock-tokens-table.h subversion/libsvn_fs_base/bdb/locks-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/lock.h subversion/libsvn_fs_base/revs-txns.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/tree.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/node-rev.lo: subversion/libsvn_fs_base/node-rev.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/node-origins-table.h subversion/libsvn_fs_base/bdb/nodes-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/node-rev.h subversion/libsvn_fs_base/reps-strings.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/reps-strings.lo: subversion/libsvn_fs_base/reps-strings.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/reps-table.h subversion/libsvn_fs_base/bdb/strings-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/reps-strings.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/revs-txns.lo: subversion/libsvn_fs_base/revs-txns.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/changes-table.h subversion/libsvn_fs_base/bdb/copies-table.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/rev-table.h subversion/libsvn_fs_base/bdb/txn-table.h subversion/libsvn_fs_base/dag.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/revs-txns.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/tree.h subversion/svn_private_config.h
subversion/libsvn_fs_base/trail.lo: subversion/libsvn_fs_base/trail.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb-err.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h
subversion/libsvn_fs_base/tree.lo: subversion/libsvn_fs_base/tree.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/changes-table.h subversion/libsvn_fs_base/bdb/copies-table.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/miscellaneous-table.h subversion/libsvn_fs_base/bdb/node-origins-table.h subversion/libsvn_fs_base/bdb/nodes-table.h subversion/libsvn_fs_base/bdb/rev-table.h subversion/libsvn_fs_base/bdb/txn-table.h subversion/libsvn_fs_base/dag.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/lock.h subversion/libsvn_fs_base/node-rev.h subversion/libsvn_fs_base/revs-txns.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/tree.h subversion/svn_private_config.h
subversion/libsvn_fs_base/util/fs_skels.lo: subversion/libsvn_fs_base/util/fs_skels.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_skel.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h
subversion/libsvn_fs_base/uuid.lo: subversion/libsvn_fs_base/uuid.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/uuids-table.h subversion/libsvn_fs_base/err.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/uuid.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/cached_data.lo: subversion/libsvn_fs_fs/cached_data.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/caching.lo: subversion/libsvn_fs_fs/caching.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/dag.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/tree.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/dag.lo: subversion/libsvn_fs_fs/dag.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/dag.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/transaction.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/dump-index.lo: subversion/libsvn_fs_fs/dump-index.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/util.h
subversion/libsvn_fs_fs/fs.lo: subversion/libsvn_fs_fs/fs.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/hotcopy.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/lock.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/recovery.h subversion/libsvn_fs_fs/rep-cache.h subversion/libsvn_fs_fs/revprops.h subversion/libsvn_fs_fs/transaction.h subversion/libsvn_fs_fs/tree.h subversion/libsvn_fs_fs/util.h subversion/libsvn_fs_fs/verify.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/fs_fs.lo: subversion/libsvn_fs_fs/fs_fs.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rep-cache.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/revprops.h subversion/libsvn_fs_fs/transaction.h subversion/libsvn_fs_fs/tree.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/hotcopy.lo: subversion/libsvn_fs_fs/hotcopy.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/hotcopy.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/recovery.h subversion/libsvn_fs_fs/rep-cache.h subversion/libsvn_fs_fs/revprops.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/id.lo: subversion/libsvn_fs_fs/id.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rev_file.h
subversion/libsvn_fs_fs/index.lo: subversion/libsvn_fs_fs/index.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/load-index.lo: subversion/libsvn_fs_fs/load-index.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/transaction.h subversion/libsvn_fs_fs/util.h
subversion/libsvn_fs_fs/lock.lo: subversion/libsvn_fs_fs/lock.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/lock.h subversion/libsvn_fs_fs/tree.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/low_level.lo: subversion/libsvn_fs_fs/low_level.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/low_level.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/pack.lo: subversion/libsvn_fs_fs/pack.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/revprops.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/transaction.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/recovery.lo: subversion/libsvn_fs_fs/recovery.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/recovery.h subversion/libsvn_fs_fs/rep-cache.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/revprops.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/rep-cache.lo: subversion/libsvn_fs_fs/rep-cache.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/rep-cache-db.h subversion/libsvn_fs_fs/rep-cache.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/rev_file.lo: subversion/libsvn_fs_fs/rev_file.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/revprops.lo: subversion/libsvn_fs_fs/revprops.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/revprops.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/stats.lo: subversion/libsvn_fs_fs/stats.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/temp_serializer.lo: subversion/libsvn_fs_fs/temp_serializer.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/temp_serializer.h
subversion/libsvn_fs_fs/transaction.lo: subversion/libsvn_fs_fs/transaction.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/lock.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/rep-cache.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/transaction.h subversion/libsvn_fs_fs/tree.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/tree.lo: subversion/libsvn_fs_fs/tree.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/dag.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/lock.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/temp_serializer.h subversion/libsvn_fs_fs/transaction.h subversion/libsvn_fs_fs/tree.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/util.lo: subversion/libsvn_fs_fs/util.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/util.h subversion/svn_private_config.h
subversion/libsvn_fs_fs/verify.lo: subversion/libsvn_fs_fs/verify.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/cached_data.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rep-cache.h subversion/libsvn_fs_fs/rev_file.h subversion/libsvn_fs_fs/util.h subversion/libsvn_fs_fs/verify.h subversion/svn_private_config.h
subversion/libsvn_fs_util/fs-util.lo: subversion/libsvn_fs_util/fs-util.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/svn_private_config.h
subversion/libsvn_fs_x/cached_data.lo: subversion/libsvn_fs_x/cached_data.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/changes.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/noderevs.h subversion/libsvn_fs_x/pack.h subversion/libsvn_fs_x/reps.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/caching.lo: subversion/libsvn_fs_x/caching.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/changes.h subversion/libsvn_fs_x/dag.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/noderevs.h subversion/libsvn_fs_x/reps.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/tree.h subversion/svn_private_config.h
subversion/libsvn_fs_x/changes.lo: subversion/libsvn_fs_x/changes.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_packed_data.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/changes.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/string_table.h subversion/libsvn_fs_x/temp_serializer.h subversion/svn_private_config.h
subversion/libsvn_fs_x/dag.lo: subversion/libsvn_fs_x/dag.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/dag.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_id.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/transaction.h subversion/svn_private_config.h
subversion/libsvn_fs_x/fs.lo: subversion/libsvn_fs_x/fs.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/hotcopy.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/lock.h subversion/libsvn_fs_x/pack.h subversion/libsvn_fs_x/recovery.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/revprops.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/tree.h subversion/libsvn_fs_x/util.h subversion/libsvn_fs_x/verify.h subversion/svn_private_config.h
subversion/libsvn_fs_x/fs_id.lo: subversion/libsvn_fs_x/fs_id.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_id.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/rev_file.h
subversion/libsvn_fs_x/fs_x.lo: subversion/libsvn_fs_x/fs_x.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/revprops.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/tree.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/hotcopy.lo: subversion/libsvn_fs_x/hotcopy.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/hotcopy.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/recovery.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/revprops.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/id.lo: subversion/libsvn_fs_x/id.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/util.h
subversion/libsvn_fs_x/index.lo: subversion/libsvn_fs_x/index.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/pack.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/lock.lo: subversion/libsvn_fs_x/lock.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/lock.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/tree.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/low_level.lo: subversion/libsvn_fs_x/low_level.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/pack.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/noderevs.lo: subversion/libsvn_fs_x/noderevs.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_packed_data.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/noderevs.h subversion/libsvn_fs_x/string_table.h subversion/libsvn_fs_x/temp_serializer.h subversion/svn_private_config.h
subversion/libsvn_fs_x/pack.lo: subversion/libsvn_fs_x/pack.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/changes.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/noderevs.h subversion/libsvn_fs_x/pack.h subversion/libsvn_fs_x/reps.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/revprops.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/recovery.lo: subversion/libsvn_fs_x/recovery.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/recovery.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/revprops.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/rep-cache.lo: subversion/libsvn_fs_x/rep-cache.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/rep-cache-db.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/reps.lo: subversion/libsvn_fs_x/reps.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_packed_data.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/reps.h subversion/libsvn_fs_x/rev_file.h subversion/svn_private_config.h
subversion/libsvn_fs_x/rev_file.lo: subversion/libsvn_fs_x/rev_file.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/revprops.lo: subversion/libsvn_fs_x/revprops.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/revprops.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/string_table.lo: subversion/libsvn_fs_x/string_table.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_packed_data.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/string_table.h
subversion/libsvn_fs_x/temp_serializer.lo: subversion/libsvn_fs_x/temp_serializer.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h
subversion/libsvn_fs_x/transaction.lo: subversion/libsvn_fs_x/transaction.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_io_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/lock.h subversion/libsvn_fs_x/low_level.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/tree.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/tree.lo: subversion/libsvn_fs_x/tree.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_temp_serializer.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/dag.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_id.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/lock.h subversion/libsvn_fs_x/pack.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/temp_serializer.h subversion/libsvn_fs_x/transaction.h subversion/libsvn_fs_x/tree.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/util.lo: subversion/libsvn_fs_x/util.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/util.h subversion/svn_private_config.h
subversion/libsvn_fs_x/verify.lo: subversion/libsvn_fs_x/verify.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_x/cached_data.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/fs_x.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/index.h subversion/libsvn_fs_x/rep-cache.h subversion/libsvn_fs_x/rev_file.h subversion/libsvn_fs_x/util.h subversion/libsvn_fs_x/verify.h subversion/svn_private_config.h
subversion/libsvn_ra/compat.lo: subversion/libsvn_ra/compat.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra/ra_loader.h subversion/svn_private_config.h
subversion/libsvn_ra/debug_reporter.lo: subversion/libsvn_ra/debug_reporter.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra/debug_reporter.h
subversion/libsvn_ra/deprecated.lo: subversion/libsvn_ra/deprecated.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra/deprecated.h subversion/libsvn_ra/ra_loader.h subversion/svn_private_config.h
subversion/libsvn_ra/editor.lo: subversion/libsvn_ra/editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra/ra_loader.h subversion/svn_private_config.h
subversion/libsvn_ra/ra_loader.lo: subversion/libsvn_ra/ra_loader.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/deprecated.h subversion/libsvn_ra/ra_loader.h subversion/svn_private_config.h
subversion/libsvn_ra/util.lo: subversion/libsvn_ra/util.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_ra_local/ra_plugin.lo: subversion/libsvn_ra_local/ra_plugin.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra/wrapper_template.h subversion/libsvn_ra_local/ra_local.h subversion/svn_private_config.h
subversion/libsvn_ra_local/split_url.lo: subversion/libsvn_ra_local/split_url.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_local/ra_local.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/blame.lo: subversion/libsvn_ra_serf/blame.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/blncache.lo: subversion/libsvn_ra_serf/blncache.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_serf/blncache.h
subversion/libsvn_ra_serf/commit.lo: subversion/libsvn_ra_serf/commit.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/eagain_bucket.lo: subversion/libsvn_ra_serf/eagain_bucket.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/get_deleted_rev.lo: subversion/libsvn_ra_serf/get_deleted_rev.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/get_file.lo: subversion/libsvn_ra_serf/get_file.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/get_lock.lo: subversion/libsvn_ra_serf/get_lock.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/getdate.lo: subversion/libsvn_ra_serf/getdate.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/getlocations.lo: subversion/libsvn_ra_serf/getlocations.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/getlocationsegments.lo: subversion/libsvn_ra_serf/getlocationsegments.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/getlocks.lo: subversion/libsvn_ra_serf/getlocks.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/inherited_props.lo: subversion/libsvn_ra_serf/inherited_props.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/lock.lo: subversion/libsvn_ra_serf/lock.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/log.lo: subversion/libsvn_ra_serf/log.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/merge.lo: subversion/libsvn_ra_serf/merge.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/mergeinfo.lo: subversion/libsvn_ra_serf/mergeinfo.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/multistatus.lo: subversion/libsvn_ra_serf/multistatus.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/options.lo: subversion/libsvn_ra_serf/options.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/property.lo: subversion/libsvn_ra_serf/property.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/replay.lo: subversion/libsvn_ra_serf/replay.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/sb_bucket.lo: subversion/libsvn_ra_serf/sb_bucket.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/serf.lo: subversion/libsvn_ra_serf/serf.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra/wrapper_template.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/stat.lo: subversion/libsvn_ra_serf/stat.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/update.lo: subversion/libsvn_ra_serf/update.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/util.lo: subversion/libsvn_ra_serf/util.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_cert.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_serf/util_error.lo: subversion/libsvn_ra_serf/util_error.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_error_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h
subversion/libsvn_ra_serf/xml.lo: subversion/libsvn_ra_serf/xml.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/client.lo: subversion/libsvn_ra_svn/client.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_ra_svn_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra/wrapper_template.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/cram.lo: subversion/libsvn_ra_svn/cram.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/cyrus_auth.lo: subversion/libsvn_ra_svn/cyrus_auth.c subversion/include/private/ra_svn_sasl.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/deprecated.lo: subversion/libsvn_ra_svn/deprecated.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_ra_svn/editorp.lo: subversion/libsvn_ra_svn/editorp.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/internal_auth.lo: subversion/libsvn_ra_svn/internal_auth.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/marshal.lo: subversion/libsvn_ra_svn/marshal.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_error_private.h subversion/include/private/svn_ra_svn_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/streams.lo: subversion/libsvn_ra_svn/streams.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_io_private.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
subversion/libsvn_ra_svn/version.lo: subversion/libsvn_ra_svn/version.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h
subversion/libsvn_repos/authz.lo: subversion/libsvn_repos/authz.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h
subversion/libsvn_repos/authz_pool.lo: subversion/libsvn_repos/authz_pool.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_object_pool.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h
subversion/libsvn_repos/commit.lo: subversion/libsvn_repos/commit.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/config_pool.lo: subversion/libsvn_repos/config_pool.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_object_pool.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_repos/delta.lo: subversion/libsvn_repos/delta.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/deprecated.lo: subversion/libsvn_repos/deprecated.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/dump.lo: subversion/libsvn_repos/dump.c subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_repos/fs-wrap.lo: subversion/libsvn_repos/fs-wrap.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/hooks.lo: subversion/libsvn_repos/hooks.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/load-fs-vtable.lo: subversion/libsvn_repos/load-fs-vtable.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/load.lo: subversion/libsvn_repos/load.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/log.lo: subversion/libsvn_repos/log.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/node_tree.lo: subversion/libsvn_repos/node_tree.c subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/notify.lo: subversion/libsvn_repos/notify.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/replay.lo: subversion/libsvn_repos/replay.c subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_repos/reporter.lo: subversion/libsvn_repos/reporter.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_fspath.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/repos.lo: subversion/libsvn_repos/repos.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_repos/rev_hunt.lo: subversion/libsvn_repos/rev_hunt.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_repos/repos.h subversion/svn_private_config.h
subversion/libsvn_subr/adler32.lo: subversion/libsvn_subr/adler32.c subversion/include/private/svn_adler32.h
subversion/libsvn_subr/atomic.lo: subversion/libsvn_subr/atomic.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h
subversion/libsvn_subr/auth.lo: subversion/libsvn_subr/auth.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_subr/auth.h subversion/svn_private_config.h
subversion/libsvn_subr/base64.lo: subversion/libsvn_subr/base64.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/bit_array.lo: subversion/libsvn_subr/bit_array.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/cache-inprocess.lo: subversion/libsvn_subr/cache-inprocess.c subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/cache.h subversion/svn_private_config.h
subversion/libsvn_subr/cache-membuffer.lo: subversion/libsvn_subr/cache-membuffer.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/cache.h subversion/libsvn_subr/fnv1a.h subversion/svn_private_config.h
subversion/libsvn_subr/cache-memcache.lo: subversion/libsvn_subr/cache-memcache.c subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/cache.h subversion/svn_private_config.h
subversion/libsvn_subr/cache.lo: subversion/libsvn_subr/cache.c subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/cache.h
subversion/libsvn_subr/cache_config.lo: subversion/libsvn_subr/cache_config.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/checksum.lo: subversion/libsvn_subr/checksum.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/checksum.h subversion/libsvn_subr/fnv1a.h subversion/svn_private_config.h
subversion/libsvn_subr/cmdline.lo: subversion/libsvn_subr/cmdline.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_nls.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_xml.h subversion/libsvn_subr/win32_crashrpt.h subversion/svn_private_config.h
subversion/libsvn_subr/compat.lo: subversion/libsvn_subr/compat.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/compress.lo: subversion/libsvn_subr/compress.c subversion/include/private/svn_debug.h subversion/include/private/svn_error_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/config.lo: subversion/libsvn_subr/config.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/config_impl.h subversion/svn_private_config.h
subversion/libsvn_subr/config_auth.lo: subversion/libsvn_subr/config_auth.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/auth.h subversion/libsvn_subr/config_impl.h subversion/svn_private_config.h
subversion/libsvn_subr/config_file.lo: subversion/libsvn_subr/config_file.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h subversion/libsvn_subr/config_impl.h subversion/svn_private_config.h
subversion/libsvn_subr/config_win.lo: subversion/libsvn_subr/config_win.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_subr/config_impl.h subversion/svn_private_config.h
subversion/libsvn_subr/crypto.lo: subversion/libsvn_subr/crypto.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/crypto.h subversion/svn_private_config.h
subversion/libsvn_subr/ctype.lo: subversion/libsvn_subr/ctype.c subversion/include/svn_ctype.h
subversion/libsvn_subr/date.lo: subversion/libsvn_subr/date.c subversion/include/private/svn_debug.h subversion/include/private/svn_token.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/debug.lo: subversion/libsvn_subr/debug.c subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/deprecated.lo: subversion/libsvn_subr/deprecated.c subversion/include/private/svn_debug.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_opt_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_subr/auth.h subversion/libsvn_subr/opt.h subversion/svn_private_config.h
subversion/libsvn_subr/dirent_uri.lo: subversion/libsvn_subr/dirent_uri.c subversion/include/private/svn_cert.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/dirent_uri.h subversion/svn_private_config.h
subversion/libsvn_subr/dso.lo: subversion/libsvn_subr/dso.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/eol.lo: subversion/libsvn_subr/eol.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_eol_private.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/error.lo: subversion/libsvn_subr/error.c subversion/include/private/svn_debug.h subversion/include/private/svn_error_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_subr/fnv1a.lo: subversion/libsvn_subr/fnv1a.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/fnv1a.h
subversion/libsvn_subr/gpg_agent.lo: subversion/libsvn_subr/gpg_agent.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/libsvn_subr/auth.h subversion/svn_private_config.h
subversion/libsvn_subr/hash.lo: subversion/libsvn_subr/hash.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/io.lo: subversion/libsvn_subr/io.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_io_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_subr/iter.lo: subversion/libsvn_subr/iter.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_iter.h subversion/include/svn_pools.h subversion/include/svn_types.h
subversion/libsvn_subr/lock.lo: subversion/libsvn_subr/lock.c subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h
subversion/libsvn_subr/log.lo: subversion/libsvn_subr/log.c subversion/include/private/svn_debug.h subversion/include/private/svn_log.h subversion/include/svn_checksum.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/macos_keychain.lo: subversion/libsvn_subr/macos_keychain.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h subversion/libsvn_subr/auth.h subversion/svn_private_config.h
subversion/libsvn_subr/magic.lo: subversion/libsvn_subr/magic.c subversion/include/private/svn_debug.h subversion/include/private/svn_magic.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/md5.lo: subversion/libsvn_subr/md5.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_md5.h subversion/include/svn_types.h subversion/libsvn_subr/checksum.h
subversion/libsvn_subr/mergeinfo.lo: subversion/libsvn_subr/mergeinfo.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/mutex.lo: subversion/libsvn_subr/mutex.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/nls.lo: subversion/libsvn_subr/nls.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_nls.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/object_pool.lo: subversion/libsvn_subr/object_pool.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/private/svn_object_pool.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/opt.lo: subversion/libsvn_subr/opt.c subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_subr/opt.h subversion/svn_private_config.h
subversion/libsvn_subr/packed_data.lo: subversion/libsvn_subr/packed_data.c subversion/include/private/svn_debug.h subversion/include/private/svn_delta_private.h subversion/include/private/svn_editor.h subversion/include/private/svn_packed_data.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/path.lo: subversion/libsvn_subr/path.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_subr/dirent_uri.h subversion/svn_private_config.h
subversion/libsvn_subr/pool.lo: subversion/libsvn_subr/pool.c subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_types.h
subversion/libsvn_subr/prefix_string.lo: subversion/libsvn_subr/prefix_string.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/prompt.lo: subversion/libsvn_subr/prompt.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/properties.lo: subversion/libsvn_subr/properties.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/quoprint.lo: subversion/libsvn_subr/quoprint.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_quoprint.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/root_pools.lo: subversion/libsvn_subr/root_pools.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/simple_providers.lo: subversion/libsvn_subr/simple_providers.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h subversion/libsvn_subr/auth.h subversion/svn_private_config.h
subversion/libsvn_subr/skel.lo: subversion/libsvn_subr/skel.c subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/private/svn_string_private.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/sorts.lo: subversion/libsvn_subr/sorts.c subversion/include/private/svn_debug.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/spillbuf.lo: subversion/libsvn_subr/spillbuf.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/sqlite.lo: subversion/libsvn_subr/sqlite.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_io_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/internal_statements.h subversion/svn_private_config.h
subversion/libsvn_subr/sqlite3wrapper.lo: subversion/libsvn_subr/sqlite3wrapper.c subversion/svn_private_config.h
subversion/libsvn_subr/ssl_client_cert_providers.lo: subversion/libsvn_subr/ssl_client_cert_providers.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/ssl_client_cert_pw_providers.lo: subversion/libsvn_subr/ssl_client_cert_pw_providers.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/ssl_server_trust_providers.lo: subversion/libsvn_subr/ssl_server_trust_providers.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/stream.lo: subversion/libsvn_subr/stream.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_eol_private.h subversion/include/private/svn_error_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_subr/string.lo: subversion/libsvn_subr/string.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_string_private.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/subst.lo: subversion/libsvn_subr/subst.c subversion/include/private/svn_debug.h subversion/include/private/svn_eol_private.h subversion/include/private/svn_io_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_subr/sysinfo.lo: subversion/libsvn_subr/sysinfo.c subversion/include/private/svn_debug.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/libsvn_subr/sysinfo.h subversion/svn_private_config.h
subversion/libsvn_subr/target.lo: subversion/libsvn_subr/target.c subversion/include/private/svn_debug.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/temp_serializer.lo: subversion/libsvn_subr/temp_serializer.c subversion/include/private/svn_debug.h subversion/include/private/svn_temp_serializer.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/time.lo: subversion/libsvn_subr/time.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_subr/token.lo: subversion/libsvn_subr/token.c subversion/include/private/svn_debug.h subversion/include/private/svn_token.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/types.lo: subversion/libsvn_subr/types.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_props.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/user.lo: subversion/libsvn_subr/user.c subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h
subversion/libsvn_subr/username_providers.lo: subversion/libsvn_subr/username_providers.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h
subversion/libsvn_subr/utf.lo: subversion/libsvn_subr/utf.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_subr/win32_xlate.h subversion/svn_private_config.h
subversion/libsvn_subr/utf8proc.lo: subversion/libsvn_subr/utf8proc.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/utf8proc/utf8proc.c subversion/libsvn_subr/utf8proc/utf8proc.h subversion/libsvn_subr/utf8proc/utf8proc_data.c subversion/svn_private_config.h
subversion/libsvn_subr/utf_validate.lo: subversion/libsvn_subr/utf_validate.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_eol_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/libsvn_subr/utf_width.lo: subversion/libsvn_subr/utf_width.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h
subversion/libsvn_subr/validate.lo: subversion/libsvn_subr/validate.c subversion/include/private/svn_debug.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/libsvn_subr/version.lo: subversion/libsvn_subr/version.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_subr/sysinfo.h subversion/svn_private_config.h
subversion/libsvn_subr/win32_crashrpt.lo: subversion/libsvn_subr/win32_crashrpt.c subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_subr/sysinfo.h subversion/libsvn_subr/win32_crashrpt.h subversion/libsvn_subr/win32_crashrpt_dll.h
subversion/libsvn_subr/win32_crypto.lo: subversion/libsvn_subr/win32_crypto.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h subversion/libsvn_subr/auth.h subversion/svn_private_config.h
subversion/libsvn_subr/win32_xlate.lo: subversion/libsvn_subr/win32_xlate.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/libsvn_subr/win32_xlate.h subversion/svn_private_config.h
subversion/libsvn_subr/x509info.lo: subversion/libsvn_subr/x509info.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_x509.h subversion/libsvn_subr/x509.h
subversion/libsvn_subr/x509parse.lo: subversion/libsvn_subr/x509parse.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_x509.h subversion/libsvn_subr/x509.h
subversion/libsvn_subr/xml.lo: subversion/libsvn_subr/xml.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/svn_private_config.h
subversion/libsvn_wc/adm_crawler.lo: subversion/libsvn_wc/adm_crawler.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/adm_files.lo: subversion/libsvn_wc/adm_files.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/adm_ops.lo: subversion/libsvn_wc/adm_ops.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/ambient_depth_filter_editor.lo: subversion/libsvn_wc/ambient_depth_filter_editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/cleanup.lo: subversion/libsvn_wc/cleanup.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/conflicts.lo: subversion/libsvn_wc/conflicts.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/context.lo: subversion/libsvn_wc/context.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/copy.lo: subversion/libsvn_wc/copy.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/crop.lo: subversion/libsvn_wc/crop.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/delete.lo: subversion/libsvn_wc/delete.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/deprecated.lo: subversion/libsvn_wc/deprecated.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/diff_editor.lo: subversion/libsvn_wc/diff_editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/diff.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/diff_local.lo: subversion/libsvn_wc/diff_local.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/diff.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/entries.lo: subversion/libsvn_wc/entries.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/tree_conflicts.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h
subversion/libsvn_wc/externals.lo: subversion/libsvn_wc/externals.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/info.lo: subversion/libsvn_wc/info.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/lock.lo: subversion/libsvn_wc/lock.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/merge.lo: subversion/libsvn_wc/merge.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/node.lo: subversion/libsvn_wc/node.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/old-and-busted.lo: subversion/libsvn_wc/old-and-busted.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/props.lo: subversion/libsvn_wc/props.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/questions.lo: subversion/libsvn_wc/questions.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/relocate.lo: subversion/libsvn_wc/relocate.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/revert.lo: subversion/libsvn_wc/revert.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_io_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/revision_status.lo: subversion/libsvn_wc/revision_status.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/status.lo: subversion/libsvn_wc/status.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/translate.lo: subversion/libsvn_wc/translate.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/tree_conflicts.lo: subversion/libsvn_wc/tree_conflicts.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/tree_conflicts.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/update_editor.lo: subversion/libsvn_wc/update_editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/upgrade.lo: subversion/libsvn_wc/upgrade.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/props.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/tree_conflicts.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/util.lo: subversion/libsvn_wc/util.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/wc_db.lo: subversion/libsvn_wc/wc_db.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/entries.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/props.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/wc_db_pristine.lo: subversion/libsvn_wc/wc_db_pristine.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_io_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h
subversion/libsvn_wc/wc_db_update_move.lo: subversion/libsvn_wc/wc_db_update_move.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/libsvn_wc/wc_db_util.lo: subversion/libsvn_wc/wc_db_util.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h
subversion/libsvn_wc/wc_db_wcroot.lo: subversion/libsvn_wc/wc_db_wcroot.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/props.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h
subversion/libsvn_wc/wcroot_anchor.lo: subversion/libsvn_wc/wcroot_anchor.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/libsvn_wc/workqueue.lo: subversion/libsvn_wc/workqueue.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_io_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/adm_files.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/props.h subversion/libsvn_wc/translate.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/mod_authz_svn/mod_authz_svn.lo: subversion/mod_authz_svn/mod_authz_svn.c subversion/include/mod_authz_svn.h subversion/include/mod_dav_svn.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_authz_svn/mod_authz_svn.c ; else echo "fake" > subversion/mod_authz_svn/mod_authz_svn.lo ; fi
subversion/mod_dav_svn/activity.lo: subversion/mod_dav_svn/activity.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/activity.c ; else echo "fake" > subversion/mod_dav_svn/activity.lo ; fi
subversion/mod_dav_svn/authz.lo: subversion/mod_dav_svn/authz.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/authz.c ; else echo "fake" > subversion/mod_dav_svn/authz.lo ; fi
subversion/mod_dav_svn/deadprops.lo: subversion/mod_dav_svn/deadprops.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_log.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/deadprops.c ; else echo "fake" > subversion/mod_dav_svn/deadprops.lo ; fi
subversion/mod_dav_svn/liveprops.lo: subversion/mod_dav_svn/liveprops.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_ctype.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/liveprops.c ; else echo "fake" > subversion/mod_dav_svn/liveprops.lo ; fi
subversion/mod_dav_svn/lock.lo: subversion/mod_dav_svn/lock.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_log.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/lock.c ; else echo "fake" > subversion/mod_dav_svn/lock.lo ; fi
subversion/mod_dav_svn/merge.lo: subversion/mod_dav_svn/merge.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/merge.c ; else echo "fake" > subversion/mod_dav_svn/merge.lo ; fi
subversion/mod_dav_svn/mirror.lo: subversion/mod_dav_svn/mirror.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/mirror.c ; else echo "fake" > subversion/mod_dav_svn/mirror.lo ; fi
subversion/mod_dav_svn/mod_dav_svn.lo: subversion/mod_dav_svn/mod_dav_svn.c subversion/include/mod_authz_svn.h subversion/include/mod_dav_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/private/svn_subr_private.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_dso.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/mod_dav_svn.c ; else echo "fake" > subversion/mod_dav_svn/mod_dav_svn.lo ; fi
subversion/mod_dav_svn/posts/create_txn.lo: subversion/mod_dav_svn/posts/create_txn.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/posts/create_txn.c ; else echo "fake" > subversion/mod_dav_svn/posts/create_txn.lo ; fi
subversion/mod_dav_svn/reports/dated-rev.lo: subversion/mod_dav_svn/reports/dated-rev.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/dated-rev.c ; else echo "fake" > subversion/mod_dav_svn/reports/dated-rev.lo ; fi
subversion/mod_dav_svn/reports/deleted-rev.lo: subversion/mod_dav_svn/reports/deleted-rev.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/deleted-rev.c ; else echo "fake" > subversion/mod_dav_svn/reports/deleted-rev.lo ; fi
subversion/mod_dav_svn/reports/file-revs.lo: subversion/mod_dav_svn/reports/file-revs.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/file-revs.c ; else echo "fake" > subversion/mod_dav_svn/reports/file-revs.lo ; fi
subversion/mod_dav_svn/reports/get-location-segments.lo: subversion/mod_dav_svn/reports/get-location-segments.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/get-location-segments.c ; else echo "fake" > subversion/mod_dav_svn/reports/get-location-segments.lo ; fi
subversion/mod_dav_svn/reports/get-locations.lo: subversion/mod_dav_svn/reports/get-locations.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/get-locations.c ; else echo "fake" > subversion/mod_dav_svn/reports/get-locations.lo ; fi
subversion/mod_dav_svn/reports/get-locks.lo: subversion/mod_dav_svn/reports/get-locks.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/get-locks.c ; else echo "fake" > subversion/mod_dav_svn/reports/get-locks.lo ; fi
subversion/mod_dav_svn/reports/inherited-props.lo: subversion/mod_dav_svn/reports/inherited-props.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/inherited-props.c ; else echo "fake" > subversion/mod_dav_svn/reports/inherited-props.lo ; fi
subversion/mod_dav_svn/reports/log.lo: subversion/mod_dav_svn/reports/log.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/log.c ; else echo "fake" > subversion/mod_dav_svn/reports/log.lo ; fi
subversion/mod_dav_svn/reports/mergeinfo.lo: subversion/mod_dav_svn/reports/mergeinfo.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/mergeinfo.c ; else echo "fake" > subversion/mod_dav_svn/reports/mergeinfo.lo ; fi
subversion/mod_dav_svn/reports/replay.lo: subversion/mod_dav_svn/reports/replay.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_log.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/replay.c ; else echo "fake" > subversion/mod_dav_svn/reports/replay.lo ; fi
subversion/mod_dav_svn/reports/update.lo: subversion/mod_dav_svn/reports/update.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/reports/update.c ; else echo "fake" > subversion/mod_dav_svn/reports/update.lo ; fi
subversion/mod_dav_svn/repos.lo: subversion/mod_dav_svn/repos.c subversion/include/mod_authz_svn.h subversion/include/mod_dav_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/repos.c ; else echo "fake" > subversion/mod_dav_svn/repos.lo ; fi
subversion/mod_dav_svn/status.lo: subversion/mod_dav_svn/status.c subversion/include/mod_authz_svn.h subversion/include/private/svn_cache.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h subversion/svn_private_config.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/status.c ; else echo "fake" > subversion/mod_dav_svn/status.lo ; fi
subversion/mod_dav_svn/util.lo: subversion/mod_dav_svn/util.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/util.c ; else echo "fake" > subversion/mod_dav_svn/util.lo ; fi
subversion/mod_dav_svn/version.lo: subversion/mod_dav_svn/version.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/version.c ; else echo "fake" > subversion/mod_dav_svn/version.lo ; fi
subversion/po/de.mo: subversion/po/de.po
subversion/po/es.mo: subversion/po/es.po
subversion/po/fr.mo: subversion/po/fr.po
subversion/po/it.mo: subversion/po/it.po
subversion/po/ja.mo: subversion/po/ja.po
subversion/po/ko.mo: subversion/po/ko.po
subversion/po/nb.mo: subversion/po/nb.po
subversion/po/pl.mo: subversion/po/pl.po
subversion/po/pt_BR.mo: subversion/po/pt_BR.po
subversion/po/sv.mo: subversion/po/sv.po
subversion/po/zh_CN.mo: subversion/po/zh_CN.po
subversion/po/zh_TW.mo: subversion/po/zh_TW.po
subversion/svn/add-cmd.lo: subversion/svn/add-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/auth-cmd.lo: subversion/svn/auth-cmd.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/include/svn_x509.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/blame-cmd.lo: subversion/svn/blame-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/cat-cmd.lo: subversion/svn/cat-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/changelist-cmd.lo: subversion/svn/changelist-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/checkout-cmd.lo: subversion/svn/checkout-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/cl-conflicts.lo: subversion/svn/cl-conflicts.c subversion/include/private/svn_debug.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl-conflicts.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/cleanup-cmd.lo: subversion/svn/cleanup-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/commit-cmd.lo: subversion/svn/commit-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/conflict-callbacks.lo: subversion/svn/conflict-callbacks.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn/cl-conflicts.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/copy-cmd.lo: subversion/svn/copy-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/delete-cmd.lo: subversion/svn/delete-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/deprecated.lo: subversion/svn/deprecated.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h
subversion/svn/diff-cmd.lo: subversion/svn/diff-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/export-cmd.lo: subversion/svn/export-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/file-merge.lo: subversion/svn/file-merge.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/help-cmd.lo: subversion/svn/help-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/import-cmd.lo: subversion/svn/import-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/info-cmd.lo: subversion/svn/info-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl-conflicts.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/list-cmd.lo: subversion/svn/list-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/lock-cmd.lo: subversion/svn/lock-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/log-cmd.lo: subversion/svn/log-cmd.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_sorts_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl-log.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/merge-cmd.lo: subversion/svn/merge-cmd.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/mergeinfo-cmd.lo: subversion/svn/mergeinfo-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl-log.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/mkdir-cmd.lo: subversion/svn/mkdir-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/move-cmd.lo: subversion/svn/move-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/notify.lo: subversion/svn/notify.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/patch-cmd.lo: subversion/svn/patch-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/propdel-cmd.lo: subversion/svn/propdel-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/propedit-cmd.lo: subversion/svn/propedit-cmd.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/propget-cmd.lo: subversion/svn/propget-cmd.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_sorts_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/proplist-cmd.lo: subversion/svn/proplist-cmd.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/props.lo: subversion/svn/props.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/propset-cmd.lo: subversion/svn/propset-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/relocate-cmd.lo: subversion/svn/relocate-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/resolve-cmd.lo: subversion/svn/resolve-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/resolved-cmd.lo: subversion/svn/resolved-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/revert-cmd.lo: subversion/svn/revert-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/similarity.lo: subversion/svn/similarity.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/status-cmd.lo: subversion/svn/status-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/status.lo: subversion/svn/status.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl-conflicts.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/svn.lo: subversion/svn/svn.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/switch-cmd.lo: subversion/svn/switch-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/unlock-cmd.lo: subversion/svn/unlock-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/update-cmd.lo: subversion/svn/update-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/upgrade-cmd.lo: subversion/svn/upgrade-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svn/util.lo: subversion/svn/util.c subversion/include/private/svn_client_private.h subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn/cl.h subversion/svn_private_config.h
subversion/svnadmin/svnadmin.lo: subversion/svnadmin/svnadmin.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/svn_private_config.h
subversion/svnbench/help-cmd.lo: subversion/svnbench/help-cmd.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/notify.lo: subversion/svnbench/notify.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/null-blame-cmd.lo: subversion/svnbench/null-blame-cmd.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/null-export-cmd.lo: subversion/svnbench/null-export-cmd.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/null-info-cmd.lo: subversion/svnbench/null-info-cmd.c subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/null-list-cmd.lo: subversion/svnbench/null-list-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/include/svn_xml.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/null-log-cmd.lo: subversion/svnbench/null-log-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/svnbench.lo: subversion/svnbench/svnbench.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svnbench/util.lo: subversion/svnbench/util.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnbench/cl.h
subversion/svndumpfilter/svndumpfilter.lo: subversion/svndumpfilter/svndumpfilter.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/svn_private_config.h
subversion/svnfsfs/dump-index-cmd.lo: subversion/svnfsfs/dump-index-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_fs_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svnfsfs/svnfsfs.h
subversion/svnfsfs/load-index-cmd.lo: subversion/svnfsfs/load-index-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_sorts_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/svnfsfs/svnfsfs.h
subversion/svnfsfs/stats-cmd.lo: subversion/svnfsfs/stats-cmd.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/svnfsfs/svnfsfs.h
subversion/svnfsfs/svnfsfs.lo: subversion/svnfsfs/svnfsfs.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/svn_private_config.h subversion/svnfsfs/svnfsfs.h
subversion/svnlook/svnlook.lo: subversion/svnlook/svnlook.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_private.h subversion/include/private/svn_fspath.h subversion/include/private/svn_io_private.h subversion/include/private/svn_sorts_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/svn_private_config.h
subversion/svnmucc/svnmucc.lo: subversion/svnmucc/svnmucc.c subversion/include/private/svn_client_mtcc.h subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h
subversion/svnrdump/dump_editor.lo: subversion/svnrdump/dump_editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/svnrdump/svnrdump.h
subversion/svnrdump/load_editor.lo: subversion/svnrdump/load_editor.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/svnrdump/svnrdump.h
subversion/svnrdump/svnrdump.lo: subversion/svnrdump/svnrdump.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_wc.h subversion/svn_private_config.h subversion/svnrdump/svnrdump.h
subversion/svnrdump/util.lo: subversion/svnrdump/util.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/svnrdump/svnrdump.h
subversion/svnserve/cyrus_auth.lo: subversion/svnserve/cyrus_auth.c subversion/include/private/ra_svn_sasl.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_ra_svn_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra_svn.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/svnserve/server.h
subversion/svnserve/log-escape.lo: subversion/svnserve/log-escape.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_ra_svn.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svnserve/server.h
subversion/svnserve/logger.lo: subversion/svnserve/logger.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra_svn.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/svnserve/logger.h subversion/svnserve/server.h
subversion/svnserve/serve.lo: subversion/svnserve/serve.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_mergeinfo_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_ra_svn_private.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_user.h subversion/svn_private_config.h subversion/svnserve/logger.h subversion/svnserve/server.h
subversion/svnserve/svnserve.lo: subversion/svnserve/svnserve.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_mutex.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_cache_config.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra_svn.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/svn_private_config.h subversion/svnserve/logger.h subversion/svnserve/server.h subversion/svnserve/winservice.h
subversion/svnserve/winservice.lo: subversion/svnserve/winservice.c subversion/include/private/svn_debug.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/svnserve/winservice.h
subversion/svnsync/svnsync.lo: subversion/svnsync/svnsync.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_opt_private.h subversion/include/private/svn_ra_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/svn_private_config.h subversion/svnsync/sync.h
subversion/svnsync/sync.lo: subversion/svnsync/sync.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/svn_private_config.h subversion/svnsync/sync.h
subversion/svnversion/svnversion.lo: subversion/svnversion/svnversion.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_opt_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h
subversion/tests/cmdline/atomic-ra-revprop-change.lo: subversion/tests/cmdline/atomic-ra-revprop-change.c subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h
subversion/tests/cmdline/entries-dump.lo: subversion/tests/cmdline/entries-dump.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/lock.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/tests/cmdline/lock-helper.lo: subversion/tests/cmdline/lock-helper.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
subversion/tests/libsvn_client/client-test.lo: subversion/tests/libsvn_client/client-test.c subversion/include/private/svn_client_mtcc.h subversion/include/private/svn_client_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_editor.h subversion/include/private/svn_magic.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_client/client.h subversion/libsvn_client/mergeinfo.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_client/mtcc-test.lo: subversion/tests/libsvn_client/mtcc-test.c subversion/include/private/svn_client_mtcc.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_delta/random-test.lo: subversion/tests/libsvn_delta/random-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/compose_delta.c subversion/libsvn_delta/delta.h subversion/tests/libsvn_delta/delta-window-test.h subversion/tests/libsvn_delta/range-index-test.h subversion/tests/svn_test.h
subversion/tests/libsvn_delta/svndiff-test.lo: subversion/tests/libsvn_delta/svndiff-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_quoprint.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_delta/vdelta-test.lo: subversion/tests/libsvn_delta/vdelta-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_delta/delta.h subversion/tests/libsvn_delta/delta-window-test.h subversion/tests/svn_test.h
subversion/tests/libsvn_delta/window-test.lo: subversion/tests/libsvn_delta/window-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_diff/diff-diff3-test.lo: subversion/tests/libsvn_diff/diff-diff3-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/tests/svn_test.h
subversion/tests/libsvn_diff/parse-diff-test.lo: subversion/tests/libsvn_diff/parse-diff-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/tests/svn_test.h
-subversion/tests/libsvn_fs/fs-test.lo: subversion/tests/libsvn_fs/fs-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_delta/delta.h subversion/libsvn_fs/fs-loader.h subversion/svn_private_config.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
+subversion/tests/libsvn_fs/fs-test.lo: subversion/tests/libsvn_fs/fs-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_fspath.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_delta/delta.h subversion/libsvn_fs/fs-loader.h subversion/svn_private_config.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs/locks-test.lo: subversion/tests/libsvn_fs/locks-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_base/changes-test.lo: subversion/tests/libsvn_fs_base/changes-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/changes-table.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_base/fs-base-test.lo: subversion/tests/libsvn_fs_base/fs-base-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_fs_util.h subversion/include/private/svn_skel.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_delta/delta.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/nodes-table.h subversion/libsvn_fs_base/bdb/txn-table.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/id.h subversion/libsvn_fs_base/key-gen.h subversion/libsvn_fs_base/trail.h subversion/svn_private_config.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_base/strings-reps-test.lo: subversion/tests/libsvn_fs_base/strings-reps-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_mutex.h subversion/include/private/svn_skel.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_base/bdb/bdb_compat.h subversion/libsvn_fs_base/bdb/env.h subversion/libsvn_fs_base/bdb/reps-table.h subversion/libsvn_fs_base/bdb/strings-table.h subversion/libsvn_fs_base/fs.h subversion/libsvn_fs_base/trail.h subversion/libsvn_fs_base/util/fs_skels.h subversion/svn_private_config.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.lo: subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/rev_file.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
-subversion/tests/libsvn_fs_fs/fs-fs-pack-test.lo: subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/util.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
+subversion/tests/libsvn_fs_fs/fs-fs-pack-test.lo: subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs/fs-loader.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/low_level.h subversion/libsvn_fs_fs/pack.h subversion/libsvn_fs_fs/util.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_fs/fs-fs-private-test.lo: subversion/tests/libsvn_fs_fs/fs-fs-private-test.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_fs_private.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/id.h subversion/libsvn_fs_fs/index.h subversion/libsvn_fs_fs/rev_file.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_x/fs-x-pack-test.lo: subversion/tests/libsvn_fs_x/fs-x-pack-test.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_string_private.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/fs.h subversion/libsvn_fs_x/id.h subversion/libsvn_fs_x/reps.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_fs_x/string-table-test.lo: subversion/tests/libsvn_fs_x/string-table-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_temp_serializer.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_fs_x/string_table.h subversion/tests/svn_test.h
subversion/tests/libsvn_ra/ra-test.lo: subversion/tests/libsvn_ra/ra-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/libsvn_ra_local/ra_local.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_ra_local/ra-local-test.lo: subversion/tests/libsvn_ra_local/ra-local-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_ra_local/ra_local.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_repos/dir-delta-editor.lo: subversion/tests/libsvn_repos/dir-delta-editor.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/libsvn_repos/dir-delta-editor.h subversion/tests/svn_test.h
subversion/tests/libsvn_repos/dump-load-test.lo: subversion/tests/libsvn_repos/dump-load-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_repos/repos-test.lo: subversion/tests/libsvn_repos/repos-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_subr/config_impl.h subversion/tests/libsvn_repos/dir-delta-editor.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_subr/auth-test.lo: subversion/tests/libsvn_subr/auth-test.c subversion/include/private/svn_auth_private.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/bit-array-test.lo: subversion/tests/libsvn_subr/bit-array-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/cache-test.lo: subversion/tests/libsvn_subr/cache-test.c subversion/include/private/svn_cache.h subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/svn_private_config.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/checksum-test.lo: subversion/tests/libsvn_subr/checksum-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/compat-test.lo: subversion/tests/libsvn_subr/compat-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/svn_private_config.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/config-test.lo: subversion/tests/libsvn_subr/config-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/crypto-test.lo: subversion/tests/libsvn_subr/crypto-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_subr/crypto.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/dirent_uri-test.lo: subversion/tests/libsvn_subr/dirent_uri-test.c subversion/include/private/svn_cert.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/error-code-test.lo: subversion/tests/libsvn_subr/error-code-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/error-test.lo: subversion/tests/libsvn_subr/error-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_error_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/hashdump-test.lo: subversion/tests/libsvn_subr/hashdump-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/io-test.lo: subversion/tests/libsvn_subr/io-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_io_private.h subversion/include/private/svn_skel.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_subr/mergeinfo-test.lo: subversion/tests/libsvn_subr/mergeinfo-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_mergeinfo_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/opt-test.lo: subversion/tests/libsvn_subr/opt-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/packed-data-test.lo: subversion/tests/libsvn_subr/packed-data-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_packed_data.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/path-test.lo: subversion/tests/libsvn_subr/path-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/prefix-string-test.lo: subversion/tests/libsvn_subr/prefix-string-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/priority-queue-test.lo: subversion/tests/libsvn_subr/priority-queue-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_sorts_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/revision-test.lo: subversion/tests/libsvn_subr/revision-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/root-pools-test.lo: subversion/tests/libsvn_subr/root-pools-test.c subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/skel-test.lo: subversion/tests/libsvn_subr/skel-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_skel.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_subr/spillbuf-test.lo: subversion/tests/libsvn_subr/spillbuf-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/sqlite-test.lo: subversion/tests/libsvn_subr/sqlite-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/stream-test.lo: subversion/tests/libsvn_subr/stream-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_io_private.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/string-test.lo: subversion/tests/libsvn_subr/string-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/subst_translate-test.lo: subversion/tests/libsvn_subr/subst_translate-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/time-test.lo: subversion/tests/libsvn_subr/time-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/translate-test.lo: subversion/tests/libsvn_subr/translate-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_types.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/utf-test.lo: subversion/tests/libsvn_subr/utf-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/private/svn_utf_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/tests/svn_test.h
subversion/tests/libsvn_subr/x509-test.lo: subversion/tests/libsvn_subr/x509-test.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_x509.h subversion/tests/svn_test.h
subversion/libsvn_subr/sqlite3wrapper.lo: subversion/libsvn_subr/sqlite3wrapper.c subversion/svn_private_config.h
subversion/tests/libsvn_wc/conflict-data-test.lo: subversion/tests/libsvn_wc/conflict-data-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/tree_conflicts.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h
subversion/tests/libsvn_wc/db-test.lo: subversion/tests/libsvn_wc/db-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h
subversion/tests/libsvn_wc/entries-compat.lo: subversion/tests/libsvn_wc/entries-compat.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h
subversion/tests/libsvn_wc/op-depth-test.lo: subversion/tests/libsvn_wc/op-depth-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/conflicts.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/libsvn_wc/wc-test-queries.h subversion/tests/svn_test.h
subversion/tests/libsvn_wc/pristine-store-test.lo: subversion/tests/libsvn_wc/pristine-store-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h
subversion/tests/libsvn_wc/utils.lo: subversion/tests/libsvn_wc/utils.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_wc/utils.lo: subversion/tests/libsvn_wc/utils.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_wc/utils.lo: subversion/tests/libsvn_wc/utils.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_wc/utils.lo: subversion/tests/libsvn_wc/utils.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_wc/utils.lo: subversion/tests/libsvn_wc/utils.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_wc/utils.lo: subversion/tests/libsvn_wc/utils.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/token-map.h subversion/libsvn_wc/wc-queries.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/libsvn_wc/wc-incomplete-tester.lo: subversion/tests/libsvn_wc/wc-incomplete-tester.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
subversion/tests/libsvn_wc/wc-lock-tester.lo: subversion/tests/libsvn_wc/wc-lock-tester.c subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/workqueue.h subversion/svn_private_config.h
subversion/tests/libsvn_wc/wc-queries-test.lo: subversion/tests/libsvn_wc/wc-queries-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_wc/wc-queries.h subversion/svn_private_config.h subversion/tests/svn_test.h
subversion/tests/libsvn_wc/wc-test.lo: subversion/tests/libsvn_wc/wc-test.c subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/libsvn_wc/wc_db_private.h subversion/svn_private_config.h subversion/tests/libsvn_wc/utils.h subversion/tests/svn_test.h
subversion/tests/svn_test_fs.lo: subversion/tests/svn_test_fs.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/tests/svn_test.h subversion/tests/svn_test_fs.h
subversion/tests/svn_test_main.lo: subversion/tests/svn_test_main.c subversion/include/private/svn_atomic.h subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/private/svn_mutex.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/svn_private_config.h subversion/tests/svn_test.h
tools/dev/fsfs-access-map.lo: tools/dev/fsfs-access-map.c subversion/include/private/svn_debug.h subversion/include/private/svn_string_private.h subversion/include/svn_checksum.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
tools/dev/svnraisetreeconflict/svnraisetreeconflict.lo: tools/dev/svnraisetreeconflict/svnraisetreeconflict.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h
tools/dev/wc-ng/svn-wc-db-tester.lo: tools/dev/wc-ng/svn-wc-db-tester.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_diff_tree.h subversion/include/private/svn_skel.h subversion/include/private/svn_sqlite.h subversion/include/private/svn_token.h subversion/include/private/svn_wc_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/libsvn_wc/wc.h subversion/libsvn_wc/wc_db.h subversion/svn_private_config.h
tools/dev/x509-parser.lo: tools/dev/x509-parser.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_x509.h subversion/svn_private_config.h
tools/diff/diff.lo: tools/diff/diff.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h
tools/diff/diff3.lo: tools/diff/diff3.c subversion/include/private/svn_debug.h subversion/include/private/svn_token.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
tools/diff/diff4.lo: tools/diff/diff4.c subversion/include/private/svn_debug.h subversion/include/svn_checksum.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_pools.h subversion/include/svn_string.h subversion/include/svn_types.h
tools/server-side/mod_dontdothat/mod_dontdothat.lo: tools/server-side/mod_dontdothat/mod_dontdothat.c subversion/include/mod_dav_svn.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_path.h subversion/include/svn_string.h subversion/include/svn_types.h
if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)tools/server-side/mod_dontdothat/mod_dontdothat.c ; else echo "fake" > tools/server-side/mod_dontdothat/mod_dontdothat.lo ; fi
tools/server-side/svn-populate-node-origins-index.lo: tools/server-side/svn-populate-node-origins-index.c subversion/include/private/svn_debug.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h
tools/server-side/svnauthz.lo: tools/server-side/svnauthz.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h
tools/server-side/svnauthz.lo: tools/server-side/svnauthz.c subversion/include/private/svn_cmdline_private.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_cmdline.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_utf.h
Index: stable/11/contrib/subversion/configure
===================================================================
--- stable/11/contrib/subversion/configure (revision 309510)
+++ stable/11/contrib/subversion/configure (revision 309511)
@@ -1,28700 +1,28706 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for subversion 1.9.4.
+# Generated by GNU Autoconf 2.69 for subversion 1.9.5.
#
# Report bugs to <http://subversion.apache.org/>.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
esac
fi
as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
&& (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='print -r --'
as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='printf %s\n'
as_echo_n='printf %s'
else
if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
as_echo_n='/usr/ucb/echo -n'
else
as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
as_echo_n_body='eval
arg=$1;
case $arg in #(
*"$as_nl"*)
expr "X$arg" : "X\\(.*\\)$as_nl";
arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
esac;
expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
'
export as_echo_n_body
as_echo_n='sh -c $as_echo_n_body as_echo'
fi
export as_echo_body
as_echo='sh -c $as_echo_body as_echo'
fi
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
PATH_SEPARATOR=';'
}
fi
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
done
IFS=$as_save_IFS
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
$as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there. '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
&& ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
_as_can_reexec=no; export _as_can_reexec;
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
*v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;;
*x* ) as_opts=-x ;;
* ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
as_fn_exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
else
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
esac
fi
"
as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }
exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
else
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1
test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
PATH=/empty FPATH=/empty; export PATH FPATH
test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
|| test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
if (eval "$as_required") 2>/dev/null; then :
as_have_required=yes
else
as_have_required=no
fi
if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
as_shell=$as_dir/$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
{ $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
CONFIG_SHELL=$as_shell as_have_required=yes
if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
break 2
fi
fi
done;;
esac
as_found=false
done
$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
{ $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
CONFIG_SHELL=$SHELL as_have_required=yes
fi; }
IFS=$as_save_IFS
if test "x$CONFIG_SHELL" != x; then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
*v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;;
*x* ) as_opts=-x ;;
* ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
if test x$as_have_required = xno; then :
$as_echo "$0: This script requires a shell more modern than all"
$as_echo "$0: the shells that I found on your system."
if test x${ZSH_VERSION+set} = xset ; then
$as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
$as_echo "$0: Please tell bug-autoconf@gnu.org and
$0: http://subversion.apache.org/ about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
fi
exit 1
fi
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS
## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
return $1
} # as_fn_set_status
# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
set +e
as_fn_set_status $1
exit $1
} # as_fn_exit
# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{
case $as_dir in #(
-*) as_dir=./$as_dir;;
esac
test -d "$as_dir" || eval $as_mkdir_p || {
as_dirs=
while :; do
case $as_dir in #(
*\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
} # as_fn_mkdir_p
# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
test -f "$1" && test -x "$1"
} # as_fn_executable_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
else
as_fn_append ()
{
eval $1=\$$1\$2
}
fi # as_fn_append
# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
else
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
$as_echo "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
if expr a : '\(a\)' >/dev/null 2>&1 &&
test "X`expr 00001 : '.*\(...\)'`" = X001; then
as_expr=expr
else
as_expr=false
fi
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
as_basename=basename
else
as_basename=false
fi
if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
as_dirname=dirname
else
as_dirname=false
fi
as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
}
/^X\/\(\/\/\)$/{
s//\1/
q
}
/^X\/\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
as_lineno_1=$LINENO as_lineno_1a=$LINENO
as_lineno_2=$LINENO as_lineno_2a=$LINENO
eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
# Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
sed -n '
p
/[$]LINENO/=
' <$as_myself |
sed '
s/[$]LINENO.*/&-/
t lineno
b
:lineno
N
:loop
s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
t loop
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
# in an infinite loop. This has already happened in practice.
_as_can_reexec=no; export _as_can_reexec
# Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this).
. "./$as_me.lineno"
# Exit status is that of the last command.
exit
}
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
case `echo 'xy\c'` in
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
xy) ECHO_C='\c';;
*) echo `echo ksh88 bug on AIX 6.1` > /dev/null
ECHO_T=' ';;
esac;;
*)
ECHO_N='-n';;
esac
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
else
rm -f conf$$.dir
mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
as_ln_s='cp -pR'
fi
else
as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
if mkdir -p . 2>/dev/null; then
as_mkdir_p='mkdir -p "$as_dir"'
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
as_test_x='test -x'
as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
SHELL=${CONFIG_SHELL-/bin/sh}
test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1
# Name of the host.
# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='subversion'
PACKAGE_TARNAME='subversion'
-PACKAGE_VERSION='1.9.4'
-PACKAGE_STRING='subversion 1.9.4'
+PACKAGE_VERSION='1.9.5'
+PACKAGE_STRING='subversion 1.9.5'
PACKAGE_BUGREPORT='http://subversion.apache.org/'
PACKAGE_URL=''
ac_unique_file="subversion/include/svn_types.h"
# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
# include <stdlib.h>
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
# include <memory.h>
# endif
# include <string.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
ac_subst_vars='LTLIBOBJS
SVN_CONFIG_SCRIPT_FILES
INCLUDE_OUTPUTS
SWIG_CPPFLAGS
JAVAHL_COMPAT_TESTS_TARGET
JAVAHL_TESTS_TARGET
JAVA_CLASSPATH
LT_CXX_LIBADD
FIX_JAVAHL_LIB
JAVAHL_OBJDIR
INSTALL_EXTRA_JAVAHL_LIB
SVN_FS_LIB_LINK
SVN_FS_LIB_INSTALL_DEPS
SVN_FS_LIB_DEPS
SVN_RA_LIB_LINK
SVN_RA_LIB_INSTALL_DEPS
SVN_RA_LIB_DEPS
CTYPESGEN
SWIG_RB_TEST_VERBOSE
SWIG_RB_SITE_ARCH_DIR
SWIG_RB_SITE_LIB_DIR
SWIG_RB_COMPILE
SWIG_RB_INCLUDES
SWIG_RB_LIBS
SWIG_RB_LINK
SWIG_PL_INCLUDES
SWIG_PY_LIBS
SWIG_PY_LINK
SWIG_PY_COMPILE
SWIG_PY_INCLUDES
SWIG
RUBY_TEENY
RUBY_MINOR
RUBY_MAJOR
RDOC
RUBY
PERL
JNI_INCLUDES
JAR
JAVAH
JAVADOC
JAVAC_COMPAT_FLAGS
JAVAC_FLAGS
JAVAC
JAVA
JDK
PYTHON
MOD_ACTIVATION
SVN_ZLIB_LIBS
SVN_ZLIB_INCLUDES
libsvn_wc_LDFLAGS
libsvn_subr_LDFLAGS
libsvn_repos_LDFLAGS
libsvn_ra_svn_LDFLAGS
libsvn_ra_serf_LDFLAGS
libsvn_ra_local_LDFLAGS
libsvn_ra_LDFLAGS
libsvn_fs_util_LDFLAGS
libsvn_fs_fs_LDFLAGS
libsvn_fs_base_LDFLAGS
libsvn_fs_LDFLAGS
libsvn_diff_LDFLAGS
libsvn_delta_LDFLAGS
libsvn_client_LDFLAGS
libsvn_auth_kwallet_LDFLAGS
libsvn_auth_gnome_keyring_LDFLAGS
LIBOBJS
BDB_TEST_PROGRAMS
BDB_TEST_DEPS
INSTALL_RULES
INSTALL_STATIC_RULES
BUILD_RULES
SVN_KWALLET_LIBS
SVN_KWALLET_INCLUDES
KDE4_CONFIG
SVN_MAGIC_LIBS
SVN_MAGIC_INCLUDES
MSGFMTFLAGS
NO_GETTEXT_CODESET
GETTEXT_CODESET
SVN_INTL_LIBS
XGETTEXT
MSGMERGE
MSGFMT
SVN_USE_GMOCK
GMOCK_SRCDIR
SVN_GNOME_KEYRING_LIBS
SVN_GNOME_KEYRING_INCLUDES
SVN_HAVE_GPG_AGENT
SVN_SASL_LIBS
SVN_SASL_INCLUDES
SVN_DB_LIBS
SVN_DB_INCLUDES
SVN_XML_LIBS
SVN_XML_INCLUDES
DOXYGEN
TRANG
LT_NO_UNDEFINED
TRANSFORM_LIBTOOL_SCRIPTS
LT_LDFLAGS
LT_CFLAGS
SVN_LIBTOOL
CXXCPP
LT_SYS_LIBRARY_PATH
OTOOL64
OTOOL
LIPO
NMEDIT
DSYMUTIL
MANIFEST_TOOL
AWK
RANLIB
STRIP
ac_ct_AR
AR
DLLTOOL
OBJDUMP
NM
ac_ct_DUMPBIN
DUMPBIN
LD
FGREP
LIBTOOL
SVN_BINDIR
SVN_SQLITE_LIBS
SVN_SQLITE_INCLUDES
HTTPD_VERSION
INSTALL_APACHE_MODS
APACHE_LIBEXECDIR
APACHE_INCLUDES
APACHE_LDFLAGS
APXS
SVN_APR_MEMCACHE_LIBS
SVN_APR_MEMCACHE_INCLUDES
SVN_SERF_LIBS
SVN_SERF_INCLUDES
PKG_CONFIG
SVN_LT_SOVERSION
SVN_APR_MAJOR_VERSION
SVN_APRUTIL_LIBS
SVN_APRUTIL_CONFIG
SVN_APRUTIL_INCLUDES
SVN_APR_SHLIB_PATH_VAR
SVN_APR_LIBS
SVN_APR_INCLUDES
SVN_APR_CONFIG
MKDIR
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
LN_S
EGREP
GREP
target_os
target_vendor
target_cpu
target
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
SED
CPP
CXXUSERFLAGS
CXXMAINTAINERFLAGS
CXXNOWARNFLAGS
CXXMODEFLAGS
ac_ct_CXX
CXXFLAGS
CXX
CUSERFLAGS
CMAINTAINERFLAGS
CNOWARNFLAGS
CMODEFLAGS
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
SWIG_LDFLAGS
canonicalized_srcdir
abs_builddir
abs_srcdir
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
with_apr
with_apr_util
with_serf
with_apr_memcache
with_apxs
with_apache_libexecdir
enable_broken_httpd_auth
with_sqlite
enable_sqlite_compatibility_version
enable_shared
enable_static
with_pic
enable_fast_install
with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_experimental_libtool
enable_all_static
enable_local_library_preloading
with_trang
with_doxygen
with_expat
with_berkeley_db
enable_bdb6
with_sasl
enable_keychain
with_gpg_agent
with_gnome_keyring
enable_gmock
enable_ev2_impl
enable_nls
with_libmagic
with_kwallet
enable_plaintext_password_storage
enable_debug
enable_optimize
enable_disallowing_of_undefined_references
enable_maintainer_mode
enable_full_version_match
with_editor
with_zlib
enable_mod_activation
enable_gcov
enable_gprof
with_jdk
with_jikes
with_swig
with_ruby_sitedir
with_ruby_test_verbose
with_ctypesgen
enable_runtime_module_search
enable_javahl
with_junit
'
ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CXX
CXXFLAGS
CCC
CPP
LT_SYS_LIBRARY_PATH
CXXCPP'
# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE
# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'
ac_prev=
ac_dashdash=
for ac_option
do
# If the previous option needs an argument, assign it.
if test -n "$ac_prev"; then
eval $ac_prev=\$ac_option
ac_prev=
continue
fi
case $ac_option in
*=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
*=) ac_optarg= ;;
*) ac_optarg=yes ;;
esac
# Accept the important Cygnus configure options, so we can diagnose typos.
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
-bindir | --bindir | --bindi | --bind | --bin | --bi)
ac_prev=bindir ;;
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
bindir=$ac_optarg ;;
-build | --build | --buil | --bui | --bu)
ac_prev=build_alias ;;
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
build_alias=$ac_optarg ;;
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
cache_file=$ac_optarg ;;
--config-cache | -C)
cache_file=config.cache ;;
-datadir | --datadir | --datadi | --datad)
ac_prev=datadir ;;
-datadir=* | --datadir=* | --datadi=* | --datad=*)
datadir=$ac_optarg ;;
-datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
| --dataroo | --dataro | --datar)
ac_prev=datarootdir ;;
-datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
| --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
datarootdir=$ac_optarg ;;
-disable-* | --disable-*)
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid feature name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval enable_$ac_useropt=no ;;
-docdir | --docdir | --docdi | --doc | --do)
ac_prev=docdir ;;
-docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
docdir=$ac_optarg ;;
-dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
ac_prev=dvidir ;;
-dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
dvidir=$ac_optarg ;;
-enable-* | --enable-*)
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid feature name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval enable_$ac_useropt=\$ac_optarg ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
| --exec | --exe | --ex)
ac_prev=exec_prefix ;;
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
| --exec=* | --exe=* | --ex=*)
exec_prefix=$ac_optarg ;;
-gas | --gas | --ga | --g)
# Obsolete; use --with-gas.
with_gas=yes ;;
-help | --help | --hel | --he | -h)
ac_init_help=long ;;
-help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
ac_init_help=recursive ;;
-help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
ac_init_help=short ;;
-host | --host | --hos | --ho)
ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*)
host_alias=$ac_optarg ;;
-htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
ac_prev=htmldir ;;
-htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
| --ht=*)
htmldir=$ac_optarg ;;
-includedir | --includedir | --includedi | --included | --include \
| --includ | --inclu | --incl | --inc)
ac_prev=includedir ;;
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
| --includ=* | --inclu=* | --incl=* | --inc=*)
includedir=$ac_optarg ;;
-infodir | --infodir | --infodi | --infod | --info | --inf)
ac_prev=infodir ;;
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
infodir=$ac_optarg ;;
-libdir | --libdir | --libdi | --libd)
ac_prev=libdir ;;
-libdir=* | --libdir=* | --libdi=* | --libd=*)
libdir=$ac_optarg ;;
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
| --libexe | --libex | --libe)
ac_prev=libexecdir ;;
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
| --libexe=* | --libex=* | --libe=*)
libexecdir=$ac_optarg ;;
-localedir | --localedir | --localedi | --localed | --locale)
ac_prev=localedir ;;
-localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
localedir=$ac_optarg ;;
-localstatedir | --localstatedir | --localstatedi | --localstated \
| --localstate | --localstat | --localsta | --localst | --locals)
ac_prev=localstatedir ;;
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
| --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
localstatedir=$ac_optarg ;;
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
ac_prev=mandir ;;
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
mandir=$ac_optarg ;;
-nfp | --nfp | --nf)
# Obsolete; use --without-fp.
with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
| --no-cr | --no-c | -n)
no_create=yes ;;
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
no_recursion=yes ;;
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
| --oldin | --oldi | --old | --ol | --o)
ac_prev=oldincludedir ;;
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
oldincludedir=$ac_optarg ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
prefix=$ac_optarg ;;
-program-prefix | --program-prefix | --program-prefi | --program-pref \
| --program-pre | --program-pr | --program-p)
ac_prev=program_prefix ;;
-program-prefix=* | --program-prefix=* | --program-prefi=* \
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
program_prefix=$ac_optarg ;;
-program-suffix | --program-suffix | --program-suffi | --program-suff \
| --program-suf | --program-su | --program-s)
ac_prev=program_suffix ;;
-program-suffix=* | --program-suffix=* | --program-suffi=* \
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
program_suffix=$ac_optarg ;;
-program-transform-name | --program-transform-name \
| --program-transform-nam | --program-transform-na \
| --program-transform-n | --program-transform- \
| --program-transform | --program-transfor \
| --program-transfo | --program-transf \
| --program-trans | --program-tran \
| --progr-tra | --program-tr | --program-t)
ac_prev=program_transform_name ;;
-program-transform-name=* | --program-transform-name=* \
| --program-transform-nam=* | --program-transform-na=* \
| --program-transform-n=* | --program-transform-=* \
| --program-transform=* | --program-transfor=* \
| --program-transfo=* | --program-transf=* \
| --program-trans=* | --program-tran=* \
| --progr-tra=* | --program-tr=* | --program-t=*)
program_transform_name=$ac_optarg ;;
-pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
ac_prev=pdfdir ;;
-pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
pdfdir=$ac_optarg ;;
-psdir | --psdir | --psdi | --psd | --ps)
ac_prev=psdir ;;
-psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
psdir=$ac_optarg ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
| --sbi=* | --sb=*)
sbindir=$ac_optarg ;;
-sharedstatedir | --sharedstatedir | --sharedstatedi \
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
| --sharedst | --shareds | --shared | --share | --shar \
| --sha | --sh)
ac_prev=sharedstatedir ;;
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
| --sha=* | --sh=*)
sharedstatedir=$ac_optarg ;;
-site | --site | --sit)
ac_prev=site ;;
-site=* | --site=* | --sit=*)
site=$ac_optarg ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
srcdir=$ac_optarg ;;
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
| --syscon | --sysco | --sysc | --sys | --sy)
ac_prev=sysconfdir ;;
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
sysconfdir=$ac_optarg ;;
-target | --target | --targe | --targ | --tar | --ta | --t)
ac_prev=target_alias ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
target_alias=$ac_optarg ;;
-v | -verbose | --verbose | --verbos | --verbo | --verb)
verbose=yes ;;
-version | --version | --versio | --versi | --vers | -V)
ac_init_version=: ;;
-with-* | --with-*)
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid package name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval with_$ac_useropt=\$ac_optarg ;;
-without-* | --without-*)
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid package name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval with_$ac_useropt=no ;;
--x)
# Obsolete; use --with-x.
with_x=yes ;;
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
| --x-incl | --x-inc | --x-in | --x-i)
ac_prev=x_includes ;;
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
x_includes=$ac_optarg ;;
-x-libraries | --x-libraries | --x-librarie | --x-librari \
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
ac_prev=x_libraries ;;
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
-*) as_fn_error $? "unrecognized option: \`$ac_option'
Try \`$0 --help' for more information"
;;
*=*)
ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
# Reject names that are not valid shell variable names.
case $ac_envvar in #(
'' | [0-9]* | *[!_$as_cr_alnum]* )
as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
esac
eval $ac_envvar=\$ac_optarg
export $ac_envvar ;;
*)
# FIXME: should be removed in autoconf 3.0.
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
esac
done
if test -n "$ac_prev"; then
ac_option=--`echo $ac_prev | sed 's/_/-/g'`
as_fn_error $? "missing argument to $ac_option"
fi
if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
*) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
# Check all directory arguments for consistency.
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
case $ac_val in
*/ )
ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
eval $ac_var=\$ac_val;;
esac
# Be sure to have absolute directory names.
case $ac_val in
[\\/$]* | ?:[\\/]* ) continue;;
NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
esac
as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done
# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias
# FIXME: To remove some day.
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
fi
ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-
test "$silent" = yes && exec 6>/dev/null
ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
as_fn_error $? "pwd does not report name of working directory"
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
# Try the directory containing this script, then the parent directory.
ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
srcdir=$ac_confdir
if test ! -r "$srcdir/$ac_unique_file"; then
srcdir=..
fi
else
ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
eval ac_env_${ac_var}_set=\${${ac_var}+set}
eval ac_env_${ac_var}_value=\$${ac_var}
eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
eval ac_cv_env_${ac_var}_value=\$${ac_var}
done
#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures subversion 1.9.4 to adapt to many kinds of systems.
+\`configure' configures subversion 1.9.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print \`checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for \`--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or \`..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[$ac_default_prefix]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/subversion]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]
_ACEOF
cat <<\_ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of subversion 1.9.4:";;
+ short | recursive ) echo "Configuration of subversion 1.9.5:";;
esac
cat <<\_ACEOF
Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-broken-httpd-auth
Force build against httpd 2.4 with broken auth
--enable-sqlite-compatibility-version=X.Y.Z
Allow binary to run against SQLite as old as ARG
--enable-shared[=PKGS] build shared libraries [default=yes]
--enable-static[=PKGS] build static libraries [default=yes]
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
--enable-experimental-libtool
Use APR's libtool
--enable-static Build static libraries
--enable-shared Build shared libraries
--enable-all-static Build completely static (standalone) binaries.
--enable-local-library-preloading
Enable preloading of locally built libraries in
locally built executables. This may be necessary for
testing prior to installation on some platforms. It
does not work on some platforms (Darwin, OpenBSD,
...).
--enable-bdb6 Allow building against BDB 6+. See
--with-berkeley-db for specifying the location of
the Berkeley DB installation. Using BDB 6 will fail
if this option is not used.
--disable-keychain Disable use of Mac OS KeyChain for auth credentials
--disable-gmock Do not use the Googlemock testing framework
--enable-ev2-impl Use Ev2 implementations, where available
[EXPERIMENTAL]
--disable-nls Disable gettext functionality
--disable-plaintext-password-storage
Disable on-disk caching of plaintext passwords and
passphrases. (Leaving this functionality enabled
will not force Subversion to store passwords in
plaintext, but does permit users to explicitly allow
that behavior via runtime configuration.)
--enable-debug Turn on debugging
--enable-optimize Turn on optimizations
--enable-disallowing-of-undefined-references
Use -Wl,--no-undefined flag during linking of some
libraries to disallow undefined references
--enable-maintainer-mode
Turn on debugging and very strict compile-time
warnings
--disable-full-version-match
Disable the full version match rules when checking
Subversion library compatibility.
--enable-mod-activation Enable mod_dav_svn in httpd.conf
--enable-gcov Turn on gcov coverage testing (GCC only).
--enable-gprof Produce gprof profiling data in 'gmon.out' (GCC
only).
--enable-runtime-module-search
Turn on dynamic loading of RA/FS libraries including
third-party FS libraries
--enable-javahl Enable compilation of Java high-level bindings
(requires C++)
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-apr=PATH prefix for installed APR, path to APR build tree,
or the full path to apr-config
--with-apr-util=PATH prefix for installed APU, path to APU build tree,
or the full path to apu-config
--with-serf=PREFIX Serf HTTP client library (enabled by default if
found)
--with-apr_memcache=PREFIX
Standalone apr_memcache client library
--with-apxs[=FILE] Build shared Apache modules. FILE is the optional
pathname to the Apache apxs tool; defaults to
"apxs".
--with-apache-libexecdir[=PATH]
Install Apache modules to Apache's configured
modules directory instead of LIBEXECDIR; if PATH is
given, install to PATH.
--with-sqlite=PREFIX Use installed SQLite library or amalgamation file.
--with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
both]
--with-aix-soname=aix|svr4|both
shared library versioning (aka "SONAME") variant to
provide on AIX, [default=aix].
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-sysroot[=DIR] Search for dependent libraries within DIR (or the
compiler's sysroot if not specified).
--with-trang=PATH Specify the command to run the trang schema
converter
--with-doxygen=PATH Specify the command to run doxygen
--with-expat=INCLUDES:LIB_SEARCH_DIRS:LIBS
Specify location of Expat
--with-berkeley-db[=HEADER:INCLUDES:LIB_SEARCH_DIRS:LIBS]
The Subversion Berkeley DB based filesystem library
requires Berkeley DB $db_version or $db_alt_version.
If you specify `--without-berkeley-db', that library
will not be built. If you omit the argument of this
option completely, the configure script will use
Berkeley DB used by APR-UTIL.
--with-sasl=PATH Compile with libsasl2 in PATH
--without-gpg-agent Disable support for GPG-Agent
--with-gnome-keyring Enable use of GNOME Keyring for auth credentials
(enabled by default if found)
--with-libmagic=PREFIX libmagic filetype detection library
--with-kwallet[=PATH] Enable use of KWallet (KDE 4) for auth credentials
--with-editor=PATH Specify a default editor for the subversion client.
--with-zlib=PREFIX zlib compression library
--with-jdk=PATH Try to use 'PATH/include' to find the JNI headers.
If PATH is not specified, look for a Java
Development Kit at JAVA_HOME.
--with-jikes=PATH Specify the path to a jikes binary to use it as your
Java compiler. The default is to look for jikes
(PATH optional). This behavior can be switched off
by supplying 'no'.
--with-swig=PATH Try to use 'PATH/bin/swig' to build the swig
bindings. If PATH is not specified, look for a
'swig' binary in your PATH.
--with-ruby-sitedir=SITEDIR
install Ruby bindings in SITEDIR (default is same as
ruby's one)
--with-ruby-test-verbose=LEVEL
how to use output level for Ruby bindings tests
(default is normal)
--with-ctypesgen=PATH Specify the path to ctypesgen. This can either be
the full path to a ctypesgen installation, the full
path to a ctypesgen source tree or the full path to
ctypesgen.py.
--with-junit=PATH Specify a path to the junit JAR file.
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
CXX C++ compiler command
CXXFLAGS C++ compiler flags
CPP C preprocessor
LT_SYS_LIBRARY_PATH
User-defined run-time library search path.
CXXCPP C++ preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <http://subversion.apache.org/>.
_ACEOF
ac_status=$?
fi
if test "$ac_init_help" = "recursive"; then
# If there are subdirs, report their specific --help.
for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
test -d "$ac_dir" ||
{ cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
continue
ac_builddir=.
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix
case $srcdir in
.) # We are building in place.
ac_srcdir=.
ac_top_srcdir=$ac_top_builddir_sub
ac_abs_top_srcdir=$ac_pwd ;;
[\\/]* | ?:[\\/]* ) # Absolute name.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir
ac_abs_top_srcdir=$srcdir ;;
*) # Relative name.
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_build_prefix$srcdir
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
# Check for guested configure.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
elif test -f "$ac_srcdir/configure"; then
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-subversion configure 1.9.4
+subversion configure 1.9.5
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
exit
fi
## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##
# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
rm -f conftest.$ac_objext
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_compile
# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
rm -f conftest.$ac_objext conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
}; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
# interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_link
# ac_fn_cxx_try_compile LINENO
# ----------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
rm -f conftest.$ac_objext
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_cxx_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_compile
# ac_fn_cxx_try_link LINENO
# -------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
rm -f conftest.$ac_objext conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_cxx_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
}; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
# interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_link
# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
}; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_cpp
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if eval \${$3+:} false; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
# Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_header_compiler=yes
else
ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }
# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
ac_header_preproc=yes
else
ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
yes:no: )
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
;;
no:yes:* )
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## -------------------------------------------- ##
## Report this to http://subversion.apache.org/ ##
## -------------------------------------------- ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_mongrel
# ac_fn_c_try_run LINENO
# ----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_c_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then :
ac_retval=0
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_run
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
eval "$3=yes"
else
eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $2 (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $2
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char $2 ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif
int
main ()
{
return $2 ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
eval "$3=yes"
else
eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
# ac_fn_cxx_try_cpp LINENO
# ------------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_cpp ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
test ! -s conftest.err
}; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_cpp
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
# variable VAR accordingly.
ac_fn_c_check_type ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
main ()
{
if (sizeof ($2))
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
main ()
{
if (sizeof (($2)))
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
else
eval "$3=yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by subversion $as_me 1.9.4, which was
+It was created by subversion $as_me 1.9.5, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##
hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
_ASUNAME
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
$as_echo "PATH: $as_dir"
done
IFS=$as_save_IFS
} >&5
cat >&5 <<_ACEOF
## ----------- ##
## Core tests. ##
## ----------- ##
_ACEOF
# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
for ac_arg
do
case $ac_arg in
-no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
2)
as_fn_append ac_configure_args1 " '$ac_arg'"
if test $ac_must_keep_next = true; then
ac_must_keep_next=false # Got value, back to normal.
else
case $ac_arg in
*=* | --config-cache | -C | -disable-* | --disable-* \
| -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
| -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
| -with-* | --with-* | -without-* | --without-* | --x)
case "$ac_configure_args0 " in
"$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
esac
;;
-* ) ac_must_keep_next=true ;;
esac
fi
as_fn_append ac_configure_args " '$ac_arg'"
;;
esac
done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}
# When interrupted or exit'd, cleanup temporary files, and complete
# config.log. We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
# Save into config.log some information that might help in debugging.
{
echo
$as_echo "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
# The following way of writing the cache mishandles newlines in values,
(
for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
eval ac_val=\$$ac_var
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
*_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
*) { eval $ac_var=; unset $ac_var;} ;;
esac ;;
esac
done
(set) 2>&1 |
case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
sed -n \
"s/'\''/'\''\\\\'\'''\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
;; #(
*)
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
sort
)
echo
$as_echo "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
for ac_var in $ac_subst_vars
do
eval ac_val=\$$ac_var
case $ac_val in
*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
$as_echo "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
$as_echo "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
for ac_var in $ac_subst_files
do
eval ac_val=\$$ac_var
case $ac_val in
*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
$as_echo "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
$as_echo "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
cat confdefs.h
echo
fi
test "$ac_signal" != 0 &&
$as_echo "$as_me: caught signal $ac_signal"
$as_echo "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
$as_echo "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
# We do not want a PATH search for config.site.
case $CONFIG_SITE in #((
-*) ac_site_file1=./$CONFIG_SITE;;
*/*) ac_site_file1=$CONFIG_SITE;;
*) ac_site_file1=./$CONFIG_SITE;;
esac
elif test "x$prefix" != xNONE; then
ac_site_file1=$prefix/share/config.site
ac_site_file2=$prefix/etc/config.site
else
ac_site_file1=$ac_default_prefix/share/config.site
ac_site_file2=$ac_default_prefix/etc/config.site
fi
for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
test "x$ac_site_file" = xNONE && continue
if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
|| { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
done
if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
eval ac_old_set=\$ac_cv_env_${ac_var}_set
eval ac_new_set=\$ac_env_${ac_var}_set
eval ac_old_val=\$ac_cv_env_${ac_var}_value
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
if test "x$ac_old_val" != "x$ac_new_val"; then
# differences in whitespace do not lead to failure.
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
*\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
*" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
*) as_fn_append ac_configure_args " '$ac_arg'" ;;
esac
fi
done
if $ac_cache_corrupted; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
ac_aux_dir=
for ac_dir in build "$srcdir"/build; do
if test -f "$ac_dir/install-sh"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install-sh -c"
break
elif test -f "$ac_dir/install.sh"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install.sh -c"
break
elif test -f "$ac_dir/shtool"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/shtool install -c"
break
fi
done
if test -z "$ac_aux_dir"; then
as_fn_error $? "cannot find install-sh, install.sh, or shtool in build \"$srcdir\"/build" "$LINENO" 5
fi
# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.4" >&5
-$as_echo "$as_me: Configuring Subversion 1.9.4" >&6;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.5" >&5
+$as_echo "$as_me: Configuring Subversion 1.9.5" >&6;}
abs_srcdir="`cd $srcdir && pwd`"
abs_builddir="`pwd`"
if test "$abs_srcdir" = "$abs_builddir"; then
canonicalized_srcdir=""
else
canonicalized_srcdir="$srcdir/"
fi
SWIG_LDFLAGS="$LDFLAGS"
# Generate config.nice early (before the arguments are munged)
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating config.nice" >&5
$as_echo "$as_me: creating config.nice" >&6;}
# This little dance satisfies Cygwin, which cannot overwrite in-use files.
if test -f "config.nice"; then
mv "config.nice" "config.nice.old"
fi
cat >"config.nice" <<EOF
#! /bin/sh
#
# Created by configure
'$0' $ac_configure_args "\$@"
EOF
chmod +x "config.nice"
rm -f "config.nice.old"
# ==== Check for programs ====================================================
# Look for a C compiler (before anything can set CFLAGS)
CUSERFLAGS="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
CC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
else
CC="$ac_cv_prog_CC"
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
if test $ac_prog_rejected = yes; then
# We found a bogon in the path, so make sure we never use it.
set dummy $ac_cv_prog_CC
shift
if test $# != 0; then
# We chose a different compiler from the bogus one.
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
for ac_prog in cl.exe
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$CC" && break
done
fi
if test -z "$CC"; then
ac_ct_CC=$CC
for ac_prog in cl.exe
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$ac_ct_CC" && break
done
if test "x$ac_ct_CC" = x; then
CC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
fi
fi
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
sed '10a\
... rest of stderr output deleted ...
10q' conftest.err >conftest.er1
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
$as_echo_n "checking whether the C compiler works... " >&6; }
ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
ac_rmfiles=
for ac_file in $ac_files
do
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
* ) ac_rmfiles="$ac_rmfiles $ac_file";;
esac
done
rm -f $ac_rmfiles
if { { ac_try="$ac_link_default"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
test -f "$ac_file" || continue
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
;;
[ab].out )
# We found the default executable, but exeext='' is most
# certainly right.
break;;
*.* )
if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
# We set ac_cv_exeext here because the later test for it is not
# safe: cross compilers may not add the suffix if given an `-o'
# argument, so we may need to know it at that point already.
# Even if this section looks crufty: it has the advantage of
# actually working.
break;;
* )
break;;
esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
else
ac_file=''
fi
if test -z "$ac_file"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
$as_echo_n "checking for C compiler default output file name... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
$as_echo_n "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
test -f "$ac_file" || continue
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
*.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
break;;
* ) break;;
esac
done
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
main ()
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
;
return 0;
}
_ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
$as_echo_n "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if ${ac_cv_objext+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
*) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
break;;
esac
done
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#ifndef __GNUC__
choke me
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_compiler_gnu=yes
else
ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if ${ac_cv_prog_cc_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_g=yes
else
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
else
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
CFLAGS="-g -O2"
else
CFLAGS="-g"
fi
else
if test "$GCC" = yes; then
CFLAGS="-O2"
else
CFLAGS=
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdarg.h>
#include <stdio.h>
struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
{
return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
char *s;
va_list v;
va_start (v,p);
s = g (p, va_arg (v,int));
va_end (v);
return s;
}
/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
function prototypes and stuff, but not '\xHH' hex character constants.
These don't provoke an error unfortunately, instead are silently treated
as 'x'. The following induces an error, until -std is added to get
proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
array size at least. It's necessary to write '\x00'==0 to get something
that's true only with -std. */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];
/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
inside strings and character constants. */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
;
return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
x)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
xno)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
*)
CC="$CC $ac_cv_prog_cc_c89"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
CFLAGS_KEEP="$CFLAGS"
CFLAGS=""
if test "$GCC" = "yes"; then
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -std=c90" >&5
$as_echo_n "checking if $CC accepts -std=c90... " >&6; }
CFLAGS="-std=c90 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -std=c89" >&5
$as_echo_n "checking if $CC accepts -std=c89... " >&6; }
CFLAGS="-std=c89 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -ansi" >&5
$as_echo_n "checking if $CC accepts -ansi... " >&6; }
CFLAGS="-ansi $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
CMODEFLAGS="$CFLAGS"
CFLAGS=""
if test "$GCC" = "yes"; then
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -w" >&5
$as_echo_n "checking if $CC accepts -w... " >&6; }
CFLAGS="-w $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
CNOWARNFLAGS="$CFLAGS"
CFLAGS="$CFLAGS_KEEP"
if test "$GCC" = "yes"; then
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=unknown-warning-option" >&5
$as_echo_n "checking if $CC accepts -Werror=unknown-warning-option... " >&6; }
CFLAGS="-Werror=unknown-warning-option $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
# Look for a C++ compiler (before anything can set CXXFLAGS)
CXXUSERFLAGS="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -z "$CXX"; then
if test -n "$CCC"; then
CXX=$CCC
else
if test -n "$ac_tool_prefix"; then
for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CXX"; then
ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
$as_echo "$CXX" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$CXX" && break
done
fi
if test -z "$CXX"; then
ac_ct_CXX=$CXX
for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CXX"; then
ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CXX="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
$as_echo "$ac_ct_CXX" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$ac_ct_CXX" && break
done
if test "x$ac_ct_CXX" = x; then
CXX="g++"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CXX=$ac_ct_CXX
fi
fi
fi
fi
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
sed '10a\
... rest of stderr output deleted ...
10q' conftest.err >conftest.er1
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
if ${ac_cv_cxx_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#ifndef __GNUC__
choke me
#endif
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
ac_compiler_gnu=yes
else
ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
GXX=yes
else
GXX=
fi
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
if ${ac_cv_prog_cxx_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
ac_cxx_werror_flag=yes
ac_cv_prog_cxx_g=no
CXXFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
ac_cv_prog_cxx_g=yes
else
CXXFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
else
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
CXXFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
ac_cv_prog_cxx_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
$as_echo "$ac_cv_prog_cxx_g" >&6; }
if test "$ac_test_CXXFLAGS" = set; then
CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
if test "$GXX" = yes; then
CXXFLAGS="-g -O2"
else
CXXFLAGS="-g"
fi
else
if test "$GXX" = yes; then
CXXFLAGS="-O2"
else
CXXFLAGS=
fi
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
CXXFLAGS_KEEP="$CXXFLAGS"
CXXFLAGS=""
if test "$GXX" = "yes"; then
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -std=c++98" >&5
$as_echo_n "checking if $CXX accepts -std=c++98... " >&6; }
CXXFLAGS="-std=c++98 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
CXXMODEFLAGS="$CXXFLAGS"
CXXFLAGS=""
if test "$GXX" = "yes"; then
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -w" >&5
$as_echo_n "checking if $CXX accepts -w... " >&6; }
CXXFLAGS="-w $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
CXXNOWARNFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS_KEEP"
if test "$GXX" = "yes"; then
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Werror=unknown-warning-option" >&5
$as_echo_n "checking if $CXX accepts -Werror=unknown-warning-option... " >&6; }
CXXFLAGS="-Werror=unknown-warning-option $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
# Look for a C pre-processor
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
$as_echo_n "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
if ${ac_cv_prog_CPP+:} false; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CPP needs to be expanded
for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
do
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
# <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
else
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
# Broken: success on invalid input.
continue
else
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
break
fi
done
ac_cv_prog_CPP=$CPP
fi
CPP=$ac_cv_prog_CPP
else
ac_cv_prog_CPP=$CPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
$as_echo "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
# <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
else
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
# Broken: success on invalid input.
continue
else
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
# Look for a good sed
# AC_PROG_SED was introduced in Autoconf 2.59b
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if ${ac_cv_path_SED+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
for ac_i in 1 2 3 4 5 6 7; do
ac_script="$ac_script$as_nl$ac_script"
done
echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
{ ac_script=; unset ac_script;}
if test -z "$SED"; then
ac_path_SED_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in sed gsed; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
# Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo '' >> "conftest.nl"
"$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_SED_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_SED="$ac_path_SED"
ac_path_SED_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_SED_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_SED"; then
as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
fi
else
ac_cv_path_SED=$SED
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
SED="$ac_cv_path_SED"
rm -f conftest.sed
# Grab target_cpu, so we can use it in the Solaris pkginfo file
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
if ${ac_cv_build+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if ${ac_cv_host+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
if ${ac_cv_target+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$target_alias" = x; then
ac_cv_target=$ac_cv_host
else
ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_target
shift
target_cpu=$1
target_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
target_os=$*
IFS=$ac_save_IFS
case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
test -n "$target_alias" &&
test "$program_prefix$program_suffix$program_transform_name" = \
NONENONEs,x,x, &&
program_prefix=${target_alias}-
# Look for an extended grep
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$GREP"; then
ac_path_GREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in grep ggrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'GREP' >> "conftest.nl"
"$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_GREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_GREP="$ac_path_GREP"
ac_path_GREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_GREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_GREP"; then
as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_GREP=$GREP
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
GREP="$ac_cv_path_GREP"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
then ac_cv_path_EGREP="$GREP -E"
else
if test -z "$EGREP"; then
ac_path_EGREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in egrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'EGREP' >> "conftest.nl"
"$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_EGREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_EGREP="$ac_path_EGREP"
ac_path_EGREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_EGREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_EGREP"; then
as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_EGREP=$EGREP
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
$as_echo_n "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
$as_echo "no, using $LN_S" >&6; }
fi
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
if ${ac_cv_path_install+:} false; then :
$as_echo_n "(cached) " >&6
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
# Account for people who put trailing slashes in PATH elements.
case $as_dir/ in #((
./ | .// | /[cC]/* | \
/etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
/usr/ucb/* ) ;;
*)
# OSF1 and SCO ODT 3.0 have their own names for install.
# Don't use installbsd from OSF since it installs stuff as root
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
elif test $ac_prog = install &&
grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# program-specific install script used by HP pwplus--don't use.
:
else
rm -rf conftest.one conftest.two conftest.dir
echo one > conftest.one
echo two > conftest.two
mkdir conftest.dir
if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
test -s conftest.one && test -s conftest.two &&
test -s conftest.dir/conftest.one &&
test -s conftest.dir/conftest.two
then
ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
break 3
fi
fi
fi
done
done
;;
esac
done
IFS=$as_save_IFS
rm -rf conftest.one conftest.two conftest.dir
fi
if test "${ac_cv_path_install+set}" = set; then
INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. Don't cache a
# value for INSTALL within a source directory, because that will
# break other packages using the cache if that directory is
# removed, or if the value is a relative name.
INSTALL=$ac_install_sh
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
$as_echo "$INSTALL" >&6; }
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
# If $INSTALL is relative path to our fallback install-sh, then convert
# to an absolute path, as in some cases (e.g. Solaris VPATH build), libtool
# may try to use it from a changed working directory.
if test "$INSTALL" = "build/install-sh -c"; then
INSTALL="$abs_srcdir/$INSTALL"
fi
if test -z "$MKDIR"; then
MKDIR="$INSTALL -d"
fi
# ==== Libraries, for which we may have source to build ======================
APR_VER_REGEXES="1\.[3-9]\. 2\."
APR_WANTED_REGEXES="$APR_VER_REGEXES"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Apache Portable Runtime (APR) library configuration" >&5
$as_echo "$as_me: Apache Portable Runtime (APR) library configuration" >&6;}
apr_found="no"
if test "$ac_cv_emxos2" = "yes"; then
# Scripts don't pass test -x on OS/2
TEST_X="test -f"
else
TEST_X="test -x"
fi
acceptable_majors="2 1 0"
apr_temp_acceptable_apr_config=""
for apr_temp_major in $acceptable_majors
do
case $apr_temp_major in
0)
apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config"
;;
*)
apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config"
;;
esac
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for APR" >&5
$as_echo_n "checking for APR... " >&6; }
# Check whether --with-apr was given.
if test "${with_apr+set}" = set; then :
withval=$with_apr;
if test "$withval" = "no" || test "$withval" = "yes"; then
as_fn_error $? "--with-apr requires a directory or file to be provided" "$LINENO" 5
fi
for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
do
for lookdir in "$withval/bin" "$withval"
do
if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then
apr_found="yes"
apr_config="$lookdir/$apr_temp_apr_config_file"
break 2
fi
done
done
if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
apr_found="yes"
apr_config="$withval"
fi
if test "$apr_found" != "yes"; then
as_fn_error $? "the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file." "$LINENO" 5
fi
else
if test -d """"; then
apr_temp_abs_srcdir="`cd "" && pwd`"
apr_found="reconfig"
apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"""/include/apr_version.h\"`"
case $apr_bundled_major in
"")
as_fn_error $? "failed to find major version of bundled APR" "$LINENO" 5
;;
0)
apr_temp_apr_config_file="apr-config"
;;
*)
apr_temp_apr_config_file="apr-$apr_bundled_major-config"
;;
esac
if test -n """"; then
apr_config="""/$apr_temp_apr_config_file"
else
apr_config="""/$apr_temp_apr_config_file"
fi
fi
if test "$apr_found" = "no" && test -n "1" && test "1" = "1"; then
for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
do
if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then
apr_found="yes"
apr_config="$apr_temp_apr_config_file"
break
else
for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do
if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then
apr_found="yes"
apr_config="$lookdir/bin/$apr_temp_apr_config_file"
break 2
fi
done
fi
done
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apr_found" >&5
$as_echo "$apr_found" >&6; }
if test $apr_found = "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: APR not found" >&5
$as_echo "$as_me: WARNING: APR not found" >&2;}
echo "The Apache Portable Runtime (APR) library cannot be found."
echo "Please install APR on this system and configure Subversion"
echo "with the appropriate --with-apr option."
echo ""
echo "You probably need to do something similar with the Apache"
echo "Portable Runtime Utility (APRUTIL) library and then configure"
echo "Subversion with both the --with-apr and --with-apr-util options."
echo ""
as_fn_error $? "no suitable APR found" "$LINENO" 5
fi
if test $apr_found = "reconfig"; then
as_fn_error $? "Unexpected APR reconfig" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking APR version" >&5
$as_echo_n "checking APR version... " >&6; }
apr_version="`$apr_config --version`"
if test $? -ne 0; then
as_fn_error $? "apr-config --version failed" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apr_version" >&5
$as_echo "$apr_version" >&6; }
APR_WANTED_REGEX_MATCH=0
for apr_wanted_regex in $APR_WANTED_REGEXES; do
if test `expr $apr_version : $apr_wanted_regex` -ne 0; then
APR_WANTED_REGEX_MATCH=1
break
fi
done
if test $APR_WANTED_REGEX_MATCH -eq 0; then
echo "wanted regexes are $APR_WANTED_REGEXES"
as_fn_error $? "invalid apr version found" "$LINENO" 5
fi
CPPFLAGS="$CPPFLAGS `$apr_config --cppflags`"
if test $? -ne 0; then
as_fn_error $? "apr-config --cppflags failed" "$LINENO" 5
fi
CFLAGS="$CFLAGS `$apr_config --cflags`"
if test $? -ne 0; then
as_fn_error $? "apr-config --cflags failed" "$LINENO" 5
fi
apr_ldflags="`$apr_config --ldflags`"
if test $? -ne 0; then
as_fn_error $? "apr-config --ldflags failed" "$LINENO" 5
fi
LDFLAGS="$LDFLAGS `
input_flags="$apr_ldflags"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_APR_INCLUDES="`$apr_config --includes`"
if test $? -ne 0; then
as_fn_error $? "apr-config --includes failed" "$LINENO" 5
fi
if test "$enable_all_static" = "yes"; then
SVN_APR_LIBS="`$apr_config --link-ld --libs`"
if test $? -ne 0; then
as_fn_error $? "apr-config --link-ld --libs failed" "$LINENO" 5
fi
else
SVN_APR_LIBS="`$apr_config --link-ld`"
if test $? -ne 0; then
as_fn_error $? "apr-config --link-ld failed" "$LINENO" 5
fi
fi
SVN_APR_LIBS="`
input_flags="$SVN_APR_LIBS"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_APR_SHLIB_PATH_VAR="`$apr_config --shlib-path-var`"
if test $? -ne 0; then
as_fn_error $? "apr-config --shlib-path-var failed" "$LINENO" 5
fi
SVN_APR_CONFIG="$apr_config"
if test `expr $apr_version : 2` -ne 0; then
svn_lib_ver=2
apu_config=$apr_config
SVN_APRUTIL_CONFIG="$apu_config"
SVN_APR_MAJOR_VERSION=2
else
svn_lib_ver=0
APU_VER_REGEXES="1\.[3-9]\."
APRUTIL_WANTED_REGEXES="$APU_VER_REGEXES"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Apache Portable Runtime Utility (APRUTIL) library configuration" >&5
$as_echo "$as_me: Apache Portable Runtime Utility (APRUTIL) library configuration" >&6;}
apu_found="no"
if test "$ac_cv_emxos2" = "yes"; then
# Scripts don't pass test -x on OS/2
TEST_X="test -f"
else
TEST_X="test -x"
fi
acceptable_majors="1 0"
apu_temp_acceptable_apu_config=""
for apu_temp_major in $acceptable_majors
do
case $apu_temp_major in
0)
apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-config"
;;
*)
apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-$apu_temp_major-config"
;;
esac
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for APR-util" >&5
$as_echo_n "checking for APR-util... " >&6; }
# Check whether --with-apr-util was given.
if test "${with_apr_util+set}" = set; then :
withval=$with_apr_util;
if test "$withval" = "no" || test "$withval" = "yes"; then
as_fn_error $? "--with-apr-util requires a directory or file to be provided" "$LINENO" 5
fi
for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
do
for lookdir in "$withval/bin" "$withval"
do
if $TEST_X "$lookdir/$apu_temp_apu_config_file"; then
apu_found="yes"
apu_config="$lookdir/$apu_temp_apu_config_file"
break 2
fi
done
done
if test "$apu_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
apu_found="yes"
apu_config="$withval"
fi
if test "$apu_found" != "yes"; then
as_fn_error $? "the --with-apr-util parameter is incorrect. It must specify an install prefix, a build directory, or an apu-config file." "$LINENO" 5
fi
else
if test -d """"; then
apu_temp_abs_srcdir="`cd "" && pwd`"
apu_found="reconfig"
apu_bundled_major="`sed -n '/#define.*APU_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"""/include/apu_version.h\"`"
case $apu_bundled_major in
"")
as_fn_error $? "failed to find major version of bundled APU" "$LINENO" 5
;;
0)
apu_temp_apu_config_file="apu-config"
;;
*)
apu_temp_apu_config_file="apu-$apu_bundled_major-config"
;;
esac
if test -n """"; then
apu_config="""/$apu_temp_apu_config_file"
else
apu_config="""/$apu_temp_apu_config_file"
fi
fi
if test "$apu_found" = "no" && test -n "1" && test "1" = "1"; then
for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
do
if $apu_temp_apu_config_file --help > /dev/null 2>&1 ; then
apu_found="yes"
apu_config="$apu_temp_apu_config_file"
break
else
for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do
if $TEST_X "$lookdir/bin/$apu_temp_apu_config_file"; then
apu_found="yes"
apu_config="$lookdir/bin/$apu_temp_apu_config_file"
break 2
fi
done
fi
done
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_found" >&5
$as_echo "$apu_found" >&6; }
if test $apu_found = "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: APRUTIL not found" >&5
$as_echo "$as_me: WARNING: APRUTIL not found" >&2;}
echo "The Apache Portable Runtime Utility (APRUTIL) library cannot be found."
echo "Install APRUTIL on this system and configure Subversion with the"
echo " appropriate --with-apr-util option."
echo ""
as_fn_error $? "no suitable APRUTIL found" "$LINENO" 5
fi
if test $apu_found = "reconfig"; then
as_fn_error $? "Unexpected APRUTIL reconfig" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking APRUTIL version" >&5
$as_echo_n "checking APRUTIL version... " >&6; }
apu_version="`$apu_config --version`"
if test $? -ne 0; then
# This is a hack as suggested by Ben Collins-Sussman. It can be
# removed after apache 2.0.44 has been released. (The apu-config
# shipped in 2.0.43 contains a correct version number, but
# stupidly doesn't understand the --version switch.)
apu_version=`grep "APRUTIL_DOTTED_VERSION=" $(which $apu_config) | tr -d "APRUTIL_DOTTED_VERSION="| tr -d '"'`
#AC_MSG_ERROR([
# apu-config --version failed.
# Your apu-config doesn't support the --version switch, please upgrade
# to APR-UTIL more recent than 2002-Nov-05.])
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_version" >&5
$as_echo "$apu_version" >&6; }
APU_WANTED_REGEX_MATCH=0
for apu_wanted_regex in $APRUTIL_WANTED_REGEXES; do
if test `expr $apu_version : $apu_wanted_regex` -ne 0; then
APU_WANTED_REGEX_MATCH=1
break
fi
done
if test $APU_WANTED_REGEX_MATCH -eq 0; then
echo "wanted regexes are $APRUTIL_WANTED_REGEXES"
as_fn_error $? "invalid APRUTIL version found" "$LINENO" 5
fi
apu_ldflags="`$apu_config --ldflags`"
if test $? -ne 0; then
as_fn_error $? "apu-config --ldflags failed" "$LINENO" 5
fi
LDFLAGS="$LDFLAGS `
input_flags="$apu_ldflags"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_APRUTIL_INCLUDES="`$apu_config --includes`"
if test $? -ne 0; then
as_fn_error $? "apu-config --includes failed" "$LINENO" 5
fi
if test "$enable_all_static" = "yes"; then
SVN_APRUTIL_LIBS="`$apu_config --link-ld --libs`"
if test $? -ne 0; then
as_fn_error $? "apu-config --link-ld --libs failed" "$LINENO" 5
fi
else
SVN_APRUTIL_LIBS="`$apu_config --link-ld`"
if test $? -ne 0; then
as_fn_error $? "apu-config --link-ld failed" "$LINENO" 5
fi
fi
SVN_APRUTIL_LIBS="`
input_flags="$SVN_APRUTIL_LIBS"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_APRUTIL_CONFIG="$apu_config"
SVN_HAVE_OLD_EXPAT="`$apu_config --old-expat`"
if test "$SVN_HAVE_OLD_EXPAT" = "yes"; then
$as_echo "#define SVN_HAVE_OLD_EXPAT 1" >>confdefs.h
fi
SVN_APR_MAJOR_VERSION=1
fi
SVN_LT_SOVERSION="-version-info $svn_lib_ver"
cat >>confdefs.h <<_ACEOF
#define SVN_SOVERSION $svn_lib_ver
_ACEOF
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKG_CONFIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
$as_echo "$PKG_CONFIG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_header_stdc=yes
else
ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <string.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "memchr" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "free" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then :
:
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ctype.h>
#include <stdlib.h>
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
(('a' <= (c) && (c) <= 'i') \
|| ('j' <= (c) && (c) <= 'r') \
|| ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
int i;
for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i))
|| toupper (i) != TOUPPER (i))
return 2;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
else
ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then
$as_echo "#define STDC_HEADERS 1" >>confdefs.h
fi
# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
inttypes.h stdint.h unistd.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
serf_found=no
serf_required=no
serf_skip=no
serf_check_major="1"
serf_check_minor="3"
serf_check_patch="4"
serf_check_version="1.3.4"
# Check whether --with-serf was given.
if test "${with_serf+set}" = set; then :
withval=$with_serf;
if test "$withval" = "yes" ; then
serf_required=yes
elif test "$withval" = "no" ; then
serf_skip=yes
else
serf_required=yes
serf_prefix="$withval"
fi
fi
if test "$serf_skip" = "no" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: serf library configuration via pkg-config" >&5
$as_echo "$as_me: serf library configuration via pkg-config" >&6;}
if test -n "$PKG_CONFIG"; then
for serf_major in serf-2 serf-1; do
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $serf_major library" >&5
$as_echo_n "checking for $serf_major library... " >&6; }
if test -n "$serf_prefix" ; then
if test -e "$serf_prefix/$serf_major.pc" ; then
serf_pc_arg="$serf_prefix/$serf_major.pc"
elif test -e "$serf_prefix/lib/pkgconfig/$serf_major.pc" ; then
serf_pc_arg="$serf_prefix/lib/pkgconfig/$serf_major.pc"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
continue
fi
else
serf_pc_arg="$serf_major"
fi
if $PKG_CONFIG $serf_pc_arg --exists; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking serf library version" >&5
$as_echo_n "checking serf library version... " >&6; }
SERF_VERSION=`$PKG_CONFIG $serf_pc_arg --modversion`
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SERF_VERSION" >&5
$as_echo "$SERF_VERSION" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking serf version is suitable" >&5
$as_echo_n "checking serf version is suitable... " >&6; }
if $PKG_CONFIG $serf_pc_arg --atleast-version=$serf_check_version; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
serf_found=yes
SVN_SERF_INCLUDES=`$PKG_CONFIG $serf_pc_arg --cflags | $SED -e 's/-D[^ ]*//g'`
SVN_SERF_LIBS=`$PKG_CONFIG $serf_pc_arg --libs-only-l`
LDFLAGS="$LDFLAGS `$PKG_CONFIG $serf_pc_arg --libs | $SED -e 's/-l[^ ]*//g'`"
break
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Serf version too old: need $serf_check_version" >&5
$as_echo "$as_me: WARNING: Serf version too old: need $serf_check_version" >&2;}
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
done
fi
if test -n "$serf_prefix" && test "$serf_found" = "no" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: serf library configuration via prefix" >&5
$as_echo "$as_me: serf library configuration via prefix" >&6;}
serf_required=yes
for serf_major in serf-2 serf-1; do
if ! test -d $serf_prefix/include/$serf_major; then continue; fi
save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES $SVN_APRUTIL_INCLUDES -I$serf_prefix/include/$serf_major"
for ac_header in serf.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "serf.h" "ac_cv_header_serf_h" "$ac_includes_default"
if test "x$ac_cv_header_serf_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_SERF_H 1
_ACEOF
save_ldflags="$LDFLAGS"
LDFLAGS="$LDFLAGS `
input_flags="-L$serf_prefix/lib"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
as_ac_Lib=`$as_echo "ac_cv_lib_$serf_major''_serf_context_create" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for serf_context_create in -l$serf_major" >&5
$as_echo_n "checking for serf_context_create in -l$serf_major... " >&6; }
if eval \${$as_ac_Lib+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-l$serf_major $SVN_APRUTIL_LIBS $SVN_APR_LIBS -lz $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char serf_context_create ();
int
main ()
{
return serf_context_create ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
eval "$as_ac_Lib=yes"
else
eval "$as_ac_Lib=no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
eval ac_res=\$$as_ac_Lib
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include "serf.h"
int
main ()
{
#if ! SERF_VERSION_AT_LEAST($serf_check_major, $serf_check_minor, $serf_check_patch)
#error Serf version too old: need $serf_check_version
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
serf_found=yes
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Serf version too old: need $serf_check_version" >&5
$as_echo "$as_me: WARNING: Serf version too old: need $serf_check_version" >&2;}
serf_found=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
LDFLAGS="$save_ldflags"
fi
done
CPPFLAGS="$save_cppflags"
test $serf_found = yes && break
done
if test $serf_found = "yes"; then
SVN_SERF_INCLUDES="-I$serf_prefix/include/$serf_major"
if test -e "$serf_prefix/lib/lib$serf_major.la"; then
SVN_SERF_LIBS="$serf_prefix/lib/lib$serf_major.la"
else
SVN_SERF_LIBS="-l$serf_major"
LDFLAGS="$LDFLAGS `
input_flags="-L$serf_prefix/lib"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking was serf enabled" >&5
$as_echo_n "checking was serf enabled... " >&6; }
if test "$serf_found" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
echo ""
echo "An appropriate version of serf could not be found, so libsvn_ra_serf"
echo "will not be built. If you want to build libsvn_ra_serf, please"
echo "install serf $serf_check_version or newer."
echo ""
if test "$serf_required" = "yes"; then
as_fn_error $? "Serf was explicitly enabled but an appropriate version was not found." "$LINENO" 5
fi
fi
fi
svn_lib_serf=$serf_found
if test "$svn_lib_serf" = "yes"; then
$as_echo "#define SVN_HAVE_SERF 1" >>confdefs.h
fi
apr_memcache_found=no
# Check whether --with-apr_memcache was given.
if test "${with_apr_memcache+set}" = set; then :
withval=$with_apr_memcache;
if test "$withval" = "yes" ; then
as_fn_error $? "--with-apr_memcache requires an argument." "$LINENO" 5
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: looking for separate apr_memcache package" >&5
$as_echo "$as_me: looking for separate apr_memcache package" >&6;}
apr_memcache_prefix=$withval
save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES $SVN_APRUTIL_INCLUDES -I$apr_memcache_prefix/include/apr_memcache-0"
ac_fn_c_check_header_mongrel "$LINENO" "apr_memcache.h" "ac_cv_header_apr_memcache_h" "$ac_includes_default"
if test "x$ac_cv_header_apr_memcache_h" = xyes; then :
save_ldflags="$LDFLAGS"
LDFLAGS="$LDFLAGS -L$apr_memcache_prefix/lib"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for apr_memcache_create in -lapr_memcache" >&5
$as_echo_n "checking for apr_memcache_create in -lapr_memcache... " >&6; }
if ${ac_cv_lib_apr_memcache_apr_memcache_create+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lapr_memcache $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char apr_memcache_create ();
int
main ()
{
return apr_memcache_create ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_apr_memcache_apr_memcache_create=yes
else
ac_cv_lib_apr_memcache_apr_memcache_create=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_apr_memcache_apr_memcache_create" >&5
$as_echo "$ac_cv_lib_apr_memcache_apr_memcache_create" >&6; }
if test "x$ac_cv_lib_apr_memcache_apr_memcache_create" = xyes; then :
apr_memcache_found="standalone"
fi
LDFLAGS="$save_ldflags"
fi
CPPFLAGS="$save_cppflags"
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: looking for apr_memcache as part of apr-util" >&5
$as_echo "$as_me: looking for apr_memcache as part of apr-util" >&6;}
save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES $SVN_APRUTIL_INCLUDES"
ac_fn_c_check_header_mongrel "$LINENO" "apr_memcache.h" "ac_cv_header_apr_memcache_h" "$ac_includes_default"
if test "x$ac_cv_header_apr_memcache_h" = xyes; then :
save_ldflags="$LDFLAGS"
LDFLAGS="$LDFLAGS $SVN_APRUTIL_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for apr_memcache_create in -laprutil-1" >&5
$as_echo_n "checking for apr_memcache_create in -laprutil-1... " >&6; }
if ${ac_cv_lib_aprutil_1_apr_memcache_create+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-laprutil-1 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char apr_memcache_create ();
int
main ()
{
return apr_memcache_create ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_aprutil_1_apr_memcache_create=yes
else
ac_cv_lib_aprutil_1_apr_memcache_create=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_aprutil_1_apr_memcache_create" >&5
$as_echo "$ac_cv_lib_aprutil_1_apr_memcache_create" >&6; }
if test "x$ac_cv_lib_aprutil_1_apr_memcache_create" = xyes; then :
apr_memcache_found="aprutil"
fi
LDFLAGS="$save_ldflags"
fi
CPPFLAGS="$save_cppflags"
fi
if test $apr_memcache_found = "standalone"; then
SVN_APR_MEMCACHE_INCLUDES="-I$apr_memcache_prefix/include/apr_memcache-0"
SVN_APR_MEMCACHE_LIBS="$apr_memcache_prefix/lib/libapr_memcache.la"
svn_lib_apr_memcache=yes
elif test $apr_memcache_found = "aprutil"; then
SVN_APR_MEMCACHE_INCLUDES=""
SVN_APR_MEMCACHE_LIBS=""
svn_lib_apr_memcache=yes
elif test $apr_memcache_found = "reconfig"; then
svn_lib_apr_memcache=yes
else
svn_lib_apr_memcache=no
fi
if test "$svn_lib_apr_memcache" = "yes"; then
$as_echo "#define SVN_HAVE_MEMCACHE 1" >>confdefs.h
fi
HTTPD_WANTED_MMN="20051115"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Apache module support via DSO through APXS" >&5
$as_echo_n "checking for Apache module support via DSO through APXS... " >&6; }
# Check whether --with-apxs was given.
if test "${with_apxs+set}" = set; then :
withval=$with_apxs;
if test "$withval" = "yes"; then
APXS=apxs
else
APXS="$withval"
fi
APXS_EXPLICIT=1
fi
if test -z "$APXS"; then
for i in /usr/sbin /usr/local/apache/bin /usr/local/apache2/bin /usr/bin ; do
if test -f "$i/apxs2"; then
APXS="$i/apxs2"
break
fi
if test -f "$i/apxs"; then
APXS="$i/apxs"
break
fi
done
fi
if test -n "$APXS" && test "$APXS" != "no"; then
APXS_INCLUDE="`$APXS -q INCLUDEDIR`"
if test -r $APXS_INCLUDE/mod_dav.h; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found at $APXS" >&5
$as_echo "found at $APXS" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking httpd version" >&5
$as_echo_n "checking httpd version... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "$APXS_INCLUDE/ap_mmn.h"
#if AP_MODULE_MAGIC_AT_LEAST($HTTPD_WANTED_MMN,0)
VERSION_OKAY
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "VERSION_OKAY" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: recent enough" >&5
$as_echo "recent enough" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: apache too old: mmn must be at least $HTTPD_WANTED_MMN" >&5
$as_echo "apache too old: mmn must be at least $HTTPD_WANTED_MMN" >&6; }
if test "$APXS_EXPLICIT" != ""; then
as_fn_error $? "Apache APXS build explicitly requested, but apache version is too old" "$LINENO" 5
fi
APXS=""
fi
rm -f conftest*
elif test "$APXS_EXPLICIT" != ""; then
as_fn_error $? "no - APXS refers to an old version of Apache
Unable to locate $APXS_INCLUDE/mod_dav.h" "$LINENO" 5
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no - Unable to locate $APXS_INCLUDE/mod_dav.h" >&5
$as_echo "no - Unable to locate $APXS_INCLUDE/mod_dav.h" >&6; }
APXS=""
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
# check for some busted versions of mod_dav
# in particular 2.2.25, 2.4.5, and 2.4.6 had the following bugs which are
# troublesome for Subversion:
# PR 55304: https://issues.apache.org/bugzilla/show_bug.cgi?id=55304
# PR 55306: https://issues.apache.org/bugzilla/show_bug.cgi?id=55306
# PR 55397: https://issues.apache.org/bugzilla/show_bug.cgi?id=55397
if test -n "$APXS" && test "$APXS" != "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking mod_dav version" >&5
$as_echo_n "checking mod_dav version... " >&6; }
HTTPD_MAJOR=`$SED -ne '/^#define AP_SERVER_MAJORVERSION_NUMBER/p' "$APXS_INCLUDE/ap_release.h" | $SED -e 's/^.*NUMBER *//'`
HTTPD_MINOR=`$SED -ne '/^#define AP_SERVER_MINORVERSION_NUMBER/p' "$APXS_INCLUDE/ap_release.h" | $SED -e 's/^.*NUMBER *//'`
HTTPD_PATCH=`$SED -ne '/^#define AP_SERVER_PATCHLEVEL_NUMBER/p' "$APXS_INCLUDE/ap_release.h" | $SED -e 's/^.*NUMBER *//'`
HTTPD_VERSION="${HTTPD_MAJOR}.${HTTPD_MINOR}.${HTTPD_PATCH}"
case "$HTTPD_VERSION" in
2.2.25 | 2.4.[5-6])
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: broken" >&5
$as_echo "broken" >&6; }
as_fn_error $? "Apache httpd version $HTTPD_VERSION includes a broken mod_dav; use a newer version of httpd" "$LINENO" 5
;;
2.[0-9]*.[0-9]*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: acceptable" >&5
$as_echo "acceptable" >&6; }
;;
*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised" >&5
$as_echo "unrecognised" >&6; }
as_fn_error $? "Apache httpd version $HTTPD_VERSION not recognised" "$LINENO" 5
;;
esac
fi
if test -n "$APXS" && test "$APXS" != "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Apache version is compatible with APR version" >&5
$as_echo_n "checking whether Apache version is compatible with APR version... " >&6; }
apr_major_version="${apr_version%%.*}"
case "$apr_major_version" in
0)
apache_minor_version_wanted_regex="0"
;;
1)
apache_minor_version_wanted_regex="[1-5]"
;;
2)
apache_minor_version_wanted_regex="[3-5]"
;;
*)
as_fn_error $? "unknown APR version" "$LINENO" 5
;;
esac
case $HTTPD_MINOR in
$apache_minor_version_wanted_regex)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
;;
*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "Apache version $HTTPD_VERSION incompatible with APR version $apr_version" "$LINENO" 5
;;
esac
fi
# Check whether --with-apache-libexecdir was given.
if test "${with_apache_libexecdir+set}" = set; then :
withval=$with_apache_libexecdir; APACHE_LIBEXECDIR="$withval"
else
APACHE_LIBEXECDIR='no'
fi
INSTALL_APACHE_MODS=false
if test -n "$APXS" && test "$APXS" != "no"; then
APXS_CC="`$APXS -q CC`"
APACHE_INCLUDES="$APACHE_INCLUDES -I$APXS_INCLUDE"
if test "$APACHE_LIBEXECDIR" = 'no'; then
APACHE_LIBEXECDIR="$libexecdir"
elif test "$APACHE_LIBEXECDIR" = 'yes'; then
APACHE_LIBEXECDIR="`$APXS -q libexecdir`"
fi
for ac_header in unistd.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
if test "x$ac_cv_header_unistd_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_UNISTD_H 1
_ACEOF
for ac_func in getpid
do :
ac_fn_c_check_func "$LINENO" "getpid" "ac_cv_func_getpid"
if test "x$ac_cv_func_getpid" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_GETPID 1
_ACEOF
fi
done
fi
done
MMN_MAJOR=`$SED -ne '/^#define MODULE_MAGIC_NUMBER_MAJOR/p' "$APXS_INCLUDE/ap_mmn.h" | $SED -e 's/^.*MAJOR *//'`
MMN_MINOR=`$SED -ne '/^#define MODULE_MAGIC_NUMBER_MINOR/p' "$APXS_INCLUDE/ap_mmn.h" | $SED -e 's/^.*MINOR *//' | $SED -e 's/ .*//'`
if test "$MMN_MAJOR" = "20120211" && test "$MMN_MINOR" -lt "47" ; then
# This is httpd 2.4 and it doesn't appear to have the required
# API but the installation may have been patched.
# Check whether --enable-broken-httpd-auth was given.
if test "${enable_broken_httpd_auth+set}" = set; then :
enableval=$enable_broken_httpd_auth; broken_httpd_auth=$enableval
else
broken_httpd_auth=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ap_some_authn_required" >&5
$as_echo_n "checking for ap_some_authn_required... " >&6; }
old_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $APACHE_INCLUDES $SVN_APR_INCLUDES"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "http_request.h"
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "int.*\sap_some_authn_required\s*\(" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
working_auth=yes
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f conftest*
CPPFLAGS="$old_CPPFLAGS"
if test "$working_auth" = "yes" ; then
$as_echo "#define SVN_USE_FORCE_AUTHN 1" >>confdefs.h
elif test "$enable_broken_httpd_auth" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ==============================================" >&5
$as_echo "$as_me: WARNING: ==============================================" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Apache httpd $HTTPD_VERSION MMN $MMN_MAJOR.$MMN_MINOR" >&5
$as_echo "$as_me: WARNING: Apache httpd $HTTPD_VERSION MMN $MMN_MAJOR.$MMN_MINOR" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion will be vulnerable to CVE-2015-3184" >&5
$as_echo "$as_me: WARNING: Subversion will be vulnerable to CVE-2015-3184" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ==============================================" >&5
$as_echo "$as_me: WARNING: ==============================================" >&2;}
$as_echo "#define SVN_ALLOW_BROKEN_HTTPD_AUTH 1" >>confdefs.h
else
as_fn_error $? "Apache httpd $HTTPD_VERSION MMN $MMN_MAJOR.$MMN_MINOR has broken auth (CVE-2015-3184)" "$LINENO" 5
fi
fi
BUILD_APACHE_RULE=apache-mod
INSTALL_APACHE_RULE=install-mods-shared
INSTALL_APACHE_MODS=true
case $host in
*-*-cygwin*)
APACHE_LDFLAGS="-shrext .so"
;;
esac
elif test x"$APXS" != x"no"; then
echo "=================================================================="
echo "WARNING: skipping the build of mod_dav_svn"
echo " try using --with-apxs"
echo "=================================================================="
fi
# there aren't any flags that interest us ...
#if test -n "$APXS" && test "$APXS" != "no"; then
# CFLAGS="$CFLAGS `$APXS -q CFLAGS CFLAGS_SHLIB`"
#fi
if test -n "$APXS_CC" && test "$APXS_CC" != "$CC" ; then
echo "=================================================================="
echo "WARNING: You have chosen to compile Subversion with a different"
echo " compiler than the one used to compile Apache."
echo ""
echo " Current compiler: $CC"
echo " Apache's compiler: $APXS_CC"
echo ""
echo "This could cause some problems."
echo "=================================================================="
fi
SQLITE_MINIMUM_VER="3.7.12"
SQLITE_RECOMMENDED_VER="3.7.15.1"
SQLITE_URL="http://www.sqlite.org/sqlite-amalgamation-$(printf %d%02d%02d%02d $(echo ${SQLITE_RECOMMENDED_VER} | sed -e 's/\./ /g')).zip"
SQLITE_MINIMUM_VER="${SQLITE_MINIMUM_VER}"
SQLITE_RECOMMENDED_VER="${SQLITE_RECOMMENDED_VER}"
SQLITE_URL="${SQLITE_URL}"
SQLITE_PKGNAME="sqlite3"
version_string="$SQLITE_MINIMUM_VER"
major=`expr $version_string : '\([0-9]*\)'`
minor=`expr $version_string : '[0-9]*\.\([0-9]*\)'`
micro=`expr $version_string : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
if test -z "$micro"; then
micro=0
fi
sqlite_min_ver_num=`expr $major \* 1000000 \
\+ $minor \* 1000 \
\+ $micro`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite library" >&5
$as_echo "$as_me: checking sqlite library" >&6;}
# Check whether --with-sqlite was given.
if test "${with_sqlite+set}" = set; then :
withval=$with_sqlite;
if test "$withval" = "yes" ; then
as_fn_error $? "--with-sqlite requires an argument." "$LINENO" 5
else
sqlite_dir="$withval"
fi
if test -d $sqlite_dir; then
if test -z "$sqlite_dir"; then
sqlite_dir=""
sqlite_include="sqlite3.h"
else
sqlite_dir="$sqlite_dir"
sqlite_include="$sqlite_dir/include/sqlite3.h"
fi
save_CPPFLAGS="$CPPFLAGS"
save_LDFLAGS="$LDFLAGS"
if test ! -z "$sqlite_dir"; then
CPPFLAGS="$CPPFLAGS -I$sqlite_dir/include"
LDFLAGS="$LDFLAGS -L$sqlite_dir/lib"
fi
ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
if test "x$ac_cv_header_sqlite3_h" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite library version (via header)" >&5
$as_echo_n "checking sqlite library version (via header)... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "$sqlite_include"
#if SQLITE_VERSION_NUMBER >= $sqlite_min_ver_num
SQLITE_VERSION_OKAY
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "SQLITE_VERSION_OKAY" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5
$as_echo "okay" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_close in -lsqlite3" >&5
$as_echo_n "checking for sqlite3_close in -lsqlite3... " >&6; }
if ${ac_cv_lib_sqlite3_sqlite3_close+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_close ();
int
main ()
{
return sqlite3_close ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_sqlite3_sqlite3_close=yes
else
ac_cv_lib_sqlite3_sqlite3_close=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_close" >&5
$as_echo "$ac_cv_lib_sqlite3_sqlite3_close" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_close" = xyes; then :
svn_lib_sqlite="yes"
if test -z "$sqlite_dir" -o ! -d "$sqlite_dir"; then
SVN_SQLITE_LIBS="-lsqlite3"
else
SVN_SQLITE_INCLUDES="-I$sqlite_dir/include"
SVN_SQLITE_LIBS="`
input_flags="-L$sqlite_dir/lib -lsqlite3"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
fi
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported SQLite version" >&5
$as_echo "unsupported SQLite version" >&6; }
fi
rm -f conftest*
fi
CPPFLAGS="$save_CPPFLAGS"
LDFLAGS="$save_LDFLAGS"
else
sqlite_amalg="$sqlite_dir"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite amalgamation" >&5
$as_echo_n "checking sqlite amalgamation... " >&6; }
if test ! -e $sqlite_amalg; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite amalgamation file version" >&5
$as_echo_n "checking sqlite amalgamation file version... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "$sqlite_amalg"
#if SQLITE_VERSION_NUMBER >= $sqlite_min_ver_num
SQLITE_VERSION_OKAY
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "SQLITE_VERSION_OKAY" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: amalgamation found and is okay" >&5
$as_echo "amalgamation found and is okay" >&6; }
case $host_os in
beos* | mingw* | pw32* | cegcc* | cygwin*)
svn_sqlite_dso_ldflags=
;;
darwin*)
# if libdl is installed we need to link against it
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen="dlopen" svn_sqlite_dso_ldflags="-ldl"
else
svn_sqlite_dso_ldflags=
fi
;;
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = xyes; then :
svn_sqlite_dso_ldflags=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
if ${ac_cv_lib_dld_shl_load+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char shl_load ();
int
main ()
{
return shl_load ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_shl_load=yes
else
ac_cv_lib_dld_shl_load=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
svn_sqlite_dso_ldflags="-ldld"
else
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes; then :
svn_sqlite_dso_ldflags=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
svn_sqlite_dso_ldflags="-ldl"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
if ${ac_cv_lib_svld_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_svld_dlopen=yes
else
ac_cv_lib_svld_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
svn_sqlite_dso_ldflags="-lsvld"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
if ${ac_cv_lib_dld_dld_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dld_link ();
int
main ()
{
return dld_link ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_dld_link=yes
else
ac_cv_lib_dld_dld_link=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
svn_sqlite_dso_ldflags="-ldld"
fi
fi
fi
fi
fi
fi
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking additional libraries for sqlite" >&5
$as_echo_n "checking additional libraries for sqlite... " >&6; }
if test -n "$svn_sqlite_dso_ldflags"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${svn_sqlite_dso_ldflags}" >&5
$as_echo "${svn_sqlite_dso_ldflags}" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
fi
$as_echo "#define SVN_SQLITE_INLINE 1" >>confdefs.h
SVN_SQLITE_INCLUDES="-I`dirname $sqlite_amalg`"
if test -n "$svn_sqlite_dso_ldflags"; then
SVN_SQLITE_LIBS="$svn_sqlite_dso_ldflags -lpthread"
else
SVN_SQLITE_LIBS="-lpthread"
fi
svn_lib_sqlite="yes"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported amalgamation SQLite version" >&5
$as_echo "unsupported amalgamation SQLite version" >&6; }
fi
rm -f conftest*
fi
fi
if test -z "$svn_lib_sqlite"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no suitable sqlite found in $sqlite_dir" >&5
$as_echo "$as_me: WARNING: no suitable sqlite found in $sqlite_dir" >&2;}
echo ""
echo "An appropriate version of sqlite could not be found. We recommmend"
echo "${SQLITE_RECOMMENDED_VER}, but require at least ${SQLITE_MINIMUM_VER}."
echo "Please either install a newer sqlite on this system"
echo ""
echo "or"
echo ""
echo "get the sqlite ${SQLITE_RECOMMENDED_VER} amalgamation from:"
echo " ${SQLITE_URL}"
echo "unpack the archive using unzip and rename the resulting"
echo "directory to:"
echo "$abs_srcdir/sqlite-amalgamation"
if test x"$abs_srcdir" != x"$abs_builddir"; then
echo "or to:"
echo "$abs_builddir/sqlite-amalgamation"
fi
echo ""
as_fn_error $? "Subversion requires SQLite" "$LINENO" 5
fi
else
sqlite_amalg="$abs_srcdir/sqlite-amalgamation/sqlite3.c"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite amalgamation" >&5
$as_echo_n "checking sqlite amalgamation... " >&6; }
if test ! -e $sqlite_amalg; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite amalgamation file version" >&5
$as_echo_n "checking sqlite amalgamation file version... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "$sqlite_amalg"
#if SQLITE_VERSION_NUMBER >= $sqlite_min_ver_num
SQLITE_VERSION_OKAY
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "SQLITE_VERSION_OKAY" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: amalgamation found and is okay" >&5
$as_echo "amalgamation found and is okay" >&6; }
case $host_os in
beos* | mingw* | pw32* | cegcc* | cygwin*)
svn_sqlite_dso_ldflags=
;;
darwin*)
# if libdl is installed we need to link against it
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen="dlopen" svn_sqlite_dso_ldflags="-ldl"
else
svn_sqlite_dso_ldflags=
fi
;;
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = xyes; then :
svn_sqlite_dso_ldflags=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
if ${ac_cv_lib_dld_shl_load+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char shl_load ();
int
main ()
{
return shl_load ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_shl_load=yes
else
ac_cv_lib_dld_shl_load=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
svn_sqlite_dso_ldflags="-ldld"
else
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes; then :
svn_sqlite_dso_ldflags=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
svn_sqlite_dso_ldflags="-ldl"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
if ${ac_cv_lib_svld_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_svld_dlopen=yes
else
ac_cv_lib_svld_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
svn_sqlite_dso_ldflags="-lsvld"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
if ${ac_cv_lib_dld_dld_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dld_link ();
int
main ()
{
return dld_link ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_dld_link=yes
else
ac_cv_lib_dld_dld_link=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
svn_sqlite_dso_ldflags="-ldld"
fi
fi
fi
fi
fi
fi
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking additional libraries for sqlite" >&5
$as_echo_n "checking additional libraries for sqlite... " >&6; }
if test -n "$svn_sqlite_dso_ldflags"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${svn_sqlite_dso_ldflags}" >&5
$as_echo "${svn_sqlite_dso_ldflags}" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
fi
$as_echo "#define SVN_SQLITE_INLINE 1" >>confdefs.h
SVN_SQLITE_INCLUDES="-I`dirname $sqlite_amalg`"
if test -n "$svn_sqlite_dso_ldflags"; then
SVN_SQLITE_LIBS="$svn_sqlite_dso_ldflags -lpthread"
else
SVN_SQLITE_LIBS="-lpthread"
fi
svn_lib_sqlite="yes"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported amalgamation SQLite version" >&5
$as_echo "unsupported amalgamation SQLite version" >&6; }
fi
rm -f conftest*
fi
if test -z "$svn_lib_sqlite"; then
sqlite_amalg="$abs_builddir/sqlite-amalgamation/sqlite3.c"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite amalgamation" >&5
$as_echo_n "checking sqlite amalgamation... " >&6; }
if test ! -e $sqlite_amalg; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite amalgamation file version" >&5
$as_echo_n "checking sqlite amalgamation file version... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "$sqlite_amalg"
#if SQLITE_VERSION_NUMBER >= $sqlite_min_ver_num
SQLITE_VERSION_OKAY
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "SQLITE_VERSION_OKAY" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: amalgamation found and is okay" >&5
$as_echo "amalgamation found and is okay" >&6; }
case $host_os in
beos* | mingw* | pw32* | cegcc* | cygwin*)
svn_sqlite_dso_ldflags=
;;
darwin*)
# if libdl is installed we need to link against it
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen="dlopen" svn_sqlite_dso_ldflags="-ldl"
else
svn_sqlite_dso_ldflags=
fi
;;
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = xyes; then :
svn_sqlite_dso_ldflags=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
if ${ac_cv_lib_dld_shl_load+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char shl_load ();
int
main ()
{
return shl_load ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_shl_load=yes
else
ac_cv_lib_dld_shl_load=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
svn_sqlite_dso_ldflags="-ldld"
else
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes; then :
svn_sqlite_dso_ldflags=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
svn_sqlite_dso_ldflags="-ldl"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
if ${ac_cv_lib_svld_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_svld_dlopen=yes
else
ac_cv_lib_svld_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
svn_sqlite_dso_ldflags="-lsvld"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
if ${ac_cv_lib_dld_dld_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dld_link ();
int
main ()
{
return dld_link ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_dld_link=yes
else
ac_cv_lib_dld_dld_link=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
svn_sqlite_dso_ldflags="-ldld"
fi
fi
fi
fi
fi
fi
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking additional libraries for sqlite" >&5
$as_echo_n "checking additional libraries for sqlite... " >&6; }
if test -n "$svn_sqlite_dso_ldflags"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${svn_sqlite_dso_ldflags}" >&5
$as_echo "${svn_sqlite_dso_ldflags}" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
fi
$as_echo "#define SVN_SQLITE_INLINE 1" >>confdefs.h
SVN_SQLITE_INCLUDES="-I`dirname $sqlite_amalg`"
if test -n "$svn_sqlite_dso_ldflags"; then
SVN_SQLITE_LIBS="$svn_sqlite_dso_ldflags -lpthread"
else
SVN_SQLITE_LIBS="-lpthread"
fi
svn_lib_sqlite="yes"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported amalgamation SQLite version" >&5
$as_echo "unsupported amalgamation SQLite version" >&6; }
fi
rm -f conftest*
fi
fi
if test -z "$svn_lib_sqlite"; then
if test -z ""; then
sqlite_dir=""
sqlite_include="sqlite3.h"
else
sqlite_dir=""
sqlite_include="/include/sqlite3.h"
fi
save_CPPFLAGS="$CPPFLAGS"
save_LDFLAGS="$LDFLAGS"
if test ! -z ""; then
CPPFLAGS="$CPPFLAGS -I$sqlite_dir/include"
LDFLAGS="$LDFLAGS -L$sqlite_dir/lib"
fi
ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
if test "x$ac_cv_header_sqlite3_h" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite library version (via header)" >&5
$as_echo_n "checking sqlite library version (via header)... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include "$sqlite_include"
#if SQLITE_VERSION_NUMBER >= $sqlite_min_ver_num
SQLITE_VERSION_OKAY
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "SQLITE_VERSION_OKAY" >/dev/null 2>&1; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5
$as_echo "okay" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_close in -lsqlite3" >&5
$as_echo_n "checking for sqlite3_close in -lsqlite3... " >&6; }
if ${ac_cv_lib_sqlite3_sqlite3_close+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_close ();
int
main ()
{
return sqlite3_close ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_sqlite3_sqlite3_close=yes
else
ac_cv_lib_sqlite3_sqlite3_close=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_close" >&5
$as_echo "$ac_cv_lib_sqlite3_sqlite3_close" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_close" = xyes; then :
svn_lib_sqlite="yes"
if test -z "$sqlite_dir" -o ! -d "$sqlite_dir"; then
SVN_SQLITE_LIBS="-lsqlite3"
else
SVN_SQLITE_INCLUDES="-I$sqlite_dir/include"
SVN_SQLITE_LIBS="`
input_flags="-L$sqlite_dir/lib -lsqlite3"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
fi
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported SQLite version" >&5
$as_echo "unsupported SQLite version" >&6; }
fi
rm -f conftest*
fi
CPPFLAGS="$save_CPPFLAGS"
LDFLAGS="$save_LDFLAGS"
fi
if test -z "$svn_lib_sqlite"; then
if test -n "$PKG_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sqlite library version (via pkg-config)" >&5
$as_echo_n "checking sqlite library version (via pkg-config)... " >&6; }
sqlite_version=`$PKG_CONFIG $SQLITE_PKGNAME --modversion --silence-errors`
if test -n "$sqlite_version"; then
version_string="$sqlite_version"
major=`expr $version_string : '\([0-9]*\)'`
minor=`expr $version_string : '[0-9]*\.\([0-9]*\)'`
micro=`expr $version_string : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
if test -z "$micro"; then
micro=0
fi
sqlite_ver_num=`expr $major \* 1000000 \
\+ $minor \* 1000 \
\+ $micro`
if test "$sqlite_ver_num" -ge "$sqlite_min_ver_num"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sqlite_version" >&5
$as_echo "$sqlite_version" >&6; }
svn_lib_sqlite="yes"
SVN_SQLITE_INCLUDES="`$PKG_CONFIG $SQLITE_PKGNAME --cflags`"
SVN_SQLITE_LIBS="`$PKG_CONFIG $SQLITE_PKGNAME --libs`"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none or unsupported $sqlite_version" >&5
$as_echo "none or unsupported $sqlite_version" >&6; }
fi
fi
fi
if test -z "$svn_lib_sqlite"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$svn_lib_sqlite"; then
echo ""
echo "An appropriate version of sqlite could not be found. We recommmend"
echo "${SQLITE_RECOMMENDED_VER}, but require at least ${SQLITE_MINIMUM_VER}."
echo "Please either install a newer sqlite on this system"
echo ""
echo "or"
echo ""
echo "get the sqlite ${SQLITE_RECOMMENDED_VER} amalgamation from:"
echo " ${SQLITE_URL}"
echo "unpack the archive using unzip and rename the resulting"
echo "directory to:"
echo "$abs_srcdir/sqlite-amalgamation"
if test x"$abs_srcdir" != x"$abs_builddir"; then
echo "or to:"
echo "$abs_builddir/sqlite-amalgamation"
fi
echo ""
as_fn_error $? "Subversion requires SQLite" "$LINENO" 5
fi
fi
# Check whether --enable-sqlite-compatibility-version was given.
if test "${enable_sqlite_compatibility_version+set}" = set; then :
enableval=$enable_sqlite_compatibility_version; sqlite_compat_ver=$enableval
else
sqlite_compat_ver=no
fi
if test -n "$sqlite_compat_ver" && test "$sqlite_compat_ver" != no; then
version_string="$sqlite_compat_ver"
major=`expr $version_string : '\([0-9]*\)'`
minor=`expr $version_string : '[0-9]*\.\([0-9]*\)'`
micro=`expr $version_string : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
if test -z "$micro"; then
micro=0
fi
sqlite_compat_ver_num=`expr $major \* 1000000 \
\+ $minor \* 1000 \
\+ $micro`
CFLAGS="-DSVN_SQLITE_MIN_VERSION='\"$sqlite_compat_ver\"' $CFLAGS"
CFLAGS="-DSVN_SQLITE_MIN_VERSION_NUMBER=$sqlite_compat_ver_num $CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler provides atomic builtins" >&5
$as_echo_n "checking whether the compiler provides atomic builtins... " >&6; }
if ${svn_cv_atomic_builtins+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
svn_cv_atomic_builtins=no
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main()
{
unsigned long long val = 1010, tmp, *mem = &val;
if (__sync_fetch_and_add(&val, 1010) != 1010 || val != 2020)
return 1;
tmp = val;
if (__sync_fetch_and_sub(mem, 1010) != tmp || val != 1010)
return 1;
if (__sync_sub_and_fetch(&val, 1010) != 0 || val != 0)
return 1;
tmp = 3030;
if (__sync_val_compare_and_swap(mem, 0, tmp) != 0 || val != tmp)
return 1;
if (__sync_lock_test_and_set(&val, 4040) != 3030)
return 1;
mem = &tmp;
if (__sync_val_compare_and_swap(&mem, &tmp, &val) != &tmp)
return 1;
__sync_synchronize();
if (mem != &val)
return 1;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
svn_cv_atomic_builtins=yes
else
svn_cv_atomic_builtins=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_atomic_builtins" >&5
$as_echo "$svn_cv_atomic_builtins" >&6; }
if test "$svn_cv_atomic_builtins" = "yes"; then
$as_echo "#define SVN_HAS_ATOMIC_BUILTINS 1" >>confdefs.h
fi
if test "${bindir}" = '${exec_prefix}/bin'; then
if test "${exec_prefix}" = "NONE"; then
if test "${prefix}" = "NONE"; then
SVN_BINDIR="${ac_default_prefix}/bin"
else
SVN_BINDIR="${prefix}/bin"
fi
else
SVN_BINDIR="${exec_prefix}/bin"
fi
else
SVN_BINDIR="${bindir}"
fi
SVN_BINDIR="`eval echo ${SVN_BINDIR}`"
cat >>confdefs.h <<_ACEOF
#define SVN_BINDIR "${SVN_BINDIR}"
_ACEOF
localedir='${datadir}/locale'
-if test "${datadir}" = '${prefix}/share' && test "${prefix}" = "NONE"; then
+if test "${prefix}" = "NONE" \
+ && ( test "${datadir}" = '${prefix}/share' \
+ || ( test "${datadir}" = '${datarootdir}' \
+ && test "${datarootdir}" = '${prefix}/share' ) ); then
exp_localedir='${ac_default_prefix}/share/locale'
else
exp_localedir=$localedir
fi
svn_last=
svn_cur=""${exp_localedir}""
while test "x${svn_cur}" != "x${svn_last}";
do
svn_last="${svn_cur}"
svn_cur=`eval "echo ${svn_cur}"`
done
svn_localedir="${svn_cur}"
cat >>confdefs.h <<_ACEOF
#define SVN_LOCALE_DIR "${svn_localedir}"
_ACEOF
{ $as_echo "$as_me:${as_lineno-$LINENO}: configuring libtool now" >&5
$as_echo "$as_me: configuring libtool now" >&6;}
case `pwd` in
*\ * | *\ *)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
esac
macro_version='2.4.6'
macro_revision='2.4.6'
ltmain=$ac_aux_dir/ltmain.sh
# Backslashify metacharacters that are still active within
# double-quoted strings.
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
# Same as above, but do not quote variable references.
double_quote_subst='s/\(["`\\]\)/\\\1/g'
# Sed substitution to delay expansion of an escaped shell variable in a
# double_quote_subst'ed string.
delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
# Sed substitution to delay expansion of an escaped single quote.
delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
# Sed substitution to avoid accidental globbing in evaled expressions
no_glob_subst='s/\*/\\\*/g'
ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
$as_echo_n "checking how to print strings... " >&6; }
# Test print first, because it will be a builtin if present.
if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
ECHO='print -r --'
elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
ECHO='printf %s\n'
else
# Use this function as a fallback that always works.
func_fallback_echo ()
{
eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
ECHO='func_fallback_echo'
fi
# func_echo_all arg...
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
$ECHO ""
}
case $ECHO in
printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
$as_echo "printf" >&6; } ;;
print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
$as_echo "print -r" >&6; } ;;
*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
$as_echo "cat" >&6; } ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if ${ac_cv_path_SED+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
for ac_i in 1 2 3 4 5 6 7; do
ac_script="$ac_script$as_nl$ac_script"
done
echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
{ ac_script=; unset ac_script;}
if test -z "$SED"; then
ac_path_SED_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in sed gsed; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
# Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo '' >> "conftest.nl"
"$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_SED_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_SED="$ac_path_SED"
ac_path_SED_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_SED_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_SED"; then
as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
fi
else
ac_cv_path_SED=$SED
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
SED="$ac_cv_path_SED"
rm -f conftest.sed
test -z "$SED" && SED=sed
Xsed="$SED -e 1s/^X//"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
$as_echo_n "checking for fgrep... " >&6; }
if ${ac_cv_path_FGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
then ac_cv_path_FGREP="$GREP -F"
else
if test -z "$FGREP"; then
ac_path_FGREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in fgrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_FGREP" || continue
# Check for GNU ac_path_FGREP and select it if it is found.
# Check for GNU $ac_path_FGREP
case `"$ac_path_FGREP" --version 2>&1` in
*GNU*)
ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'FGREP' >> "conftest.nl"
"$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_FGREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_FGREP="$ac_path_FGREP"
ac_path_FGREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_FGREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_FGREP"; then
as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_FGREP=$FGREP
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
$as_echo "$ac_cv_path_FGREP" >&6; }
FGREP="$ac_cv_path_FGREP"
test -z "$GREP" && GREP=grep
# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
else
with_gnu_ld=no
fi
ac_prog=ld
if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
esac
case $ac_prog in
# Accept absolute paths.
[\\/]* | ?:[\\/]*)
re_direlt='/[^/][^/]*/\.\./'
# Canonicalize the pathname of ld
ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
done
test -z "$LD" && LD=$ac_prog
;;
"")
# If it fails, then pretend we aren't using GCC.
ac_prog=ld
;;
*)
# If it is relative, then search for the first ld in PATH.
with_gnu_ld=unknown
;;
esac
elif test yes = "$with_gnu_ld"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if ${lt_cv_path_LD+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$LD"; then
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
lt_cv_path_LD=$ac_dir/$ac_prog
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
test no != "$with_gnu_ld" && break
;;
*)
test yes != "$with_gnu_ld" && break
;;
esac
fi
done
IFS=$lt_save_ifs
else
lt_cv_path_LD=$LD # Let the user override the test with a path.
fi
fi
LD=$lt_cv_path_LD
if test -n "$LD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${lt_cv_prog_gnu_ld+:} false; then :
$as_echo_n "(cached) " >&6
else
# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
lt_cv_prog_gnu_ld=yes
;;
*)
lt_cv_prog_gnu_ld=no
;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
if ${lt_cv_path_NM+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$NM"; then
# Let the user override the test.
lt_cv_path_NM=$NM
else
lt_nm_to_check=${ac_tool_prefix}nm
if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
lt_nm_to_check="$lt_nm_to_check nm"
fi
for lt_tmp_nm in $lt_nm_to_check; do
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
tmp_nm=$ac_dir/$lt_tmp_nm
if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
# Check to see if the nm accepts a BSD-compat flag.
# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
# nm: unknown option "B" ignored
# Tru64's nm complains that /dev/null is an invalid object file
# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
case $build_os in
mingw*) lt_bad_file=conftest.nm/nofile ;;
*) lt_bad_file=/dev/null ;;
esac
case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
*$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break 2
;;
*)
case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break 2
;;
*)
lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
continue # so that we can try to find one that supports BSD flags
;;
esac
;;
esac
fi
done
IFS=$lt_save_ifs
done
: ${lt_cv_path_NM=no}
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
$as_echo "$lt_cv_path_NM" >&6; }
if test no != "$lt_cv_path_NM"; then
NM=$lt_cv_path_NM
else
# Didn't find any BSD compatible name lister, look for dumpbin.
if test -n "$DUMPBIN"; then :
# Let the user override the test.
else
if test -n "$ac_tool_prefix"; then
for ac_prog in dumpbin "link -dump"
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DUMPBIN+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DUMPBIN"; then
ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
DUMPBIN=$ac_cv_prog_DUMPBIN
if test -n "$DUMPBIN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
$as_echo "$DUMPBIN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$DUMPBIN" && break
done
fi
if test -z "$DUMPBIN"; then
ac_ct_DUMPBIN=$DUMPBIN
for ac_prog in dumpbin "link -dump"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_DUMPBIN"; then
ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
if test -n "$ac_ct_DUMPBIN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
$as_echo "$ac_ct_DUMPBIN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$ac_ct_DUMPBIN" && break
done
if test "x$ac_ct_DUMPBIN" = x; then
DUMPBIN=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DUMPBIN=$ac_ct_DUMPBIN
fi
fi
case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
*COFF*)
DUMPBIN="$DUMPBIN -symbols -headers"
;;
*)
DUMPBIN=:
;;
esac
fi
if test : != "$DUMPBIN"; then
NM=$DUMPBIN
fi
fi
test -z "$NM" && NM=nm
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
$as_echo_n "checking the name lister ($NM) interface... " >&6; }
if ${lt_cv_nm_interface+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
(eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err)
cat conftest.err >&5
(eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
cat conftest.err >&5
(eval echo "\"\$as_me:$LINENO: output\"" >&5)
cat conftest.out >&5
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
$as_echo "$lt_cv_nm_interface" >&6; }
# find the maximum length of command line arguments
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
$as_echo_n "checking the maximum length of command line arguments... " >&6; }
if ${lt_cv_sys_max_cmd_len+:} false; then :
$as_echo_n "(cached) " >&6
else
i=0
teststring=ABCD
case $build_os in
msdosdjgpp*)
# On DJGPP, this test can blow up pretty badly due to problems in libc
# (any single argument exceeding 2000 bytes causes a buffer overrun
# during glob expansion). Even if it were fixed, the result of this
# check would be larger than it should be.
lt_cv_sys_max_cmd_len=12288; # 12K is about right
;;
gnu*)
# Under GNU Hurd, this test is not required because there is
# no limit to the length of command line arguments.
# Libtool will interpret -1 as no limit whatsoever
lt_cv_sys_max_cmd_len=-1;
;;
cygwin* | mingw* | cegcc*)
# On Win9x/ME, this test blows up -- it succeeds, but takes
# about 5 minutes as the teststring grows exponentially.
# Worse, since 9x/ME are not pre-emptively multitasking,
# you end up with a "frozen" computer, even though with patience
# the test eventually succeeds (with a max line length of 256k).
# Instead, let's just punt: use the minimum linelength reported by
# all of the supported platforms: 8192 (on NT/2K/XP).
lt_cv_sys_max_cmd_len=8192;
;;
mint*)
# On MiNT this can take a long time and run out of memory.
lt_cv_sys_max_cmd_len=8192;
;;
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
lt_cv_sys_max_cmd_len=8192;
;;
bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
elif test -x /usr/sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
else
lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
fi
# And add a safety zone
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
;;
interix*)
# We know the value 262144 and hardcode it with a safety zone (like BSD)
lt_cv_sys_max_cmd_len=196608
;;
os2*)
# The test takes a long time on OS/2.
lt_cv_sys_max_cmd_len=8192
;;
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
# nice to cause kernel panics so lets avoid the loop below.
# First set a reasonable default.
lt_cv_sys_max_cmd_len=16384
#
if test -x /sbin/sysconfig; then
case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
*1*) lt_cv_sys_max_cmd_len=-1 ;;
esac
fi
;;
sco3.2v5*)
lt_cv_sys_max_cmd_len=102400
;;
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
;;
*)
lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
if test -n "$lt_cv_sys_max_cmd_len" && \
test undefined != "$lt_cv_sys_max_cmd_len"; then
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
else
# Make teststring a little bigger before we do anything with it.
# a 1K string should be a reasonable start.
for i in 1 2 3 4 5 6 7 8; do
teststring=$teststring$teststring
done
SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
while { test X`env echo "$teststring$teststring" 2>/dev/null` \
= "X$teststring$teststring"; } >/dev/null 2>&1 &&
test 17 != "$i" # 1/2 MB should be enough
do
i=`expr $i + 1`
teststring=$teststring$teststring
done
# Only check the string length outside the loop.
lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
teststring=
# Add a significant safety factor because C++ compilers can tack on
# massive amounts of additional arguments before passing them to the
# linker. It appears as though 1/2 is a usable value.
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
fi
;;
esac
fi
if test -n "$lt_cv_sys_max_cmd_len"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
fi
max_cmd_len=$lt_cv_sys_max_cmd_len
: ${CP="cp -f"}
: ${MV="mv -f"}
: ${RM="rm -f"}
if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
lt_unset=unset
else
lt_unset=false
fi
# test EBCDIC or ASCII
case `echo X|tr X '\101'` in
A) # ASCII based system
# \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
lt_SP2NL='tr \040 \012'
lt_NL2SP='tr \015\012 \040\040'
;;
*) # EBCDIC based system
lt_SP2NL='tr \100 \n'
lt_NL2SP='tr \r\n \100\100'
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
if ${lt_cv_to_host_file_cmd+:} false; then :
$as_echo_n "(cached) " >&6
else
case $host in
*-*-mingw* )
case $build in
*-*-mingw* ) # actually msys
lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
;;
*-*-cygwin* )
lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
;;
* ) # otherwise, assume *nix
lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
;;
esac
;;
*-*-cygwin* )
case $build in
*-*-mingw* ) # actually msys
lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
;;
*-*-cygwin* )
lt_cv_to_host_file_cmd=func_convert_file_noop
;;
* ) # otherwise, assume *nix
lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
;;
esac
;;
* ) # unhandled hosts (and "normal" native builds)
lt_cv_to_host_file_cmd=func_convert_file_noop
;;
esac
fi
to_host_file_cmd=$lt_cv_to_host_file_cmd
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
$as_echo "$lt_cv_to_host_file_cmd" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
if ${lt_cv_to_tool_file_cmd+:} false; then :
$as_echo_n "(cached) " >&6
else
#assume ordinary cross tools, or native build.
lt_cv_to_tool_file_cmd=func_convert_file_noop
case $host in
*-*-mingw* )
case $build in
*-*-mingw* ) # actually msys
lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
;;
esac
;;
esac
fi
to_tool_file_cmd=$lt_cv_to_tool_file_cmd
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
$as_echo_n "checking for $LD option to reload object files... " >&6; }
if ${lt_cv_ld_reload_flag+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_ld_reload_flag='-r'
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
$as_echo "$lt_cv_ld_reload_flag" >&6; }
reload_flag=$lt_cv_ld_reload_flag
case $reload_flag in
"" | " "*) ;;
*) reload_flag=" $reload_flag" ;;
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
if test yes != "$GCC"; then
reload_cmds=false
fi
;;
darwin*)
if test yes = "$GCC"; then
reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
else
reload_cmds='$LD$reload_flag -o $output$reload_objs'
fi
;;
esac
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OBJDUMP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJDUMP"; then
ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
$as_echo "$OBJDUMP" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_OBJDUMP"; then
ac_ct_OBJDUMP=$OBJDUMP
# Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJDUMP"; then
ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OBJDUMP="objdump"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
$as_echo "$ac_ct_OBJDUMP" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_OBJDUMP" = x; then
OBJDUMP="false"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OBJDUMP=$ac_ct_OBJDUMP
fi
else
OBJDUMP="$ac_cv_prog_OBJDUMP"
fi
test -z "$OBJDUMP" && OBJDUMP=objdump
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
$as_echo_n "checking how to recognize dependent libraries... " >&6; }
if ${lt_cv_deplibs_check_method+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_file_magic_cmd='$MAGIC_CMD'
lt_cv_file_magic_test_file=
lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
# interlibrary dependencies.
# 'none' -- dependencies not supported.
# 'unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
# that responds to the $file_magic_cmd with a given extended regex.
# If you have 'file' or equivalent on your system and you're not sure
# whether 'pass_all' will *always* work, you probably want this one.
case $host_os in
aix[4-9]*)
lt_cv_deplibs_check_method=pass_all
;;
beos*)
lt_cv_deplibs_check_method=pass_all
;;
bsdi[45]*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
lt_cv_file_magic_cmd='/usr/bin/file -L'
lt_cv_file_magic_test_file=/shlib/libc.so
;;
cygwin*)
# func_win32_libid is a shell function defined in ltmain.sh
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
;;
mingw* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
if ( file / ) >/dev/null 2>&1; then
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
else
# Keep this pattern in sync with the one in func_win32_libid.
lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
lt_cv_file_magic_cmd='$OBJDUMP -f'
fi
;;
cegcc*)
# use the weaker test based on 'objdump'. See mingw*.
lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
lt_cv_file_magic_cmd='$OBJDUMP -f'
;;
darwin* | rhapsody*)
lt_cv_deplibs_check_method=pass_all
;;
freebsd* | dragonfly*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
else
lt_cv_deplibs_check_method=pass_all
fi
;;
haiku*)
lt_cv_deplibs_check_method=pass_all
;;
hpux10.20* | hpux11*)
lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
;;
hppa*64*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
;;
*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
lt_cv_file_magic_test_file=/usr/lib/libc.sl
;;
esac
;;
interix[3-9]*)
# PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
;;
irix5* | irix6* | nonstopux*)
case $LD in
*-32|*"-32 ") libmagic=32-bit;;
*-n32|*"-n32 ") libmagic=N32;;
*-64|*"-64 ") libmagic=64-bit;;
*) libmagic=never-match;;
esac
lt_cv_deplibs_check_method=pass_all
;;
# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
fi
;;
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
*nto* | *qnx*)
lt_cv_deplibs_check_method=pass_all
;;
openbsd* | bitrig*)
if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
fi
;;
osf3* | osf4* | osf5*)
lt_cv_deplibs_check_method=pass_all
;;
rdos*)
lt_cv_deplibs_check_method=pass_all
;;
solaris*)
lt_cv_deplibs_check_method=pass_all
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
lt_cv_deplibs_check_method=pass_all
;;
sysv4 | sysv4.3*)
case $host_vendor in
motorola)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
;;
ncr)
lt_cv_deplibs_check_method=pass_all
;;
sequent)
lt_cv_file_magic_cmd='/bin/file'
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
;;
sni)
lt_cv_file_magic_cmd='/bin/file'
lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
lt_cv_file_magic_test_file=/lib/libc.so
;;
siemens)
lt_cv_deplibs_check_method=pass_all
;;
pc)
lt_cv_deplibs_check_method=pass_all
;;
esac
;;
tpf*)
lt_cv_deplibs_check_method=pass_all
;;
os2*)
lt_cv_deplibs_check_method=pass_all
;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
$as_echo "$lt_cv_deplibs_check_method" >&6; }
file_magic_glob=
want_nocaseglob=no
if test "$build" = "$host"; then
case $host_os in
mingw* | pw32*)
if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
want_nocaseglob=yes
else
file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
fi
;;
esac
fi
file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DLLTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DLLTOOL"; then
ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
DLLTOOL=$ac_cv_prog_DLLTOOL
if test -n "$DLLTOOL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
$as_echo "$DLLTOOL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_DLLTOOL"; then
ac_ct_DLLTOOL=$DLLTOOL
# Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_DLLTOOL"; then
ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DLLTOOL="dlltool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
if test -n "$ac_ct_DLLTOOL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
$as_echo "$ac_ct_DLLTOOL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_DLLTOOL" = x; then
DLLTOOL="false"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DLLTOOL=$ac_ct_DLLTOOL
fi
else
DLLTOOL="$ac_cv_prog_DLLTOOL"
fi
test -z "$DLLTOOL" && DLLTOOL=dlltool
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_sharedlib_from_linklib_cmd='unknown'
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
# two different shell functions defined in ltmain.sh;
# decide which one to use based on capabilities of $DLLTOOL
case `$DLLTOOL --help 2>&1` in
*--identify-strict*)
lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
;;
*)
lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
;;
esac
;;
*)
# fallback: assume linklib IS sharedlib
lt_cv_sharedlib_from_linklib_cmd=$ECHO
;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
if test -n "$ac_tool_prefix"; then
for ac_prog in ar
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
$as_echo "$AR" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$AR" && break
done
fi
if test -z "$AR"; then
ac_ct_AR=$AR
for ac_prog in ar
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_AR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_AR"; then
ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AR="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
$as_echo "$ac_ct_AR" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$ac_ct_AR" && break
done
if test "x$ac_ct_AR" = x; then
AR="false"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
AR=$ac_ct_AR
fi
fi
: ${AR=ar}
: ${AR_FLAGS=cru}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
$as_echo_n "checking for archiver @FILE support... " >&6; }
if ${lt_cv_ar_at_file+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_ar_at_file=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
echo conftest.$ac_objext > conftest.lst
lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
(eval $lt_ar_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if test 0 -eq "$ac_status"; then
# Ensure the archiver fails upon bogus file names.
rm -f conftest.$ac_objext libconftest.a
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
(eval $lt_ar_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if test 0 -ne "$ac_status"; then
lt_cv_ar_at_file=@
fi
fi
rm -f conftest.* libconftest.a
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
$as_echo "$lt_cv_ar_at_file" >&6; }
if test no = "$lt_cv_ar_at_file"; then
archiver_list_spec=
else
archiver_list_spec=$lt_cv_ar_at_file
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$STRIP"; then
ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
$as_echo "$STRIP" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_STRIP"; then
ac_ct_STRIP=$STRIP
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_STRIP"; then
ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
$as_echo "$ac_ct_STRIP" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_STRIP" = x; then
STRIP=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
STRIP=$ac_ct_STRIP
fi
else
STRIP="$ac_cv_prog_STRIP"
fi
test -z "$STRIP" && STRIP=:
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_RANLIB+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_RANLIB"; then
ac_ct_RANLIB=$RANLIB
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_RANLIB"; then
ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_RANLIB" = x; then
RANLIB=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
RANLIB=$ac_ct_RANLIB
fi
else
RANLIB="$ac_cv_prog_RANLIB"
fi
test -z "$RANLIB" && RANLIB=:
# Determine commands to create old-style static archives.
old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
bitrig* | openbsd*)
old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
;;
*)
old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
;;
esac
old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
fi
case $host_os in
darwin*)
lock_old_archive_extraction=yes ;;
*)
lock_old_archive_extraction=no ;;
esac
for ac_prog in gawk mawk nawk awk
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AWK+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AWK"; then
ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AWK="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
$as_echo "$AWK" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$AWK" && break
done
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
# Check for command to grab the raw symbol name followed by C symbol from nm.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
if ${lt_cv_sys_global_symbol_pipe+:} false; then :
$as_echo_n "(cached) " >&6
else
# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix. What could be older than Ultrix?!! ;)]
# Character class describing NM global symbol codes.
symcode='[BCDEGRST]'
# Regexp to match symbols that can be accessed directly from C.
sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
# Define system-specific variables.
case $host_os in
aix*)
symcode='[BCDT]'
;;
cygwin* | mingw* | pw32* | cegcc*)
symcode='[ABCDGISTW]'
;;
hpux*)
if test ia64 = "$host_cpu"; then
symcode='[ABCDEGRST]'
fi
;;
irix* | nonstopux*)
symcode='[BCDEGRST]'
;;
osf*)
symcode='[BCDEGQRST]'
;;
solaris*)
symcode='[BDRT]'
;;
sco3.2v5*)
symcode='[DT]'
;;
sysv4.2uw2*)
symcode='[DT]'
;;
sysv5* | sco5v6* | unixware* | OpenUNIX*)
symcode='[ABDT]'
;;
sysv4)
symcode='[DFNSTU]'
;;
esac
# If we're using GNU nm, then use its standard symbol codes.
case `$NM -V 2>&1` in
*GNU* | *'with BFD'*)
symcode='[ABCDGIRSTW]' ;;
esac
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Gets list of data symbols to import.
lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
# Adjust the below global symbol transforms to fixup imported variables.
lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
lt_c_name_lib_hook="\
-e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
-e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
else
# Disable hooks by default.
lt_cv_sys_global_symbol_to_import=
lt_cdecl_hook=
lt_c_name_hook=
lt_c_name_lib_hook=
fi
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
lt_cv_sys_global_symbol_to_cdecl="sed -n"\
$lt_cdecl_hook\
" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
$lt_c_name_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
# Transform an extracted symbol line into symbol name with lib prefix and
# symbol address.
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
$lt_c_name_lib_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
mingw*)
opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
;;
esac
# Try without a prefix underscore, then with it.
for ac_symprfx in "" "_"; do
# Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
symxfrm="\\1 $ac_symprfx\\2 \\2"
# Write the raw and C identifiers.
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Fake it for dumpbin and say T for any non-static function,
# D for any global variable and I for any imported variable.
# Also find C++ and __fastcall symbols from MSVC++,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK '"\
" {last_section=section; section=\$ 3};"\
" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
" \$ 0!~/External *\|/{next};"\
" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
" {if(hide[section]) next};"\
" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx"
else
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
rm -f conftest*
cat > conftest.$ac_ext <<_LT_EOF
#ifdef __cplusplus
extern "C" {
#endif
char nm_test_var;
void nm_test_func(void);
void nm_test_func(void){}
#ifdef __cplusplus
}
#endif
int main(){nm_test_var='a';nm_test_func();return(0);}
_LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
# Now try to grab the symbols.
nlist=conftest.nm
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
(eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
else
rm -f "$nlist"T
fi
# Make sure that we snagged all the symbols we need.
if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
cat <<_LT_EOF > conftest.$ac_ext
/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
/* DATA imports from DLLs on WIN32 can't be const, because runtime
relocations are performed -- see ld's documentation on pseudo-relocs. */
# define LT_DLSYM_CONST
#elif defined __osf__
/* This system does not cope well with relocations in const data. */
# define LT_DLSYM_CONST
#else
# define LT_DLSYM_CONST const
#endif
#ifdef __cplusplus
extern "C" {
#endif
_LT_EOF
# Now generate the symbol file.
eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
cat <<_LT_EOF >> conftest.$ac_ext
/* The mapping between symbol names and symbols. */
LT_DLSYM_CONST struct {
const char *name;
void *address;
}
lt__PROGRAM__LTX_preloaded_symbols[] =
{
{ "@PROGRAM@", (void *) 0 },
_LT_EOF
$SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
cat <<\_LT_EOF >> conftest.$ac_ext
{0, (void *) 0}
};
/* This works around a problem in FreeBSD linker */
#ifdef FREEBSD_WORKAROUND
static const void *lt_preloaded_setup() {
return lt__PROGRAM__LTX_preloaded_symbols;
}
#endif
#ifdef __cplusplus
}
#endif
_LT_EOF
# Now try linking the two files.
mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
LIBS=conftstm.$ac_objext
CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s conftest$ac_exeext; then
pipe_works=yes
fi
LIBS=$lt_globsym_save_LIBS
CFLAGS=$lt_globsym_save_CFLAGS
else
echo "cannot find nm_test_func in $nlist" >&5
fi
else
echo "cannot find nm_test_var in $nlist" >&5
fi
else
echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
fi
else
echo "$progname: failed program was:" >&5
cat conftest.$ac_ext >&5
fi
rm -rf conftest* conftst*
# Do not use the global_symbol_pipe unless it works.
if test yes = "$pipe_works"; then
break
else
lt_cv_sys_global_symbol_pipe=
fi
done
fi
if test -z "$lt_cv_sys_global_symbol_pipe"; then
lt_cv_sys_global_symbol_to_cdecl=
fi
if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
$as_echo "failed" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
$as_echo "ok" >&6; }
fi
# Response file support.
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
nm_file_list_spec='@'
elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
nm_file_list_spec='@'
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
$as_echo_n "checking for sysroot... " >&6; }
# Check whether --with-sysroot was given.
if test "${with_sysroot+set}" = set; then :
withval=$with_sysroot;
else
with_sysroot=no
fi
lt_sysroot=
case $with_sysroot in #(
yes)
if test yes = "$GCC"; then
lt_sysroot=`$CC --print-sysroot 2>/dev/null`
fi
;; #(
/*)
lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
;; #(
no|'')
;; #(
*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
$as_echo "$with_sysroot" >&6; }
as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
$as_echo "${lt_sysroot:-no}" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
$as_echo_n "checking for a working dd... " >&6; }
if ${ac_cv_path_lt_DD+:} false; then :
$as_echo_n "(cached) " >&6
else
printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
: ${lt_DD:=$DD}
if test -z "$lt_DD"; then
ac_path_lt_DD_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in dd; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_lt_DD" || continue
if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
cmp -s conftest.i conftest.out \
&& ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
fi
$ac_path_lt_DD_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_lt_DD"; then
:
fi
else
ac_cv_path_lt_DD=$lt_DD
fi
rm -f conftest.i conftest2.i conftest.out
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
$as_echo "$ac_cv_path_lt_DD" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
$as_echo_n "checking how to truncate binary pipes... " >&6; }
if ${lt_cv_truncate_bin+:} false; then :
$as_echo_n "(cached) " >&6
else
printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
lt_cv_truncate_bin=
if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
cmp -s conftest.i conftest.out \
&& lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
fi
rm -f conftest.i conftest2.i conftest.out
test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
$as_echo "$lt_cv_truncate_bin" >&6; }
# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
func_cc_basename ()
{
for cc_temp in $*""; do
case $cc_temp in
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
\-*) ;;
*) break;;
esac
done
func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
}
# Check whether --enable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then :
enableval=$enable_libtool_lock;
fi
test no = "$enable_libtool_lock" || enable_libtool_lock=yes
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
# Find out what ABI is being produced by ac_compile, and set mode
# options accordingly.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE=32
;;
*ELF-64*)
HPUX_IA64_MODE=64
;;
esac
fi
rm -rf conftest*
;;
*-*-irix6*)
# Find out what ABI is being produced by ac_compile, and set linker
# options accordingly.
echo '#line '$LINENO' "configure"' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
if test yes = "$lt_cv_prog_gnu_ld"; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
*N32*)
LD="${LD-ld} -melf32bmipn32"
;;
*64-bit*)
LD="${LD-ld} -melf64bmip"
;;
esac
else
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
*N32*)
LD="${LD-ld} -n32"
;;
*64-bit*)
LD="${LD-ld} -64"
;;
esac
fi
fi
rm -rf conftest*
;;
mips64*-*linux*)
# Find out what ABI is being produced by ac_compile, and set linker
# options accordingly.
echo '#line '$LINENO' "configure"' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
emul=elf
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
emul="${emul}32"
;;
*64-bit*)
emul="${emul}64"
;;
esac
case `/usr/bin/file conftest.$ac_objext` in
*MSB*)
emul="${emul}btsmip"
;;
*LSB*)
emul="${emul}ltsmip"
;;
esac
case `/usr/bin/file conftest.$ac_objext` in
*N32*)
emul="${emul}n32"
;;
esac
LD="${LD-ld} -m $emul"
fi
rm -rf conftest*
;;
x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
# Find out what ABI is being produced by ac_compile, and set linker
# options accordingly. Note that the listed cases only cover the
# situations where additional linker options are needed (such as when
# doing 32-bit compilation for a host where ld defaults to 64-bit, or
# vice versa); the common cases where no linker options are needed do
# not appear in the list.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
case `/usr/bin/file conftest.o` in
*32-bit*)
case $host in
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
case `/usr/bin/file conftest.o` in
*x86-64*)
LD="${LD-ld} -m elf32_x86_64"
;;
*)
LD="${LD-ld} -m elf_i386"
;;
esac
;;
powerpc64le-*linux*)
LD="${LD-ld} -m elf32lppclinux"
;;
powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
LD="${LD-ld} -m elf_s390"
;;
sparc64-*linux*)
LD="${LD-ld} -m elf32_sparc"
;;
esac
;;
*64-bit*)
case $host in
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_x86_64_fbsd"
;;
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
powerpcle-*linux*)
LD="${LD-ld} -m elf64lppc"
;;
powerpc-*linux*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*|s390*-*tpf*)
LD="${LD-ld} -m elf64_s390"
;;
sparc*-*linux*)
LD="${LD-ld} -m elf64_sparc"
;;
esac
;;
esac
fi
rm -rf conftest*
;;
*-*-sco3.2v5*)
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
SAVE_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -belf"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
if ${lt_cv_cc_needs_belf+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
lt_cv_cc_needs_belf=yes
else
lt_cv_cc_needs_belf=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
$as_echo "$lt_cv_cc_needs_belf" >&6; }
if test yes != "$lt_cv_cc_needs_belf"; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
CFLAGS=$SAVE_CFLAGS
fi
;;
*-*solaris*)
# Find out what ABI is being produced by ac_compile, and set linker
# options accordingly.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*)
case $host in
i?86-*-solaris*|x86_64-*-solaris*)
LD="${LD-ld} -m elf_x86_64"
;;
sparc*-*-solaris*)
LD="${LD-ld} -m elf64_sparc"
;;
esac
# GNU ld 2.21 introduced _sol2 emulations. Use them if available.
if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
LD=${LD-ld}_sol2
fi
;;
*)
if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
LD="${LD-ld} -64"
fi
;;
esac
;;
esac
fi
rm -rf conftest*
;;
esac
need_locks=$enable_libtool_lock
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
set dummy ${ac_tool_prefix}mt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$MANIFEST_TOOL"; then
ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
if test -n "$MANIFEST_TOOL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
$as_echo "$MANIFEST_TOOL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
# Extract the first word of "mt", so it can be a program name with args.
set dummy mt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_MANIFEST_TOOL"; then
ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
if test -n "$ac_ct_MANIFEST_TOOL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_MANIFEST_TOOL" = x; then
MANIFEST_TOOL=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
fi
else
MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
fi
test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
if ${lt_cv_path_mainfest_tool+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_path_mainfest_tool=no
echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
$MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
cat conftest.err >&5
if $GREP 'Manifest Tool' conftest.out > /dev/null; then
lt_cv_path_mainfest_tool=yes
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
$as_echo "$lt_cv_path_mainfest_tool" >&6; }
if test yes != "$lt_cv_path_mainfest_tool"; then
MANIFEST_TOOL=:
fi
case $host_os in
rhapsody* | darwin*)
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DSYMUTIL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DSYMUTIL"; then
ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
DSYMUTIL=$ac_cv_prog_DSYMUTIL
if test -n "$DSYMUTIL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
$as_echo "$DSYMUTIL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_DSYMUTIL"; then
ac_ct_DSYMUTIL=$DSYMUTIL
# Extract the first word of "dsymutil", so it can be a program name with args.
set dummy dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_DSYMUTIL"; then
ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
if test -n "$ac_ct_DSYMUTIL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
$as_echo "$ac_ct_DSYMUTIL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_DSYMUTIL" = x; then
DSYMUTIL=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DSYMUTIL=$ac_ct_DSYMUTIL
fi
else
DSYMUTIL="$ac_cv_prog_DSYMUTIL"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
set dummy ${ac_tool_prefix}nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_NMEDIT+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$NMEDIT"; then
ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
NMEDIT=$ac_cv_prog_NMEDIT
if test -n "$NMEDIT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
$as_echo "$NMEDIT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_NMEDIT"; then
ac_ct_NMEDIT=$NMEDIT
# Extract the first word of "nmedit", so it can be a program name with args.
set dummy nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_NMEDIT"; then
ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_NMEDIT="nmedit"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
if test -n "$ac_ct_NMEDIT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
$as_echo "$ac_ct_NMEDIT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_NMEDIT" = x; then
NMEDIT=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
NMEDIT=$ac_ct_NMEDIT
fi
else
NMEDIT="$ac_cv_prog_NMEDIT"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
set dummy ${ac_tool_prefix}lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_LIPO+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$LIPO"; then
ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
LIPO=$ac_cv_prog_LIPO
if test -n "$LIPO"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
$as_echo "$LIPO" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_LIPO"; then
ac_ct_LIPO=$LIPO
# Extract the first word of "lipo", so it can be a program name with args.
set dummy lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_LIPO"; then
ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_LIPO="lipo"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
if test -n "$ac_ct_LIPO"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
$as_echo "$ac_ct_LIPO" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_LIPO" = x; then
LIPO=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
LIPO=$ac_ct_LIPO
fi
else
LIPO="$ac_cv_prog_LIPO"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OTOOL"; then
ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
OTOOL=$ac_cv_prog_OTOOL
if test -n "$OTOOL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
$as_echo "$OTOOL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_OTOOL"; then
ac_ct_OTOOL=$OTOOL
# Extract the first word of "otool", so it can be a program name with args.
set dummy otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OTOOL"; then
ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OTOOL="otool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
if test -n "$ac_ct_OTOOL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
$as_echo "$ac_ct_OTOOL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_OTOOL" = x; then
OTOOL=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OTOOL=$ac_ct_OTOOL
fi
else
OTOOL="$ac_cv_prog_OTOOL"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OTOOL64+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OTOOL64"; then
ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
OTOOL64=$ac_cv_prog_OTOOL64
if test -n "$OTOOL64"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
$as_echo "$OTOOL64" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_OTOOL64"; then
ac_ct_OTOOL64=$OTOOL64
# Extract the first word of "otool64", so it can be a program name with args.
set dummy otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OTOOL64"; then
ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OTOOL64="otool64"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
if test -n "$ac_ct_OTOOL64"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
$as_echo "$ac_ct_OTOOL64" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_OTOOL64" = x; then
OTOOL64=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OTOOL64=$ac_ct_OTOOL64
fi
else
OTOOL64="$ac_cv_prog_OTOOL64"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
$as_echo_n "checking for -single_module linker flag... " >&6; }
if ${lt_cv_apple_cc_single_mod+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_apple_cc_single_mod=no
if test -z "$LT_MULTI_MODULE"; then
# By default we will add the -single_module flag. You can override
# by either setting the environment variable LT_MULTI_MODULE
# non-empty at configure time, or by adding -multi_module to the
# link flags.
rm -rf libconftest.dylib*
echo "int foo(void){return 1;}" > conftest.c
echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c" >&5
$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c 2>conftest.err
_lt_result=$?
# If there is a non-empty error log, and "single_module"
# appears in it, assume the flag caused a linker warning
if test -s conftest.err && $GREP single_module conftest.err; then
cat conftest.err >&5
# Otherwise, if the output was created with a 0 exit code from
# the compiler, it worked.
elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
lt_cv_apple_cc_single_mod=yes
else
cat conftest.err >&5
fi
rm -rf libconftest.dylib*
rm -f conftest.*
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
if ${lt_cv_ld_exported_symbols_list+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_ld_exported_symbols_list=no
save_LDFLAGS=$LDFLAGS
echo "_main" > conftest.sym
LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
lt_cv_ld_exported_symbols_list=yes
else
lt_cv_ld_exported_symbols_list=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
$as_echo_n "checking for -force_load linker flag... " >&6; }
if ${lt_cv_ld_force_load+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_ld_force_load=no
cat > conftest.c << _LT_EOF
int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
echo "$AR cru libconftest.a conftest.o" >&5
$AR cru libconftest.a conftest.o 2>&5
echo "$RANLIB libconftest.a" >&5
$RANLIB libconftest.a 2>&5
cat > conftest.c << _LT_EOF
int main() { return 0;}
_LT_EOF
echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
_lt_result=$?
if test -s conftest.err && $GREP force_load conftest.err; then
cat conftest.err >&5
elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
lt_cv_ld_force_load=yes
else
cat conftest.err >&5
fi
rm -f conftest.err libconftest.a conftest conftest.c
rm -rf conftest.dSYM
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
$as_echo "$lt_cv_ld_force_load" >&6; }
case $host_os in
rhapsody* | darwin1.[012])
_lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
darwin*) # darwin 5.x on
# if running on 10.5 or later, the deployment target defaults
# to the OS version, if on x86, and 10.4, the deployment
# target defaults to 10.4. Don't you love it?
case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
10.0,*86*-darwin8*|10.0,*-darwin[91]*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
10.[012][,.]*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac
;;
esac
if test yes = "$lt_cv_apple_cc_single_mod"; then
_lt_dar_single_mod='$single_module'
fi
if test yes = "$lt_cv_ld_exported_symbols_list"; then
_lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
else
_lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
fi
if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
_lt_dsymutil='~$DSYMUTIL $lib || :'
else
_lt_dsymutil=
fi
;;
esac
# func_munge_path_list VARIABLE PATH
# -----------------------------------
# VARIABLE is name of variable containing _space_ separated list of
# directories to be munged by the contents of PATH, which is string
# having a format:
# "DIR[:DIR]:"
# string "DIR[ DIR]" will be prepended to VARIABLE
# ":DIR[:DIR]"
# string "DIR[ DIR]" will be appended to VARIABLE
# "DIRP[:DIRP]::[DIRA:]DIRA"
# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
# "DIRA[ DIRA]" will be appended to VARIABLE
# "DIR[:DIR]"
# VARIABLE will be replaced by "DIR[ DIR]"
func_munge_path_list ()
{
case x$2 in
x)
;;
*:)
eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
;;
x:*)
eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
;;
*::*)
eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
;;
*)
eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
;;
esac
}
for ac_header in dlfcn.h
do :
ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
"
if test "x$ac_cv_header_dlfcn_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_DLFCN_H 1
_ACEOF
fi
done
func_stripname_cnf ()
{
case $2 in
.*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
esac
} # func_stripname_cnf
# Set options
enable_dlopen=no
enable_win32_dll=no
# Check whether --enable-shared was given.
if test "${enable_shared+set}" = set; then :
enableval=$enable_shared; p=${PACKAGE-default}
case $enableval in
yes) enable_shared=yes ;;
no) enable_shared=no ;;
*)
enable_shared=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_shared=yes
fi
done
IFS=$lt_save_ifs
;;
esac
else
enable_shared=yes
fi
# Check whether --enable-static was given.
if test "${enable_static+set}" = set; then :
enableval=$enable_static; p=${PACKAGE-default}
case $enableval in
yes) enable_static=yes ;;
no) enable_static=no ;;
*)
enable_static=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_static=yes
fi
done
IFS=$lt_save_ifs
;;
esac
else
enable_static=yes
fi
# Check whether --with-pic was given.
if test "${with_pic+set}" = set; then :
withval=$with_pic; lt_p=${PACKAGE-default}
case $withval in
yes|no) pic_mode=$withval ;;
*)
pic_mode=default
# Look at the argument we got. We use all the common list separators.
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for lt_pkg in $withval; do
IFS=$lt_save_ifs
if test "X$lt_pkg" = "X$lt_p"; then
pic_mode=yes
fi
done
IFS=$lt_save_ifs
;;
esac
else
pic_mode=default
fi
# Check whether --enable-fast-install was given.
if test "${enable_fast_install+set}" = set; then :
enableval=$enable_fast_install; p=${PACKAGE-default}
case $enableval in
yes) enable_fast_install=yes ;;
no) enable_fast_install=no ;;
*)
enable_fast_install=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_fast_install=yes
fi
done
IFS=$lt_save_ifs
;;
esac
else
enable_fast_install=yes
fi
shared_archive_member_spec=
case $host,$enable_shared in
power*-*-aix[5-9]*,yes)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
# Check whether --with-aix-soname was given.
if test "${with_aix_soname+set}" = set; then :
withval=$with_aix_soname; case $withval in
aix|svr4|both)
;;
*)
as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
;;
esac
lt_cv_with_aix_soname=$with_aix_soname
else
if ${lt_cv_with_aix_soname+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_with_aix_soname=aix
fi
with_aix_soname=$lt_cv_with_aix_soname
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
$as_echo "$with_aix_soname" >&6; }
if test aix != "$with_aix_soname"; then
# For the AIX way of multilib, we name the shared archive member
# based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
# and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
# Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
# the AIX toolchain works better with OBJECT_MODE set (default 32).
if test 64 = "${OBJECT_MODE-32}"; then
shared_archive_member_spec=shr_64
else
shared_archive_member_spec=shr
fi
fi
;;
*)
with_aix_soname=aix
;;
esac
# This can be used to rebuild libtool when needed
LIBTOOL_DEPS=$ltmain
# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
test -z "$LN_S" && LN_S="ln -s"
if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
$as_echo_n "checking for objdir... " >&6; }
if ${lt_cv_objdir+:} false; then :
$as_echo_n "(cached) " >&6
else
rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
lt_cv_objdir=.libs
else
# MS-DOS does not allow filenames that begin with a dot.
lt_cv_objdir=_libs
fi
rmdir .libs 2>/dev/null
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
$as_echo "$lt_cv_objdir" >&6; }
objdir=$lt_cv_objdir
cat >>confdefs.h <<_ACEOF
#define LT_OBJDIR "$lt_cv_objdir/"
_ACEOF
case $host_os in
aix3*)
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test set != "${COLLECT_NAMES+set}"; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
;;
esac
# Global variables:
ofile=libtool
can_build_shared=yes
# All known linkers require a '.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a
with_gnu_ld=$lt_cv_prog_gnu_ld
old_CC=$CC
old_CFLAGS=$CFLAGS
# Set sane defaults for various variables
test -z "$CC" && CC=cc
test -z "$LTCC" && LTCC=$CC
test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$LD" && LD=ld
test -z "$ac_objext" && ac_objext=o
func_cc_basename $compiler
cc_basename=$func_cc_basename_result
# Only perform the check for file, if the check method requires it
test -z "$MAGIC_CMD" && MAGIC_CMD=file
case $deplibs_check_method in
file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
if ${lt_cv_path_MAGIC_CMD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
*)
lt_save_MAGIC_CMD=$MAGIC_CMD
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
for ac_dir in $ac_dummy; do
IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/${ac_tool_prefix}file"; then
lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
else
cat <<_LT_EOF 1>&2
*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such. This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem. Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org
_LT_EOF
fi ;;
esac
fi
break
fi
done
IFS=$lt_save_ifs
MAGIC_CMD=$lt_save_MAGIC_CMD
;;
esac
fi
MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
$as_echo_n "checking for file... " >&6; }
if ${lt_cv_path_MAGIC_CMD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
*)
lt_save_MAGIC_CMD=$MAGIC_CMD
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
for ac_dir in $ac_dummy; do
IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/file"; then
lt_cv_path_MAGIC_CMD=$ac_dir/"file"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
else
cat <<_LT_EOF 1>&2
*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such. This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem. Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org
_LT_EOF
fi ;;
esac
fi
break
fi
done
IFS=$lt_save_ifs
MAGIC_CMD=$lt_save_MAGIC_CMD
;;
esac
fi
MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
MAGIC_CMD=:
fi
fi
fi
;;
esac
# Use C for the default configuration in the libtool script
lt_save_CC=$CC
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
# Source file extension for C test sources.
ac_ext=c
# Object file extension for compiled C test sources.
objext=o
objext=$objext
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;"
# Code to be used in simple link tests
lt_simple_link_test_code='int main(){return(0);}'
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
# Save the default compiler, since it gets overwritten when the other
# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
compiler_DEFAULT=$CC
# save warnings/boilerplate of simple test code
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*
ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*
## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
## the running order or otherwise move them around unless you know exactly
## what you are doing...
if test -n "$compiler"; then
lt_prog_compiler_no_builtin_flag=
if test yes = "$GCC"; then
case $cc_basename in
nvcc*)
lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
*)
lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_rtti_exceptions=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
# The option is referenced via a variable to avoid confusing sed.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_rtti_exceptions=yes
fi
fi
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
else
:
fi
fi
lt_prog_compiler_wl=
lt_prog_compiler_pic=
lt_prog_compiler_static=
if test yes = "$GCC"; then
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_static='-static'
case $host_os in
aix*)
# All AIX code is PIC.
if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
lt_prog_compiler_pic='-fPIC'
;;
m68k)
# FIXME: we need at least 68020 code to build shared libraries, but
# adding the '-m68020' flag to GCC prevents building anything better,
# like '-m68040'.
lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
;;
esac
;;
beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
mingw* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
# Although the cygwin gcc ignores -fPIC, still need this for old-style
# (--disable-auto-import) libraries
lt_prog_compiler_pic='-DDLL_EXPORT'
case $host_os in
os2*)
lt_prog_compiler_static='$wl-static'
;;
esac
;;
darwin* | rhapsody*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
lt_prog_compiler_pic='-fno-common'
;;
haiku*)
# PIC is the default for Haiku.
# The "-static" flag exists, but is broken.
lt_prog_compiler_static=
;;
hpux*)
# PIC is the default for 64-bit PA HP-UX, but not for 32-bit
# PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
# sets the default TLS model and affects inlining.
case $host_cpu in
hppa*64*)
# +Z the default
;;
*)
lt_prog_compiler_pic='-fPIC'
;;
esac
;;
interix[3-9]*)
# Interix 3.x gcc -fpic/-fPIC options generate broken code.
# Instead, we relocate shared libraries at runtime.
;;
msdosdjgpp*)
# Just because we use GCC doesn't mean we suddenly get shared libraries
# on systems that don't support them.
lt_prog_compiler_can_build_shared=no
enable_shared=no
;;
*nto* | *qnx*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
# it will coredump.
lt_prog_compiler_pic='-fPIC -shared'
;;
sysv4*MP*)
if test -d /usr/nec; then
lt_prog_compiler_pic=-Kconform_pic
fi
;;
*)
lt_prog_compiler_pic='-fPIC'
;;
esac
case $cc_basename in
nvcc*) # Cuda Compiler Driver 2.2
lt_prog_compiler_wl='-Xlinker '
if test -n "$lt_prog_compiler_pic"; then
lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
fi
;;
esac
else
# PORTME Check for flag to pass linker flags through the system compiler.
case $host_os in
aix*)
lt_prog_compiler_wl='-Wl,'
if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
else
lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
fi
;;
darwin* | rhapsody*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
lt_prog_compiler_pic='-fno-common'
case $cc_basename in
nagfor*)
# NAG Fortran compiler
lt_prog_compiler_wl='-Wl,-Wl,,'
lt_prog_compiler_pic='-PIC'
lt_prog_compiler_static='-Bstatic'
;;
esac
;;
mingw* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic='-DDLL_EXPORT'
case $host_os in
os2*)
lt_prog_compiler_static='$wl-static'
;;
esac
;;
hpux9* | hpux10* | hpux11*)
lt_prog_compiler_wl='-Wl,'
# PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
# not for PA HP-UX.
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
lt_prog_compiler_pic='+Z'
;;
esac
# Is there a better lt_prog_compiler_static that works with the bundled CC?
lt_prog_compiler_static='$wl-a ${wl}archive'
;;
irix5* | irix6* | nonstopux*)
lt_prog_compiler_wl='-Wl,'
# PIC (with -KPIC) is the default.
lt_prog_compiler_static='-non_shared'
;;
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
# old Intel for x86_64, which still supported -KPIC.
ecc*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-static'
;;
# icc used to be incompatible with GCC.
# ICC 10 doesn't accept -KPIC any more.
icc* | ifort*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-fPIC'
lt_prog_compiler_static='-static'
;;
# Lahey Fortran 8.1.
lf95*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='--shared'
lt_prog_compiler_static='--static'
;;
nagfor*)
# NAG Fortran compiler
lt_prog_compiler_wl='-Wl,-Wl,,'
lt_prog_compiler_pic='-PIC'
lt_prog_compiler_static='-Bstatic'
;;
tcc*)
# Fabrice Bellard et al's Tiny C Compiler
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-fPIC'
lt_prog_compiler_static='-static'
;;
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-fpic'
lt_prog_compiler_static='-Bstatic'
;;
ccc*)
lt_prog_compiler_wl='-Wl,'
# All Alpha code is PIC.
lt_prog_compiler_static='-non_shared'
;;
xl* | bgxl* | bgf* | mpixl*)
# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-qpic'
lt_prog_compiler_static='-qstaticlink'
;;
*)
case `$CC -V 2>&1 | sed 5q` in
*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
lt_prog_compiler_wl=''
;;
*Sun\ F* | *Sun*Fortran*)
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
lt_prog_compiler_wl='-Qoption ld '
;;
*Sun\ C*)
# Sun C 5.9
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
lt_prog_compiler_wl='-Wl,'
;;
*Intel*\ [CF]*Compiler*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-fPIC'
lt_prog_compiler_static='-static'
;;
*Portland\ Group*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-fpic'
lt_prog_compiler_static='-Bstatic'
;;
esac
;;
esac
;;
newsos6)
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
;;
*nto* | *qnx*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
# it will coredump.
lt_prog_compiler_pic='-fPIC -shared'
;;
osf3* | osf4* | osf5*)
lt_prog_compiler_wl='-Wl,'
# All OSF/1 code is PIC.
lt_prog_compiler_static='-non_shared'
;;
rdos*)
lt_prog_compiler_static='-non_shared'
;;
solaris*)
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
case $cc_basename in
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
lt_prog_compiler_wl='-Qoption ld ';;
*)
lt_prog_compiler_wl='-Wl,';;
esac
;;
sunos4*)
lt_prog_compiler_wl='-Qoption ld '
lt_prog_compiler_pic='-PIC'
lt_prog_compiler_static='-Bstatic'
;;
sysv4 | sysv4.2uw2* | sysv4.3*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
;;
sysv4*MP*)
if test -d /usr/nec; then
lt_prog_compiler_pic='-Kconform_pic'
lt_prog_compiler_static='-Bstatic'
fi
;;
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
;;
unicos*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_can_build_shared=no
;;
uts4*)
lt_prog_compiler_pic='-pic'
lt_prog_compiler_static='-Bstatic'
;;
*)
lt_prog_compiler_can_build_shared=no
;;
esac
fi
case $host_os in
# For platforms that do not support PIC, -DPIC is meaningless:
*djgpp*)
lt_prog_compiler_pic=
;;
*)
lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
if ${lt_cv_prog_compiler_pic+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
$as_echo "$lt_cv_prog_compiler_pic" >&6; }
lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
if ${lt_cv_prog_compiler_pic_works+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_pic_works=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
# The option is referenced via a variable to avoid confusing sed.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_pic_works=yes
fi
fi
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
if test yes = "$lt_cv_prog_compiler_pic_works"; then
case $lt_prog_compiler_pic in
"" | " "*) ;;
*) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
esac
else
lt_prog_compiler_pic=
lt_prog_compiler_can_build_shared=no
fi
fi
#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
if ${lt_cv_prog_compiler_static_works+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_static_works=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
# The linker can only warn and ignore the option if not recognized
# So say no if there are warnings
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&5
$ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_static_works=yes
fi
else
lt_cv_prog_compiler_static_works=yes
fi
fi
$RM -r conftest*
LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
if test yes = "$lt_cv_prog_compiler_static_works"; then
:
else
lt_prog_compiler_static=
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_c_o=no
$RM -r conftest 2>/dev/null
mkdir conftest
cd conftest
mkdir out
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-o out/conftest2.$ac_objext"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o=yes
fi
fi
chmod u+w . 2>&5
$RM conftest*
# SGI C++ compiler will create directory out/ii_files/ for
# template instantiation
test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
$RM out/* && rmdir out
cd ..
$RM -r conftest
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_c_o=no
$RM -r conftest 2>/dev/null
mkdir conftest
cd conftest
mkdir out
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-o out/conftest2.$ac_objext"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o=yes
fi
fi
chmod u+w . 2>&5
$RM conftest*
# SGI C++ compiler will create directory out/ii_files/ for
# template instantiation
test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
$RM out/* && rmdir out
cd ..
$RM -r conftest
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
hard_links=nottested
if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
# do not overwrite the value of need_locks provided by the user
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
hard_links=yes
$RM conftest*
ln conftest.a conftest.b 2>/dev/null && hard_links=no
touch conftest.a
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
if test no = "$hard_links"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
need_locks=warn
fi
else
need_locks=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
runpath_var=
allow_undefined_flag=
always_export_symbols=no
archive_cmds=
archive_expsym_cmds=
compiler_needs_object=no
enable_shared_with_static_runtimes=no
export_dynamic_flag_spec=
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
hardcode_automatic=no
hardcode_direct=no
hardcode_direct_absolute=no
hardcode_libdir_flag_spec=
hardcode_libdir_separator=
hardcode_minus_L=no
hardcode_shlibpath_var=unsupported
inherit_rpath=no
link_all_deplibs=unknown
module_cmds=
module_expsym_cmds=
old_archive_from_new_cmds=
old_archive_from_expsyms_cmds=
thread_safe_flag_spec=
whole_archive_flag_spec=
# include_expsyms should be a list of space-separated symbols to be *always*
# included in the symbol list
include_expsyms=
# exclude_expsyms can be an extended regexp of symbols to exclude
# it will be wrapped by ' (' and ')$', so one must not match beginning or
# end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
# as well as any symbol that contains 'd'.
exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
# platforms (ab)use it in PIC code, but their linkers get confused if
# the symbol is explicitly referenced. Since portable code cannot
# rely on this symbol name, it's probably fine to never include it in
# preloaded symbol tables.
# Exclude shared library initialization/finalization symbols.
extract_expsyms_cmds=
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
interix*)
# we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
openbsd* | bitrig*)
with_gnu_ld=no
;;
esac
ld_shlibs=yes
# On some targets, GNU ld is compatible enough with the native linker
# that we're better off using the native interface for both.
lt_use_gnu_ld_interface=no
if test yes = "$with_gnu_ld"; then
case $host_os in
aix*)
# The AIX port of GNU ld has always aspired to compatibility
# with the native linker. However, as the warning in the GNU ld
# block says, versions before 2.19.5* couldn't really create working
# shared libraries, regardless of the interface used.
case `$LD -v 2>&1` in
*\ \(GNU\ Binutils\)\ 2.19.5*) ;;
*\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
*\ \(GNU\ Binutils\)\ [3-9]*) ;;
*)
lt_use_gnu_ld_interface=yes
;;
esac
;;
*)
lt_use_gnu_ld_interface=yes
;;
esac
fi
if test yes = "$lt_use_gnu_ld_interface"; then
# If archive_cmds runs LD, not CC, wlarc should be empty
wlarc='$wl'
# Set some defaults for GNU ld with shared library support. These
# are reset later if shared libraries are not supported. Putting them
# here allows them to be overridden if necessary.
runpath_var=LD_RUN_PATH
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
export_dynamic_flag_spec='$wl--export-dynamic'
# ancient GNU ld didn't support --whole-archive et. al.
if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
whole_archive_flag_spec=
fi
supports_anon_versioning=no
case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
*\ 2.11.*) ;; # other 2.11 versions
*) supports_anon_versioning=yes ;;
esac
# See if GNU ld supports shared libraries.
case $host_os in
aix[3-9]*)
# On AIX/PPC, the GNU linker is very broken
if test ia64 != "$host_cpu"; then
ld_shlibs=no
cat <<_LT_EOF 1>&2
*** Warning: the GNU linker, at least up to release 2.19, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support. If you
*** really care for shared libraries, you may want to install binutils
*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
*** You will then need to restart the configuration process.
_LT_EOF
fi
;;
amigaos*)
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds=''
;;
m68k)
archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
;;
esac
;;
beos*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
allow_undefined_flag=unsupported
# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
else
ld_shlibs=no
fi
;;
cygwin* | mingw* | pw32* | cegcc*)
# _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
# as there is no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
export_dynamic_flag_spec='$wl--export-all-symbols'
allow_undefined_flag=unsupported
always_export_symbols=no
enable_shared_with_static_runtimes=yes
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
# If the export-symbols file already is a .def file, use it as
# is; otherwise, prepend EXPORTS...
archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
cp $export_symbols $output_objdir/$soname.def;
else
echo EXPORTS > $output_objdir/$soname.def;
cat $export_symbols >> $output_objdir/$soname.def;
fi~
$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
ld_shlibs=no
fi
;;
haiku*)
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
link_all_deplibs=yes
;;
os2*)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
allow_undefined_flag=unsupported
shrext_cmds=.dll
archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
$ECHO EXPORTS >> $output_objdir/$libname.def~
emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
$ECHO EXPORTS >> $output_objdir/$libname.def~
prefix_cmds="$SED"~
if test EXPORTS = "`$SED 1q $export_symbols`"; then
prefix_cmds="$prefix_cmds -e 1d";
fi~
prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes=yes
;;
interix[3-9]*)
hardcode_direct=no
hardcode_shlibpath_var=no
hardcode_libdir_flag_spec='$wl-rpath,$libdir'
export_dynamic_flag_spec='$wl-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
tmp_diet=no
if test linux-dietlibc = "$host_os"; then
case $cc_basename in
diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
esac
fi
if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
&& test no = "$tmp_diet"
then
tmp_addflag=' $pic_flag'
tmp_sharedflag='-shared'
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group f77 and f90 compilers
whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
tmp_addflag=' -i_dynamic -nofor_main' ;;
ifc* | ifort*) # Intel Fortran compiler
tmp_addflag=' -nofor_main' ;;
lf95*) # Lahey Fortran 8.1
whole_archive_flag_spec=
tmp_sharedflag='--shared' ;;
nagfor*) # NAGFOR 5.3
tmp_sharedflag='-Wl,-shared' ;;
xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
tmp_sharedflag='-qmkshrobj'
tmp_addflag= ;;
nvcc*) # Cuda Compiler Driver 2.2
whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object=yes
;;
esac
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object=yes
tmp_sharedflag='-G' ;;
*Sun\ F*) # Sun Fortran 8.3
tmp_sharedflag='-G' ;;
esac
archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
case $cc_basename in
tcc*)
export_dynamic_flag_spec='-rdynamic'
;;
xlf* | bgf* | bgxlf* | mpixlf*)
# IBM XL Fortran 10.1 on PPC cannot create shared libs itself
whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
;;
esac
else
ld_shlibs=no
fi
;;
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
solaris*)
if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
ld_shlibs=no
cat <<_LT_EOF 1>&2
*** Warning: The releases 2.8.* of the GNU linker cannot reliably
*** create shared libraries on Solaris systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.9.1 or newer. Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.
_LT_EOF
elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
case `$LD -v 2>&1` in
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
ld_shlibs=no
cat <<_LT_EOF 1>&2
*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
*** reliably create shared libraries on SCO systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.
_LT_EOF
;;
*)
# For security reasons, it is highly recommended that you always
# use absolute paths for naming shared libraries, and exclude the
# DT_RUNPATH tag from executables and libraries. But doing so
# requires that you compile everything twice, which is a pain.
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
esac
;;
sunos4*)
archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
wlarc=
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
esac
if test no = "$ld_shlibs"; then
runpath_var=
hardcode_libdir_flag_spec=
export_dynamic_flag_spec=
whole_archive_flag_spec=
fi
else
# PORTME fill in a description of your system's linker (not GNU ld)
case $host_os in
aix3*)
allow_undefined_flag=unsupported
always_export_symbols=yes
archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
hardcode_minus_L=yes
if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
# Neither direct hardcoding nor static linking is supported with a
# broken collect2.
hardcode_direct=unsupported
fi
;;
aix[4-9]*)
if test ia64 = "$host_cpu"; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
no_entry_flag=
else
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to GNU nm, but means don't demangle to AIX nm.
# Without the "-l" option, or with the "-B" option, AIX nm treats
# weak defined symbols like other global defined symbols, whereas
# GNU nm marks them as "W".
# While the 'weak' keyword is ignored in the Export File, we need
# it in the Import File for the 'aix-soname' feature, so we have
# to replace the "-B" option with "-P" for AIX nm.
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# have runtime linking enabled, and use it for executables.
# For shared libraries, we enable/disable runtime linking
# depending on the kind of the shared library created -
# when "with_aix_soname,aix_use_runtimelinking" is:
# "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
# "aix,yes" lib.so shared, rtl:yes, for executables
# lib.a static archive
# "both,no" lib.so.V(shr.o) shared, rtl:yes
# lib.a(lib.so.V) shared, rtl:no, for executables
# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
# lib.a(lib.so.V) shared, rtl:no
# "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
# lib.a static archive
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
for ld_flag in $LDFLAGS; do
if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
aix_use_runtimelinking=yes
break
fi
done
if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
# With aix-soname=svr4, we create the lib.so.V shared archives only,
# so we don't have lib.a shared libs to link our executables.
# We have to force runtime linking in this case.
aix_use_runtimelinking=yes
LDFLAGS="$LDFLAGS -Wl,-brtl"
fi
;;
esac
exp_sym_flag='-bexport'
no_entry_flag='-bnoentry'
fi
# When large executables or shared objects are built, AIX ld can
# have problems creating the table of contents. If linking a library
# or program results in "error TOC overflow" add -mminimal-toc to
# CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
# enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
archive_cmds=''
hardcode_direct=yes
hardcode_direct_absolute=yes
hardcode_libdir_separator=':'
link_all_deplibs=yes
file_list_spec='$wl-f,'
case $with_aix_soname,$aix_use_runtimelinking in
aix,*) ;; # traditional, no import file
svr4,* | *,yes) # use import file
# The Import File defines what to hardcode.
hardcode_direct=no
hardcode_direct_absolute=no
;;
esac
if test yes = "$GCC"; then
case $host_os in aix4.[012]|aix4.[012].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
collect2name=`$CC -print-prog-name=collect2`
if test -f "$collect2name" &&
strings "$collect2name" | $GREP resolve_lib_name >/dev/null
then
# We have reworked collect2
:
else
# We have old collect2
hardcode_direct=unsupported
# It fails to find uninstalled libraries when the uninstalled
# path is not listed in the libpath. Setting hardcode_minus_L
# to unsupported forces relinking
hardcode_minus_L=yes
hardcode_libdir_flag_spec='-L$libdir'
hardcode_libdir_separator=
fi
;;
esac
shared_flag='-shared'
if test yes = "$aix_use_runtimelinking"; then
shared_flag="$shared_flag "'$wl-G'
fi
# Need to ensure runtime linking is disabled for the traditional
# shared library, or the linker may eventually find shared libraries
# /with/ Import File - we do not want to mix them.
shared_flag_aix='-shared'
shared_flag_svr4='-shared $wl-G'
else
# not using gcc
if test ia64 = "$host_cpu"; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
if test yes = "$aix_use_runtimelinking"; then
shared_flag='$wl-G'
else
shared_flag='$wl-bM:SRE'
fi
shared_flag_aix='$wl-bM:SRE'
shared_flag_svr4='$wl-G'
fi
fi
export_dynamic_flag_spec='$wl-bexpall'
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
always_export_symbols=yes
if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
allow_undefined_flag='-berok'
# Determine the default libpath from the value encoded in an
# empty executable.
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
if ${lt_cv_aix_libpath_+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
/^0/ {
s/^0 *\([^ ]*\) *$/\1/
p
}
}'
lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=/usr/lib:/lib
fi
fi
aix_libpath=$lt_cv_aix_libpath_
fi
hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
else
if test ia64 = "$host_cpu"; then
hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
allow_undefined_flag="-z nodefs"
archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an
# empty executable.
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
if ${lt_cv_aix_libpath_+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
/^0/ {
s/^0 *\([^ ]*\) *$/\1/
p
}
}'
lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=/usr/lib:/lib
fi
fi
aix_libpath=$lt_cv_aix_libpath_
fi
hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
no_undefined_flag=' $wl-bernotok'
allow_undefined_flag=' $wl-berok'
if test yes = "$with_gnu_ld"; then
# We only use this code for GNU lds that support --whole-archive.
whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
else
# Exported symbols can be pulled into shared objects from archives
whole_archive_flag_spec='$convenience'
fi
archive_cmds_need_lc=yes
archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
# -brtl affects multiple linker settings, -berok does not and is overridden later
compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
if test svr4 != "$with_aix_soname"; then
# This is similar to how AIX traditionally builds its shared libraries.
archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
fi
if test aix != "$with_aix_soname"; then
archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
else
# used by -dlpreopen to get the symbols
archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
fi
archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
fi
fi
;;
amigaos*)
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds=''
;;
m68k)
archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
;;
esac
;;
bsdi[45]*)
export_dynamic_flag_spec=-rdynamic
;;
cygwin* | mingw* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
case $cc_basename in
cl*)
# Native MSVC
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
always_export_symbols=yes
file_list_spec='@'
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
cp "$export_symbols" "$output_objdir/$soname.def";
echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
else
$SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
fi~
$CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
enable_shared_with_static_runtimes=yes
exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
# Don't use ranlib
old_postinstall_cmds='chmod 644 $oldlib'
postlink_cmds='lt_outputfile="@OUTPUT@"~
lt_tool_outputfile="@TOOL_OUTPUT@"~
case $lt_outputfile in
*.exe|*.EXE) ;;
*)
lt_outputfile=$lt_outputfile.exe
lt_tool_outputfile=$lt_tool_outputfile.exe
;;
esac~
if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
$MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
$RM "$lt_outputfile.manifest";
fi'
;;
*)
# Assume MSVC wrapper
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
# The linker will automatically build a .lib file if we build a DLL.
old_archive_from_new_cmds='true'
# FIXME: Should let the user specify the lib program.
old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
enable_shared_with_static_runtimes=yes
;;
esac
;;
darwin* | rhapsody*)
archive_cmds_need_lc=no
hardcode_direct=no
hardcode_automatic=yes
hardcode_shlibpath_var=unsupported
if test yes = "$lt_cv_ld_force_load"; then
whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
else
whole_archive_flag_spec=''
fi
link_all_deplibs=yes
allow_undefined_flag=$_lt_dar_allow_undefined
case $cc_basename in
ifort*|nagfor*) _lt_dar_can_shared=yes ;;
*) _lt_dar_can_shared=$GCC ;;
esac
if test yes = "$_lt_dar_can_shared"; then
output_verbose_link_cmd=func_echo_all
archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
else
ld_shlibs=no
fi
;;
dgux*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_shlibpath_var=no
;;
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
# extra space).
freebsd2.2*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
freebsd2.*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
hardcode_minus_L=yes
hardcode_shlibpath_var=no
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
freebsd* | dragonfly*)
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
hpux9*)
if test yes = "$GCC"; then
archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
export_dynamic_flag_spec='$wl-E'
;;
hpux10*)
if test yes,no = "$GCC,$with_gnu_ld"; then
archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
if test no = "$with_gnu_ld"; then
hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
hardcode_direct_absolute=yes
export_dynamic_flag_spec='$wl-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
fi
;;
hpux11*)
if test yes,no = "$GCC,$with_gnu_ld"; then
case $host_cpu in
hppa*64*)
archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
case $host_cpu in
hppa*64*)
archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
# Older versions of the 11.00 compiler do not understand -b yet
# (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
$as_echo_n "checking if $CC understands -b... " >&6; }
if ${lt_cv_prog_compiler__b+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler__b=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -b"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
# The linker can only warn and ignore the option if not recognized
# So say no if there are warnings
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&5
$ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler__b=yes
fi
else
lt_cv_prog_compiler__b=yes
fi
fi
$RM -r conftest*
LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
$as_echo "$lt_cv_prog_compiler__b" >&6; }
if test yes = "$lt_cv_prog_compiler__b"; then
archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
;;
esac
fi
if test no = "$with_gnu_ld"; then
hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
case $host_cpu in
hppa*64*|ia64*)
hardcode_direct=no
hardcode_shlibpath_var=no
;;
*)
hardcode_direct=yes
hardcode_direct_absolute=yes
export_dynamic_flag_spec='$wl-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
;;
esac
fi
;;
irix5* | irix6* | nonstopux*)
if test yes = "$GCC"; then
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
# Try to use the -exported_symbol ld option, if it does not
# work, assume that -exports_file does not work either and
# implicitly export all symbols.
# This should be the same for all languages, so no per-tag cache variable.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
if ${lt_cv_irix_exported_symbol+:} false; then :
$as_echo_n "(cached) " >&6
else
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int foo (void) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
lt_cv_irix_exported_symbol=yes
else
lt_cv_irix_exported_symbol=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
$as_echo "$lt_cv_irix_exported_symbol" >&6; }
if test yes = "$lt_cv_irix_exported_symbol"; then
archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
fi
else
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
fi
archive_cmds_need_lc='no'
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
hardcode_libdir_separator=:
inherit_rpath=yes
link_all_deplibs=yes
;;
linux*)
case $cc_basename in
tcc*)
# Fabrice Bellard et al's Tiny C Compiler
ld_shlibs=yes
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
fi
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
newsos6)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
hardcode_libdir_separator=:
hardcode_shlibpath_var=no
;;
*nto* | *qnx*)
;;
openbsd* | bitrig*)
if test -f /usr/libexec/ld.so; then
hardcode_direct=yes
hardcode_shlibpath_var=no
hardcode_direct_absolute=yes
if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
hardcode_libdir_flag_spec='$wl-rpath,$libdir'
export_dynamic_flag_spec='$wl-E'
else
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='$wl-rpath,$libdir'
fi
else
ld_shlibs=no
fi
;;
os2*)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
allow_undefined_flag=unsupported
shrext_cmds=.dll
archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
$ECHO EXPORTS >> $output_objdir/$libname.def~
emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
$ECHO EXPORTS >> $output_objdir/$libname.def~
prefix_cmds="$SED"~
if test EXPORTS = "`$SED 1q $export_symbols`"; then
prefix_cmds="$prefix_cmds -e 1d";
fi~
prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes=yes
;;
osf3*)
if test yes = "$GCC"; then
allow_undefined_flag=' $wl-expect_unresolved $wl\*'
archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
else
allow_undefined_flag=' -expect_unresolved \*'
archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
fi
archive_cmds_need_lc='no'
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
hardcode_libdir_separator=:
;;
osf4* | osf5*) # as osf3* with the addition of -msym flag
if test yes = "$GCC"; then
allow_undefined_flag=' $wl-expect_unresolved $wl\*'
archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
else
allow_undefined_flag=' -expect_unresolved \*'
archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
$CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
# Both c and cxx compiler support -rpath directly
hardcode_libdir_flag_spec='-rpath $libdir'
fi
archive_cmds_need_lc='no'
hardcode_libdir_separator=:
;;
solaris*)
no_undefined_flag=' -z defs'
if test yes = "$GCC"; then
wlarc='$wl'
archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
$CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
else
case `$CC -V 2>&1` in
*"Compilers 5.0"*)
wlarc=''
archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
$LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
;;
*)
wlarc='$wl'
archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
$CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
;;
esac
fi
hardcode_libdir_flag_spec='-R$libdir'
hardcode_shlibpath_var=no
case $host_os in
solaris2.[0-5] | solaris2.[0-5].*) ;;
*)
# The compiler driver will combine and reorder linker options,
# but understands '-z linker_flag'. GCC discards it without '$wl',
# but is careful enough not to reorder.
# Supported since Solaris 2.6 (maybe 2.5.1?)
if test yes = "$GCC"; then
whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
else
whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
fi
;;
esac
link_all_deplibs=yes
;;
sunos4*)
if test sequent = "$host_vendor"; then
# Use $CC to link under sequent, because it throws in some extra .o
# files that make .init and .fini sections work.
archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
fi
hardcode_libdir_flag_spec='-L$libdir'
hardcode_direct=yes
hardcode_minus_L=yes
hardcode_shlibpath_var=no
;;
sysv4)
case $host_vendor in
sni)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes # is this really true???
;;
siemens)
## LD is ld it makes a PLAMLIB
## CC just makes a GrossModule.
archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
reload_cmds='$CC -r -o $output$reload_objs'
hardcode_direct=no
;;
motorola)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
;;
esac
runpath_var='LD_RUN_PATH'
hardcode_shlibpath_var=no
;;
sysv4.3*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_shlibpath_var=no
export_dynamic_flag_spec='-Bexport'
;;
sysv4*MP*)
if test -d /usr/nec; then
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_shlibpath_var=no
runpath_var=LD_RUN_PATH
hardcode_runpath_var=yes
ld_shlibs=yes
fi
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
no_undefined_flag='$wl-z,text'
archive_cmds_need_lc=no
hardcode_shlibpath_var=no
runpath_var='LD_RUN_PATH'
if test yes = "$GCC"; then
archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
sysv5* | sco3.2v5* | sco5v6*)
# Note: We CANNOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
no_undefined_flag='$wl-z,text'
allow_undefined_flag='$wl-z,nodefs'
archive_cmds_need_lc=no
hardcode_shlibpath_var=no
hardcode_libdir_flag_spec='$wl-R,$libdir'
hardcode_libdir_separator=':'
link_all_deplibs=yes
export_dynamic_flag_spec='$wl-Bexport'
runpath_var='LD_RUN_PATH'
if test yes = "$GCC"; then
archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
uts4*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_shlibpath_var=no
;;
*)
ld_shlibs=no
;;
esac
if test sni = "$host_vendor"; then
case $host in
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
export_dynamic_flag_spec='$wl-Blargedynsym'
;;
esac
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
$as_echo "$ld_shlibs" >&6; }
test no = "$ld_shlibs" && can_build_shared=no
with_gnu_ld=$with_gnu_ld
#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc" in
x|xyes)
# Assume -lc should be added
archive_cmds_need_lc=yes
if test yes,yes = "$GCC,$enable_shared"; then
case $archive_cmds in
*'~'*)
# FIXME: we may have to deal with multi-command sequences.
;;
'$CC '*)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
if ${lt_cv_archive_cmds_need_lc+:} false; then :
$as_echo_n "(cached) " >&6
else
$RM conftest*
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } 2>conftest.err; then
soname=conftest
lib=conftest
libobjs=conftest.$ac_objext
deplibs=
wl=$lt_prog_compiler_wl
pic_flag=$lt_prog_compiler_pic
compiler_flags=-v
linker_flags=-v
verstring=
output_objdir=.
libname=conftest
lt_save_allow_undefined_flag=$allow_undefined_flag
allow_undefined_flag=
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
(eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
then
lt_cv_archive_cmds_need_lc=no
else
lt_cv_archive_cmds_need_lc=yes
fi
allow_undefined_flag=$lt_save_allow_undefined_flag
else
cat conftest.err 1>&5
fi
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
;;
esac
fi
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }
if test yes = "$GCC"; then
case $host_os in
darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
*) lt_awk_arg='/^libraries:/' ;;
esac
case $host_os in
mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
*) lt_sed_strip_eq='s|=/|/|g' ;;
esac
lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
case $lt_search_path_spec in
*\;*)
# if the path contains ";" then we assume it to be the separator
# otherwise default to the standard path separator (i.e. ":") - it is
# assumed that no part of a normal pathname contains ";" but that should
# okay in the real world where ";" in dirpaths is itself problematic.
lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
;;
*)
lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
;;
esac
# Ok, now we have the path, separated by spaces, we can step through it
# and add multilib dir if necessary...
lt_tmp_lt_search_path_spec=
lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
# ...but if some path component already ends with the multilib dir we assume
# that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
case "$lt_multi_os_dir; $lt_search_path_spec " in
"/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
lt_multi_os_dir=
;;
esac
for lt_sys_path in $lt_search_path_spec; do
if test -d "$lt_sys_path$lt_multi_os_dir"; then
lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
elif test -n "$lt_multi_os_dir"; then
test -d "$lt_sys_path" && \
lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
fi
done
lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
BEGIN {RS = " "; FS = "/|\n";} {
lt_foo = "";
lt_count = 0;
for (lt_i = NF; lt_i > 0; lt_i--) {
if ($lt_i != "" && $lt_i != ".") {
if ($lt_i == "..") {
lt_count++;
} else {
if (lt_count == 0) {
lt_foo = "/" $lt_i lt_foo;
} else {
lt_count--;
}
}
}
}
if (lt_foo != "") { lt_freq[lt_foo]++; }
if (lt_freq[lt_foo] == 1) { print lt_foo; }
}'`
# AWK program above erroneously prepends '/' to C:/dos/paths
# for these hosts.
case $host_os in
mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
$SED 's|/\([A-Za-z]:\)|\1|g'` ;;
esac
sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no
# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown
case $host_os in
aix3*)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
shlibpath_var=LIBPATH
# AIX 3 has no versioning support, so we append a major version to the name.
soname_spec='$libname$release$shared_ext$major'
;;
aix[4-9]*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
if test ia64 = "$host_cpu"; then
# AIX 5 supports IA64
library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
else
# With GCC up to 2.95.x, collect2 would create an import file
# for dependence libraries. The import file would start with
# the line '#! .'. This would cause the generated library to
# depend on '.', always an invalid library. This was fixed in
# development snapshots of GCC prior to 3.0.
case $host_os in
aix4 | aix4.[01] | aix4.[01].*)
if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
echo ' yes '
echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
:
else
can_build_shared=no
fi
;;
esac
# Using Import Files as archive members, it is possible to support
# filename-based versioning of shared library archives on AIX. While
# this would work for both with and without runtime linking, it will
# prevent static linking of such archives. So we do filename-based
# shared library versioning with .so extension only, which is used
# when both runtime linking and shared linking is enabled.
# Unfortunately, runtime linking may impact performance, so we do
# not want this to be the default eventually. Also, we use the
# versioned .so libs for executables only if there is the -brtl
# linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
# To allow for filename-based versioning support, we need to create
# libNAME.so.V as an archive file, containing:
# *) an Import File, referring to the versioned filename of the
# archive as well as the shared archive member, telling the
# bitwidth (32 or 64) of that shared object, and providing the
# list of exported symbols of that shared object, eventually
# decorated with the 'weak' keyword
# *) the shared object with the F_LOADONLY flag set, to really avoid
# it being seen by the linker.
# At run time we better use the real file rather than another symlink,
# but for link time we create the symlink libNAME.so -> libNAME.so.V
case $with_aix_soname,$aix_use_runtimelinking in
# AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
# soname into executable. Probably we can add versioning support to
# collect2, so additional links can be useful in future.
aix,yes) # traditional libtool
dynamic_linker='AIX unversionable lib.so'
# If using run time linking (on AIX 4.2 or later) use lib<name>.so
# instead of lib<name>.a to let people know that these are not
# typical AIX shared libraries.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
;;
aix,no) # traditional AIX only
dynamic_linker='AIX lib.a(lib.so.V)'
# We preserve .a as extension for shared libraries through AIX4.2
# and later when we are not doing run time linking.
library_names_spec='$libname$release.a $libname.a'
soname_spec='$libname$release$shared_ext$major'
;;
svr4,*) # full svr4 only
dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
# We do not specify a path in Import Files, so LIBPATH fires.
shlibpath_overrides_runpath=yes
;;
*,yes) # both, prefer svr4
dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
# unpreferred sharedlib libNAME.a needs extra handling
postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
# We do not specify a path in Import Files, so LIBPATH fires.
shlibpath_overrides_runpath=yes
;;
*,no) # both, prefer aix
dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
library_names_spec='$libname$release.a $libname.a'
soname_spec='$libname$release$shared_ext$major'
# unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
;;
esac
shlibpath_var=LIBPATH
fi
;;
amigaos*)
case $host_cpu in
powerpc)
# Since July 2007 AmigaOS4 officially supports .so libraries.
# When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
;;
m68k)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
esac
;;
beos*)
library_names_spec='$libname$shared_ext'
dynamic_linker="$host_os ld.so"
shlibpath_var=LIBRARY_PATH
;;
bsdi[45]*)
version_type=linux # correct to gnu/linux during the next big refactor
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
# the default ld.so.conf also contains /usr/contrib/lib and
# /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
# libtool to hard-code these into programs
;;
cygwin* | mingw* | pw32* | cegcc*)
version_type=windows
shrext_cmds=.dll
need_version=no
need_lib_prefix=no
case $GCC,$cc_basename in
yes,*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \$file`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
chmod a+x \$dldir/$dlname~
if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
fi'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
shlibpath_overrides_runpath=yes
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
;;
mingw* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
*,cl*)
# Native MSVC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
case $build_os in
mingw*)
sys_lib_search_path_spec=
lt_save_ifs=$IFS
IFS=';'
for lt_path in $LIB
do
IFS=$lt_save_ifs
# Let DOS variable expansion print the short 8.3 style file name.
lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
done
IFS=$lt_save_ifs
# Convert to MSYS style.
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
# but this time dos style (no spaces!) so that the unix form looks
# like /cygdrive/c/PROGRA~1:/cygdr...
sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
;;
*)
sys_lib_search_path_spec=$LIB
if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
# It is most probably a Windows format PATH.
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
else
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
fi
# FIXME: find the short name or the path components, as spaces are
# common. (e.g. "Program Files" -> "PROGRA~1")
;;
esac
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \$file`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
shlibpath_overrides_runpath=yes
dynamic_linker='Win32 link.exe'
;;
*)
# Assume MSVC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
esac
# FIXME: first we should search . and the directory the executable is in
shlibpath_var=PATH
;;
darwin* | rhapsody*)
dynamic_linker="$host_os dyld"
version_type=darwin
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
soname_spec='$libname$release$major$shared_ext'
shlibpath_overrides_runpath=yes
shlibpath_var=DYLD_LIBRARY_PATH
shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
;;
dgux*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
objformat=`/usr/bin/objformat`
else
case $host_os in
freebsd[23].*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
version_type=freebsd-$objformat
case $version_type in
freebsd-elf*)
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
need_version=no
need_lib_prefix=no
;;
freebsd-*)
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
need_version=yes
;;
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
freebsd2.*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[01]* | freebsdelf3.[01]*)
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
*) # from 4.6 on, and DragonFly
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
esac
;;
haiku*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
dynamic_linker="$host_os runtime_loader"
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
shlibpath_overrides_runpath=no
sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
hardcode_into_libs=yes
;;
hpux9* | hpux10* | hpux11*)
# Give a soname corresponding to the major version so that dld.sl refuses to
# link against other versions.
version_type=sunos
need_lib_prefix=no
need_version=no
case $host_cpu in
ia64*)
shrext_cmds='.so'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.so"
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
if test 32 = "$HPUX_IA64_MODE"; then
sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
sys_lib_dlsearch_path_spec=/usr/lib/hpux32
else
sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
sys_lib_dlsearch_path_spec=/usr/lib/hpux64
fi
;;
hppa*64*)
shrext_cmds='.sl'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.sl"
shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
*)
shrext_cmds='.sl'
dynamic_linker="$host_os dld.sl"
shlibpath_var=SHLIB_PATH
shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
;;
esac
# HP-UX runs *really* slowly unless shared libraries are mode 555, ...
postinstall_cmds='chmod 555 $lib'
# or fails outright, so override atomically:
install_override_mode=555
;;
interix[3-9]*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
irix5* | irix6* | nonstopux*)
case $host_os in
nonstopux*) version_type=nonstopux ;;
*)
if test yes = "$lt_cv_prog_gnu_ld"; then
version_type=linux # correct to gnu/linux during the next big refactor
else
version_type=irix
fi ;;
esac
need_lib_prefix=no
need_version=no
soname_spec='$libname$release$shared_ext$major'
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
case $host_os in
irix5* | nonstopux*)
libsuff= shlibsuff=
;;
*)
case $LD in # libtool.m4 will add one of these switches to LD
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
libsuff= shlibsuff= libmagic=32-bit;;
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
libsuff=32 shlibsuff=N32 libmagic=N32;;
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
libsuff=64 shlibsuff=64 libmagic=64-bit;;
*) libsuff= shlibsuff= libmagic=never-match;;
esac
;;
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
shlibpath_overrides_runpath=no
sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
hardcode_into_libs=yes
;;
# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
linux*android*)
version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext'
soname_spec='$libname$release$shared_ext'
finish_cmds=
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
dynamic_linker='Android linker'
# Don't embed -rpath directories since the linker doesn't support them.
hardcode_libdir_flag_spec='-L$libdir'
;;
# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
# Some binutils ld are patched to set DT_RUNPATH
if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_shlibpath_overrides_runpath=no
save_LDFLAGS=$LDFLAGS
save_libdir=$libdir
eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
libdir=$save_libdir
fi
shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
# Ideally, we could use ldconfig to report *all* directores which are
# searched for libraries, however this is still not possible. Aside from not
# being certain /sbin/ldconfig is available, command
# 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
# even though it is searched at run-time. Try to do the best guess by
# appending ld.so.conf contents (and includes) to the search path.
if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
fi
# We used to test for /lib/ld.so.1 and disable shared libraries on
# powerpc, because MkLinux only supported shared libraries with the
# GNU dynamic linker. Since this was broken with cross compilers,
# most powerpc-linux boxes support dynamic linking these days and
# people can always --disable-shared, the test was removed, and we
# assume the GNU/Linux dynamic linker is in use.
dynamic_linker='GNU/Linux ld.so'
;;
netbsd*)
version_type=sunos
need_lib_prefix=no
need_version=no
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
dynamic_linker='NetBSD (a.out) ld.so'
else
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
dynamic_linker='NetBSD ld.elf_so'
fi
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
newsos6)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
*nto* | *qnx*)
version_type=qnx
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='ldqnx.so'
;;
openbsd* | bitrig*)
version_type=sunos
sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
need_version=no
else
need_version=yes
fi
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
os2*)
libname_spec='$name'
version_type=windows
shrext_cmds=.dll
need_version=no
need_lib_prefix=no
# OS/2 can only load a DLL with a base name of 8 characters or less.
soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
v=$($ECHO $release$versuffix | tr -d .-);
n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
$ECHO $n$v`$shared_ext'
library_names_spec='${libname}_dll.$libext'
dynamic_linker='OS/2 ld.exe'
shlibpath_var=BEGINLIBPATH
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
postinstall_cmds='base_file=`basename \$file`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
chmod a+x \$dldir/$dlname~
if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
fi'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
;;
osf3* | osf4* | osf5*)
version_type=osf
need_lib_prefix=no
need_version=no
soname_spec='$libname$release$shared_ext$major'
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
rdos*)
dynamic_linker=no
;;
solaris*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
# ldd complains unless libraries are executable
postinstall_cmds='chmod +x $lib'
;;
sunos4*)
version_type=sunos
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
if test yes = "$with_gnu_ld"; then
need_lib_prefix=no
fi
need_version=yes
;;
sysv4 | sysv4.3*)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
case $host_vendor in
sni)
shlibpath_overrides_runpath=no
need_lib_prefix=no
runpath_var=LD_RUN_PATH
;;
siemens)
need_lib_prefix=no
;;
motorola)
need_lib_prefix=no
need_version=no
shlibpath_overrides_runpath=no
sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
;;
esac
;;
sysv4*MP*)
if test -d /usr/nec; then
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
soname_spec='$libname$shared_ext.$major'
shlibpath_var=LD_LIBRARY_PATH
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
version_type=sco
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
if test yes = "$with_gnu_ld"; then
sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
else
sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
case $host_os in
sco3.2v5*)
sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
;;
esac
fi
sys_lib_dlsearch_path_spec='/usr/lib'
;;
tpf*)
# TPF is a cross-target only. Preferred cross-host = GNU/Linux.
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
uts4*)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
*)
dynamic_linker=no
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
test no = "$dynamic_linker" && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test yes = "$GCC"; then
variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi
if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
fi
if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
fi
# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action=
if test -n "$hardcode_libdir_flag_spec" ||
test -n "$runpath_var" ||
test yes = "$hardcode_automatic"; then
# We can hardcode non-existent directories.
if test no != "$hardcode_direct" &&
# If the only mechanism to avoid hardcoding is shlibpath_var, we
# have to relink, otherwise we might link with an installed library
# when we should be linking with a yet-to-be-installed one
## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
test no != "$hardcode_minus_L"; then
# Linking always hardcodes the temporary library directory.
hardcode_action=relink
else
# We can link without hardcoding, and we can hardcode nonexisting dirs.
hardcode_action=immediate
fi
else
# We cannot hardcode anything, or else we can only hardcode existing
# directories.
hardcode_action=unsupported
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
$as_echo "$hardcode_action" >&6; }
if test relink = "$hardcode_action" ||
test yes = "$inherit_rpath"; then
# Fast installation is not supported
enable_fast_install=no
elif test yes = "$shlibpath_overrides_runpath" ||
test no = "$enable_shared"; then
# Fast installation is not necessary
enable_fast_install=needless
fi
if test yes != "$enable_dlopen"; then
enable_dlopen=unknown
enable_dlopen_self=unknown
enable_dlopen_self_static=unknown
else
lt_cv_dlopen=no
lt_cv_dlopen_libs=
case $host_os in
beos*)
lt_cv_dlopen=load_add_on
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
;;
mingw* | pw32* | cegcc*)
lt_cv_dlopen=LoadLibrary
lt_cv_dlopen_libs=
;;
cygwin*)
lt_cv_dlopen=dlopen
lt_cv_dlopen_libs=
;;
darwin*)
# if libdl is installed we need to link against it
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
else
lt_cv_dlopen=dyld
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
fi
;;
tpf*)
# Don't try to run any link tests for TPF. We know it's impossible
# because TPF is a cross-compiler, and we know how we open DSOs.
lt_cv_dlopen=dlopen
lt_cv_dlopen_libs=
lt_cv_dlopen_self=no
;;
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = xyes; then :
lt_cv_dlopen=shl_load
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
if ${ac_cv_lib_dld_shl_load+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char shl_load ();
int
main ()
{
return shl_load ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_shl_load=yes
else
ac_cv_lib_dld_shl_load=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
else
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes; then :
lt_cv_dlopen=dlopen
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dl_dlopen=yes
else
ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
if ${ac_cv_lib_svld_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_svld_dlopen=yes
else
ac_cv_lib_svld_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
if ${ac_cv_lib_dld_dld_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char dld_link ();
int
main ()
{
return dld_link ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_dld_dld_link=yes
else
ac_cv_lib_dld_dld_link=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
fi
fi
fi
fi
fi
fi
;;
esac
if test no = "$lt_cv_dlopen"; then
enable_dlopen=no
else
enable_dlopen=yes
fi
case $lt_cv_dlopen in
dlopen)
save_CPPFLAGS=$CPPFLAGS
test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
save_LDFLAGS=$LDFLAGS
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
save_LIBS=$LIBS
LIBS="$lt_cv_dlopen_libs $LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
$as_echo_n "checking whether a program can dlopen itself... " >&6; }
if ${lt_cv_dlopen_self+:} false; then :
$as_echo_n "(cached) " >&6
else
if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line $LINENO "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif
#include <stdio.h>
#ifdef RTLD_GLOBAL
# define LT_DLGLOBAL RTLD_GLOBAL
#else
# ifdef DL_GLOBAL
# define LT_DLGLOBAL DL_GLOBAL
# else
# define LT_DLGLOBAL 0
# endif
#endif
/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
# ifdef RTLD_LAZY
# define LT_DLLAZY_OR_NOW RTLD_LAZY
# else
# ifdef DL_LAZY
# define LT_DLLAZY_OR_NOW DL_LAZY
# else
# ifdef RTLD_NOW
# define LT_DLLAZY_OR_NOW RTLD_NOW
# else
# ifdef DL_NOW
# define LT_DLLAZY_OR_NOW DL_NOW
# else
# define LT_DLLAZY_OR_NOW 0
# endif
# endif
# endif
# endif
#endif
/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif
int fnord () { return 42; }
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
else
{
if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
else puts (dlerror ());
}
/* dlclose (self); */
}
else
puts (dlerror ());
return status;
}
_LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
case x$lt_status in
x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
esac
else :
# compilation failed
lt_cv_dlopen_self=no
fi
fi
rm -fr conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
$as_echo "$lt_cv_dlopen_self" >&6; }
if test yes = "$lt_cv_dlopen_self"; then
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
if ${lt_cv_dlopen_self_static+:} false; then :
$as_echo_n "(cached) " >&6
else
if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self_static=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line $LINENO "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif
#include <stdio.h>
#ifdef RTLD_GLOBAL
# define LT_DLGLOBAL RTLD_GLOBAL
#else
# ifdef DL_GLOBAL
# define LT_DLGLOBAL DL_GLOBAL
# else
# define LT_DLGLOBAL 0
# endif
#endif
/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
# ifdef RTLD_LAZY
# define LT_DLLAZY_OR_NOW RTLD_LAZY
# else
# ifdef DL_LAZY
# define LT_DLLAZY_OR_NOW DL_LAZY
# else
# ifdef RTLD_NOW
# define LT_DLLAZY_OR_NOW RTLD_NOW
# else
# ifdef DL_NOW
# define LT_DLLAZY_OR_NOW DL_NOW
# else
# define LT_DLLAZY_OR_NOW 0
# endif
# endif
# endif
# endif
#endif
/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif
int fnord () { return 42; }
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
else
{
if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
else puts (dlerror ());
}
/* dlclose (self); */
}
else
puts (dlerror ());
return status;
}
_LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
case x$lt_status in
x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
esac
else :
# compilation failed
lt_cv_dlopen_self_static=no
fi
fi
rm -fr conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
$as_echo "$lt_cv_dlopen_self_static" >&6; }
fi
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS
;;
esac
case $lt_cv_dlopen_self in
yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
*) enable_dlopen_self=unknown ;;
esac
case $lt_cv_dlopen_self_static in
yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
*) enable_dlopen_self_static=unknown ;;
esac
fi
striplib=
old_striplib=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
$as_echo_n "checking whether stripping libraries is possible... " >&6; }
if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
test -z "$striplib" && striplib="$STRIP --strip-unneeded"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
# FIXME - insert some real tests, host_os isn't really good enough
case $host_os in
darwin*)
if test -n "$STRIP"; then
striplib="$STRIP -x"
old_striplib="$STRIP -S"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
;;
*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
;;
esac
fi
# Report what library types will actually be built
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
$as_echo_n "checking if libtool supports shared libraries... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
$as_echo "$can_build_shared" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
$as_echo_n "checking whether to build shared libraries... " >&6; }
test no = "$can_build_shared" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
test yes = "$enable_shared" && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
fi
;;
aix[4-9]*)
if test ia64 != "$host_cpu"; then
case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
yes,aix,yes) ;; # shared object as lib.so file only
yes,svr4,*) ;; # shared object as lib.so archive member only
yes,*) enable_static=no ;; # shared object in lib.a archive as well
esac
fi
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
$as_echo "$enable_shared" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
$as_echo_n "checking whether to build static libraries... " >&6; }
# Make sure either enable_shared or enable_static is yes.
test yes = "$enable_shared" || enable_static=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
$as_echo "$enable_static" >&6; }
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
CC=$lt_save_CC
if test -n "$CXX" && ( test no != "$CXX" &&
( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
(test g++ != "$CXX"))); then
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
if test -z "$CXXCPP"; then
if ${ac_cv_prog_CXXCPP+:} false; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CXXCPP needs to be expanded
for CXXCPP in "$CXX -E" "/lib/cpp"
do
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
# <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
Syntax error
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
else
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
# Broken: success on invalid input.
continue
else
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
break
fi
done
ac_cv_prog_CXXCPP=$CXXCPP
fi
CXXCPP=$ac_cv_prog_CXXCPP
else
ac_cv_prog_CXXCPP=$CXXCPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
$as_echo "$CXXCPP" >&6; }
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
# <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
Syntax error
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
else
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
# Broken: success on invalid input.
continue
else
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
else
_lt_caught_CXX_error=yes
fi
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
archive_cmds_need_lc_CXX=no
allow_undefined_flag_CXX=
always_export_symbols_CXX=no
archive_expsym_cmds_CXX=
compiler_needs_object_CXX=no
export_dynamic_flag_spec_CXX=
hardcode_direct_CXX=no
hardcode_direct_absolute_CXX=no
hardcode_libdir_flag_spec_CXX=
hardcode_libdir_separator_CXX=
hardcode_minus_L_CXX=no
hardcode_shlibpath_var_CXX=unsupported
hardcode_automatic_CXX=no
inherit_rpath_CXX=no
module_cmds_CXX=
module_expsym_cmds_CXX=
link_all_deplibs_CXX=unknown
old_archive_cmds_CXX=$old_archive_cmds
reload_flag_CXX=$reload_flag
reload_cmds_CXX=$reload_cmds
no_undefined_flag_CXX=
whole_archive_flag_spec_CXX=
enable_shared_with_static_runtimes_CXX=no
# Source file extension for C++ test sources.
ac_ext=cpp
# Object file extension for compiled C++ test sources.
objext=o
objext_CXX=$objext
# No sense in running all these tests if we already determined that
# the CXX compiler isn't working. Some variables (like enable_shared)
# are currently assumed to apply to all compilers on this platform,
# and will be corrupted by setting them based on a non-working compiler.
if test yes != "$_lt_caught_CXX_error"; then
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;"
# Code to be used in simple link tests
lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
# ltmain only uses $CC for tagged configurations so make sure $CC is set.
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
# save warnings/boilerplate of simple test code
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*
ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*
# Allow CC to be a program name with arguments.
lt_save_CC=$CC
lt_save_CFLAGS=$CFLAGS
lt_save_LD=$LD
lt_save_GCC=$GCC
GCC=$GXX
lt_save_with_gnu_ld=$with_gnu_ld
lt_save_path_LD=$lt_cv_path_LD
if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
else
$as_unset lt_cv_prog_gnu_ld
fi
if test -n "${lt_cv_path_LDCXX+set}"; then
lt_cv_path_LD=$lt_cv_path_LDCXX
else
$as_unset lt_cv_path_LD
fi
test -z "${LDCXX+set}" || LD=$LDCXX
CC=${CXX-"c++"}
CFLAGS=$CXXFLAGS
compiler=$CC
compiler_CXX=$CC
func_cc_basename $compiler
cc_basename=$func_cc_basename_result
if test -n "$compiler"; then
# We don't want -fno-exception when compiling C++ code, so set the
# no_builtin_flag separately
if test yes = "$GXX"; then
lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
else
lt_prog_compiler_no_builtin_flag_CXX=
fi
if test yes = "$GXX"; then
# Set up default GNU C++ configuration
# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
else
with_gnu_ld=no
fi
ac_prog=ld
if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
esac
case $ac_prog in
# Accept absolute paths.
[\\/]* | ?:[\\/]*)
re_direlt='/[^/][^/]*/\.\./'
# Canonicalize the pathname of ld
ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
done
test -z "$LD" && LD=$ac_prog
;;
"")
# If it fails, then pretend we aren't using GCC.
ac_prog=ld
;;
*)
# If it is relative, then search for the first ld in PATH.
with_gnu_ld=unknown
;;
esac
elif test yes = "$with_gnu_ld"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if ${lt_cv_path_LD+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$LD"; then
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
lt_cv_path_LD=$ac_dir/$ac_prog
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
test no != "$with_gnu_ld" && break
;;
*)
test yes != "$with_gnu_ld" && break
;;
esac
fi
done
IFS=$lt_save_ifs
else
lt_cv_path_LD=$LD # Let the user override the test with a path.
fi
fi
LD=$lt_cv_path_LD
if test -n "$LD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${lt_cv_prog_gnu_ld+:} false; then :
$as_echo_n "(cached) " >&6
else
# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
lt_cv_prog_gnu_ld=yes
;;
*)
lt_cv_prog_gnu_ld=no
;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld
# Check if GNU C++ uses GNU ld as the underlying linker, since the
# archiving commands below assume that GNU ld is being used.
if test yes = "$with_gnu_ld"; then
archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
export_dynamic_flag_spec_CXX='$wl--export-dynamic'
# If archive_cmds runs LD, not CC, wlarc should be empty
# XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
# investigate it a little bit more. (MM)
wlarc='$wl'
# ancient GNU ld didn't support --whole-archive et. al.
if eval "`$CC -print-prog-name=ld` --help 2>&1" |
$GREP 'no-whole-archive' > /dev/null; then
whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
whole_archive_flag_spec_CXX=
fi
else
with_gnu_ld=no
wlarc=
# A generic and very simple default shared library creation
# command for GNU C++ for the case where it uses the native
# linker, instead of GNU ld. If possible, this setting should
# overridden to take advantage of the native linker features on
# the platform it is being used on.
archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
fi
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
GXX=no
with_gnu_ld=no
wlarc=
fi
# PORTME: fill in a description of your system's C++ link characteristics
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
ld_shlibs_CXX=yes
case $host_os in
aix3*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
aix[4-9]*)
if test ia64 = "$host_cpu"; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
no_entry_flag=
else
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# have runtime linking enabled, and use it for executables.
# For shared libraries, we enable/disable runtime linking
# depending on the kind of the shared library created -
# when "with_aix_soname,aix_use_runtimelinking" is:
# "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
# "aix,yes" lib.so shared, rtl:yes, for executables
# lib.a static archive
# "both,no" lib.so.V(shr.o) shared, rtl:yes
# lib.a(lib.so.V) shared, rtl:no, for executables
# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
# lib.a(lib.so.V) shared, rtl:no
# "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
# lib.a static archive
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
for ld_flag in $LDFLAGS; do
case $ld_flag in
*-brtl*)
aix_use_runtimelinking=yes
break
;;
esac
done
if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
# With aix-soname=svr4, we create the lib.so.V shared archives only,
# so we don't have lib.a shared libs to link our executables.
# We have to force runtime linking in this case.
aix_use_runtimelinking=yes
LDFLAGS="$LDFLAGS -Wl,-brtl"
fi
;;
esac
exp_sym_flag='-bexport'
no_entry_flag='-bnoentry'
fi
# When large executables or shared objects are built, AIX ld can
# have problems creating the table of contents. If linking a library
# or program results in "error TOC overflow" add -mminimal-toc to
# CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
# enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
archive_cmds_CXX=''
hardcode_direct_CXX=yes
hardcode_direct_absolute_CXX=yes
hardcode_libdir_separator_CXX=':'
link_all_deplibs_CXX=yes
file_list_spec_CXX='$wl-f,'
case $with_aix_soname,$aix_use_runtimelinking in
aix,*) ;; # no import file
svr4,* | *,yes) # use import file
# The Import File defines what to hardcode.
hardcode_direct_CXX=no
hardcode_direct_absolute_CXX=no
;;
esac
if test yes = "$GXX"; then
case $host_os in aix4.[012]|aix4.[012].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
collect2name=`$CC -print-prog-name=collect2`
if test -f "$collect2name" &&
strings "$collect2name" | $GREP resolve_lib_name >/dev/null
then
# We have reworked collect2
:
else
# We have old collect2
hardcode_direct_CXX=unsupported
# It fails to find uninstalled libraries when the uninstalled
# path is not listed in the libpath. Setting hardcode_minus_L
# to unsupported forces relinking
hardcode_minus_L_CXX=yes
hardcode_libdir_flag_spec_CXX='-L$libdir'
hardcode_libdir_separator_CXX=
fi
esac
shared_flag='-shared'
if test yes = "$aix_use_runtimelinking"; then
shared_flag=$shared_flag' $wl-G'
fi
# Need to ensure runtime linking is disabled for the traditional
# shared library, or the linker may eventually find shared libraries
# /with/ Import File - we do not want to mix them.
shared_flag_aix='-shared'
shared_flag_svr4='-shared $wl-G'
else
# not using gcc
if test ia64 = "$host_cpu"; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
if test yes = "$aix_use_runtimelinking"; then
shared_flag='$wl-G'
else
shared_flag='$wl-bM:SRE'
fi
shared_flag_aix='$wl-bM:SRE'
shared_flag_svr4='$wl-G'
fi
fi
export_dynamic_flag_spec_CXX='$wl-bexpall'
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to
# export.
always_export_symbols_CXX=yes
if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
# The "-G" linker flag allows undefined symbols.
no_undefined_flag_CXX='-bernotok'
# Determine the default libpath from the value encoded in an empty
# executable.
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
if ${lt_cv_aix_libpath__CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
/^0/ {
s/^0 *\([^ ]*\) *$/\1/
p
}
}'
lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$lt_cv_aix_libpath__CXX"; then
lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath__CXX"; then
lt_cv_aix_libpath__CXX=/usr/lib:/lib
fi
fi
aix_libpath=$lt_cv_aix_libpath__CXX
fi
hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
else
if test ia64 = "$host_cpu"; then
hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
allow_undefined_flag_CXX="-z nodefs"
archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an
# empty executable.
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
if ${lt_cv_aix_libpath__CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
/^0/ {
s/^0 *\([^ ]*\) *$/\1/
p
}
}'
lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$lt_cv_aix_libpath__CXX"; then
lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath__CXX"; then
lt_cv_aix_libpath__CXX=/usr/lib:/lib
fi
fi
aix_libpath=$lt_cv_aix_libpath__CXX
fi
hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
no_undefined_flag_CXX=' $wl-bernotok'
allow_undefined_flag_CXX=' $wl-berok'
if test yes = "$with_gnu_ld"; then
# We only use this code for GNU lds that support --whole-archive.
whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
else
# Exported symbols can be pulled into shared objects from archives
whole_archive_flag_spec_CXX='$convenience'
fi
archive_cmds_need_lc_CXX=yes
archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
# -brtl affects multiple linker settings, -berok does not and is overridden later
compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
if test svr4 != "$with_aix_soname"; then
# This is similar to how AIX traditionally builds its shared
# libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
fi
if test aix != "$with_aix_soname"; then
archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
else
# used by -dlpreopen to get the symbols
archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
fi
archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
fi
fi
;;
beos*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
allow_undefined_flag_CXX=unsupported
# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
else
ld_shlibs_CXX=no
fi
;;
chorus*)
case $cc_basename in
*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
esac
;;
cygwin* | mingw* | pw32* | cegcc*)
case $GXX,$cc_basename in
,cl* | no,cl*)
# Native MSVC
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
hardcode_libdir_flag_spec_CXX=' '
allow_undefined_flag_CXX=unsupported
always_export_symbols_CXX=yes
file_list_spec_CXX='@'
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
cp "$export_symbols" "$output_objdir/$soname.def";
echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
else
$SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
fi~
$CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
enable_shared_with_static_runtimes_CXX=yes
# Don't use ranlib
old_postinstall_cmds_CXX='chmod 644 $oldlib'
postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
lt_tool_outputfile="@TOOL_OUTPUT@"~
case $lt_outputfile in
*.exe|*.EXE) ;;
*)
lt_outputfile=$lt_outputfile.exe
lt_tool_outputfile=$lt_tool_outputfile.exe
;;
esac~
func_to_tool_file "$lt_outputfile"~
if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
$MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
$RM "$lt_outputfile.manifest";
fi'
;;
*)
# g++
# _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
# as there is no search path for DLLs.
hardcode_libdir_flag_spec_CXX='-L$libdir'
export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
allow_undefined_flag_CXX=unsupported
always_export_symbols_CXX=no
enable_shared_with_static_runtimes_CXX=yes
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
# If the export-symbols file already is a .def file, use it as
# is; otherwise, prepend EXPORTS...
archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
cp $export_symbols $output_objdir/$soname.def;
else
echo EXPORTS > $output_objdir/$soname.def;
cat $export_symbols >> $output_objdir/$soname.def;
fi~
$CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
ld_shlibs_CXX=no
fi
;;
esac
;;
darwin* | rhapsody*)
archive_cmds_need_lc_CXX=no
hardcode_direct_CXX=no
hardcode_automatic_CXX=yes
hardcode_shlibpath_var_CXX=unsupported
if test yes = "$lt_cv_ld_force_load"; then
whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
else
whole_archive_flag_spec_CXX=''
fi
link_all_deplibs_CXX=yes
allow_undefined_flag_CXX=$_lt_dar_allow_undefined
case $cc_basename in
ifort*|nagfor*) _lt_dar_can_shared=yes ;;
*) _lt_dar_can_shared=$GCC ;;
esac
if test yes = "$_lt_dar_can_shared"; then
output_verbose_link_cmd=func_echo_all
archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
if test yes != "$lt_cv_apple_cc_single_mod"; then
archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
fi
else
ld_shlibs_CXX=no
fi
;;
os2*)
hardcode_libdir_flag_spec_CXX='-L$libdir'
hardcode_minus_L_CXX=yes
allow_undefined_flag_CXX=unsupported
shrext_cmds=.dll
archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
$ECHO EXPORTS >> $output_objdir/$libname.def~
emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
$ECHO EXPORTS >> $output_objdir/$libname.def~
prefix_cmds="$SED"~
if test EXPORTS = "`$SED 1q $export_symbols`"; then
prefix_cmds="$prefix_cmds -e 1d";
fi~
prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes_CXX=yes
;;
dgux*)
case $cc_basename in
ec++*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
ghcx*)
# Green Hills C++ Compiler
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
esac
;;
freebsd2.*)
# C++ shared libraries reported to be fairly broken before
# switch to ELF
ld_shlibs_CXX=no
;;
freebsd-elf*)
archive_cmds_need_lc_CXX=no
;;
freebsd* | dragonfly*)
# FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
# conventions
ld_shlibs_CXX=yes
;;
haiku*)
archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
link_all_deplibs_CXX=yes
;;
hpux9*)
hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
hardcode_libdir_separator_CXX=:
export_dynamic_flag_spec_CXX='$wl-E'
hardcode_direct_CXX=yes
hardcode_minus_L_CXX=yes # Not in the search PATH,
# but as the default
# location of the library.
case $cc_basename in
CC*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
aCC*)
archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
fi
;;
esac
;;
hpux10*|hpux11*)
if test no = "$with_gnu_ld"; then
hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
hardcode_libdir_separator_CXX=:
case $host_cpu in
hppa*64*|ia64*)
;;
*)
export_dynamic_flag_spec_CXX='$wl-E'
;;
esac
fi
case $host_cpu in
hppa*64*|ia64*)
hardcode_direct_CXX=no
hardcode_shlibpath_var_CXX=no
;;
*)
hardcode_direct_CXX=yes
hardcode_direct_absolute_CXX=yes
hardcode_minus_L_CXX=yes # Not in the search PATH,
# but as the default
# location of the library.
;;
esac
case $cc_basename in
CC*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
aCC*)
case $host_cpu in
hppa*64*)
archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
if test no = "$with_gnu_ld"; then
case $host_cpu in
hppa*64*)
archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
fi
else
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
fi
;;
esac
;;
interix[3-9]*)
hardcode_direct_CXX=no
hardcode_shlibpath_var_CXX=no
hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
export_dynamic_flag_spec_CXX='$wl-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
irix5* | irix6*)
case $cc_basename in
CC*)
# SGI C++
archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
# Archives containing C++ object files must be created using
# "CC -ar", where "CC" is the IRIX C++ compiler. This is
# necessary to make sure instantiated templates are included
# in the archive.
old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
;;
*)
if test yes = "$GXX"; then
if test no = "$with_gnu_ld"; then
archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
else
archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
fi
fi
link_all_deplibs_CXX=yes
;;
esac
hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
hardcode_libdir_separator_CXX=:
inherit_rpath_CXX=yes
;;
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
export_dynamic_flag_spec_CXX='$wl--export-dynamic'
# Archives containing C++ object files must be created using
# "CC -Bstatic", where "CC" is the KAI C++ compiler.
old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
;;
icpc* | ecpc* )
# Intel C++
with_gnu_ld=yes
# version 8.0 and above of icpc choke on multiply defined symbols
# if we add $predep_objects and $postdep_objects, however 7.1 and
# earlier do not add the objects themselves.
case `$CC -V 2>&1` in
*"Version 7."*)
archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
*) # Version 8.0 or newer
tmp_idyn=
case $host_cpu in
ia64*) tmp_idyn=' -i_dynamic';;
esac
archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
esac
archive_cmds_need_lc_CXX=no
hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
export_dynamic_flag_spec_CXX='$wl--export-dynamic'
whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
;;
pgCC* | pgcpp*)
# Portland Group C++ compiler
case `$CC -V` in
*pgCC\ [1-5].* | *pgcpp\ [1-5].*)
prelink_cmds_CXX='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
old_archive_cmds_CXX='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
$RANLIB $oldlib'
archive_cmds_CXX='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
*) # Version 6 and above use weak symbols
archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
esac
hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
export_dynamic_flag_spec_CXX='$wl--export-dynamic'
whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
;;
cxx*)
# Compaq C++
archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
runpath_var=LD_RUN_PATH
hardcode_libdir_flag_spec_CXX='-rpath $libdir'
hardcode_libdir_separator_CXX=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
;;
xl* | mpixl* | bgxl*)
# IBM XL 8.0 on PPC, with GNU ld
hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
export_dynamic_flag_spec_CXX='$wl--export-dynamic'
archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
;;
*)
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*)
# Sun C++ 5.9
no_undefined_flag_CXX=' -zdefs'
archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
hardcode_libdir_flag_spec_CXX='-R$libdir'
whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object_CXX=yes
# Not sure whether something based on
# $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
# would be better.
output_verbose_link_cmd='func_echo_all'
# Archives containing C++ object files must be created using
# "CC -xar", where "CC" is the Sun C++ compiler. This is
# necessary to make sure instantiated templates are included
# in the archive.
old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
;;
esac
;;
esac
;;
lynxos*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
m88k*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
mvs*)
case $cc_basename in
cxx*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
esac
;;
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
wlarc=
hardcode_libdir_flag_spec_CXX='-R$libdir'
hardcode_direct_CXX=yes
hardcode_shlibpath_var_CXX=no
fi
# Workaround some broken pre-1.5 toolchains
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
;;
*nto* | *qnx*)
ld_shlibs_CXX=yes
;;
openbsd* | bitrig*)
if test -f /usr/libexec/ld.so; then
hardcode_direct_CXX=yes
hardcode_shlibpath_var_CXX=no
hardcode_direct_absolute_CXX=yes
archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
export_dynamic_flag_spec_CXX='$wl-E'
whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
fi
output_verbose_link_cmd=func_echo_all
else
ld_shlibs_CXX=no
fi
;;
osf3* | osf4* | osf5*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
hardcode_libdir_separator_CXX=:
# Archives containing C++ object files must be created using
# the KAI C++ compiler.
case $host in
osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
*) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
esac
;;
RCC*)
# Rational C++ 2.4.1
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
cxx*)
case $host in
osf3*)
allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
;;
*)
allow_undefined_flag_CXX=' -expect_unresolved \*'
archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
echo "-hidden">> $lib.exp~
$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
$RM $lib.exp'
hardcode_libdir_flag_spec_CXX='-rpath $libdir'
;;
esac
hardcode_libdir_separator_CXX=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes,no = "$GXX,$with_gnu_ld"; then
allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
case $host in
osf3*)
archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
;;
*)
archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
;;
esac
hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
hardcode_libdir_separator_CXX=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
fi
;;
esac
;;
psos*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
sunos4*)
case $cc_basename in
CC*)
# Sun C++ 4.x
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
lcc*)
# Lucid
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
esac
;;
solaris*)
case $cc_basename in
CC* | sunCC*)
# Sun C++ 4.2, 5.x and Centerline C++
archive_cmds_need_lc_CXX=yes
no_undefined_flag_CXX=' -zdefs'
archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
$CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
hardcode_libdir_flag_spec_CXX='-R$libdir'
hardcode_shlibpath_var_CXX=no
case $host_os in
solaris2.[0-5] | solaris2.[0-5].*) ;;
*)
# The compiler driver will combine and reorder linker options,
# but understands '-z linker_flag'.
# Supported since Solaris 2.6 (maybe 2.5.1?)
whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
;;
esac
link_all_deplibs_CXX=yes
output_verbose_link_cmd='func_echo_all'
# Archives containing C++ object files must be created using
# "CC -xar", where "CC" is the Sun C++ compiler. This is
# necessary to make sure instantiated templates are included
# in the archive.
old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
;;
gcx*)
# Green Hills C++ Compiler
archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
# The C++ compiler must be used to create the archive.
old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
;;
*)
# GNU C++ compiler with Solaris linker
if test yes,no = "$GXX,$with_gnu_ld"; then
no_undefined_flag_CXX=' $wl-z ${wl}defs'
if $CC --version | $GREP -v '^2\.7' > /dev/null; then
archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
$CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
# g++ 2.7 appears to require '-G' NOT '-shared' on this
# platform.
archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
$CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
fi
hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
case $host_os in
solaris2.[0-5] | solaris2.[0-5].*) ;;
*)
whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
;;
esac
fi
;;
esac
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
no_undefined_flag_CXX='$wl-z,text'
archive_cmds_need_lc_CXX=no
hardcode_shlibpath_var_CXX=no
runpath_var='LD_RUN_PATH'
case $cc_basename in
CC*)
archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
sysv5* | sco3.2v5* | sco5v6*)
# Note: We CANNOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
no_undefined_flag_CXX='$wl-z,text'
allow_undefined_flag_CXX='$wl-z,nodefs'
archive_cmds_need_lc_CXX=no
hardcode_shlibpath_var_CXX=no
hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
hardcode_libdir_separator_CXX=':'
link_all_deplibs_CXX=yes
export_dynamic_flag_spec_CXX='$wl-Bexport'
runpath_var='LD_RUN_PATH'
case $cc_basename in
CC*)
archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
'"$old_archive_cmds_CXX"
reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
'"$reload_cmds_CXX"
;;
*)
archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
tandem*)
case $cc_basename in
NCC*)
# NonStop-UX NCC 3.20
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
esac
;;
vxworks*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
$as_echo "$ld_shlibs_CXX" >&6; }
test no = "$ld_shlibs_CXX" && can_build_shared=no
GCC_CXX=$GXX
LD_CXX=$LD
## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
## the running order or otherwise move them around unless you know exactly
## what you are doing...
# Dependencies to place before and after the object being linked:
predep_objects_CXX=
postdep_objects_CXX=
predeps_CXX=
postdeps_CXX=
compiler_lib_search_path_CXX=
cat > conftest.$ac_ext <<_LT_EOF
class Foo
{
public:
Foo (void) { a = 0; }
private:
int a;
};
_LT_EOF
_lt_libdeps_save_CFLAGS=$CFLAGS
case "$CC $CFLAGS " in #(
*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
esac
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
# Parse the compiler output and extract the necessary
# objects, libraries and library flags.
# Sentinel used to keep track of whether or not we are before
# the conftest object file.
pre_test_object_deps_done=no
for p in `eval "$output_verbose_link_cmd"`; do
case $prev$p in
-L* | -R* | -l*)
# Some compilers place space between "-{L,R}" and the path.
# Remove the space.
if test x-L = "$p" ||
test x-R = "$p"; then
prev=$p
continue
fi
# Expand the sysroot to ease extracting the directories later.
if test -z "$prev"; then
case $p in
-L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
esac
fi
case $p in
=*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
esac
if test no = "$pre_test_object_deps_done"; then
case $prev in
-L | -R)
# Internal compiler library paths should come after those
# provided the user. The postdeps already come after the
# user supplied libs so there is no need to process them.
if test -z "$compiler_lib_search_path_CXX"; then
compiler_lib_search_path_CXX=$prev$p
else
compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
fi
;;
# The "-l" case would never come before the object being
# linked, so don't bother handling this case.
esac
else
if test -z "$postdeps_CXX"; then
postdeps_CXX=$prev$p
else
postdeps_CXX="${postdeps_CXX} $prev$p"
fi
fi
prev=
;;
*.lto.$objext) ;; # Ignore GCC LTO objects
*.$objext)
# This assumes that the test object file only shows up
# once in the compiler output.
if test "$p" = "conftest.$objext"; then
pre_test_object_deps_done=yes
continue
fi
if test no = "$pre_test_object_deps_done"; then
if test -z "$predep_objects_CXX"; then
predep_objects_CXX=$p
else
predep_objects_CXX="$predep_objects_CXX $p"
fi
else
if test -z "$postdep_objects_CXX"; then
postdep_objects_CXX=$p
else
postdep_objects_CXX="$postdep_objects_CXX $p"
fi
fi
;;
*) ;; # Ignore the rest.
esac
done
# Clean up.
rm -f a.out a.exe
else
echo "libtool.m4: error: problem compiling CXX test program"
fi
$RM -f confest.$objext
CFLAGS=$_lt_libdeps_save_CFLAGS
# PORTME: override above test on systems where it is broken
case $host_os in
interix[3-9]*)
# Interix 3.5 installs completely hosed .la files for C++, so rather than
# hack all around it, let's just trust "g++" to DTRT.
predep_objects_CXX=
postdep_objects_CXX=
postdeps_CXX=
;;
esac
case " $postdeps_CXX " in
*" -lc "*) archive_cmds_need_lc_CXX=no ;;
esac
compiler_lib_search_dirs_CXX=
if test -n "${compiler_lib_search_path_CXX}"; then
compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
fi
lt_prog_compiler_wl_CXX=
lt_prog_compiler_pic_CXX=
lt_prog_compiler_static_CXX=
# C++ specific cases for pic, static, wl, etc.
if test yes = "$GXX"; then
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_static_CXX='-static'
case $host_os in
aix*)
# All AIX code is PIC.
if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
fi
lt_prog_compiler_pic_CXX='-fPIC'
;;
amigaos*)
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
lt_prog_compiler_pic_CXX='-fPIC'
;;
m68k)
# FIXME: we need at least 68020 code to build shared libraries, but
# adding the '-m68020' flag to GCC prevents building anything better,
# like '-m68040'.
lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
;;
esac
;;
beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
mingw* | cygwin* | os2* | pw32* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
# Although the cygwin gcc ignores -fPIC, still need this for old-style
# (--disable-auto-import) libraries
lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
case $host_os in
os2*)
lt_prog_compiler_static_CXX='$wl-static'
;;
esac
;;
darwin* | rhapsody*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
lt_prog_compiler_pic_CXX='-fno-common'
;;
*djgpp*)
# DJGPP does not support shared libraries at all
lt_prog_compiler_pic_CXX=
;;
haiku*)
# PIC is the default for Haiku.
# The "-static" flag exists, but is broken.
lt_prog_compiler_static_CXX=
;;
interix[3-9]*)
# Interix 3.x gcc -fpic/-fPIC options generate broken code.
# Instead, we relocate shared libraries at runtime.
;;
sysv4*MP*)
if test -d /usr/nec; then
lt_prog_compiler_pic_CXX=-Kconform_pic
fi
;;
hpux*)
# PIC is the default for 64-bit PA HP-UX, but not for 32-bit
# PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
# sets the default TLS model and affects inlining.
case $host_cpu in
hppa*64*)
;;
*)
lt_prog_compiler_pic_CXX='-fPIC'
;;
esac
;;
*qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
# it will coredump.
lt_prog_compiler_pic_CXX='-fPIC -shared'
;;
*)
lt_prog_compiler_pic_CXX='-fPIC'
;;
esac
else
case $host_os in
aix[4-9]*)
# All AIX code is PIC.
if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
else
lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
fi
;;
chorus*)
case $cc_basename in
cxch68*)
# Green Hills C++ Compiler
# _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
;;
esac
;;
mingw* | cygwin* | os2* | pw32* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
;;
dgux*)
case $cc_basename in
ec++*)
lt_prog_compiler_pic_CXX='-KPIC'
;;
ghcx*)
# Green Hills C++ Compiler
lt_prog_compiler_pic_CXX='-pic'
;;
*)
;;
esac
;;
freebsd* | dragonfly*)
# FreeBSD uses GNU C++
;;
hpux9* | hpux10* | hpux11*)
case $cc_basename in
CC*)
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
if test ia64 != "$host_cpu"; then
lt_prog_compiler_pic_CXX='+Z'
fi
;;
aCC*)
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
lt_prog_compiler_pic_CXX='+Z'
;;
esac
;;
*)
;;
esac
;;
interix*)
# This is c89, which is MS Visual C++ (no shared libs)
# Anyone wants to do a port?
;;
irix5* | irix6* | nonstopux*)
case $cc_basename in
CC*)
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_static_CXX='-non_shared'
# CC pic flag -KPIC is the default.
;;
*)
;;
esac
;;
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
KCC*)
# KAI C++ Compiler
lt_prog_compiler_wl_CXX='--backend -Wl,'
lt_prog_compiler_pic_CXX='-fPIC'
;;
ecpc* )
# old Intel C++ for x86_64, which still supported -KPIC.
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_pic_CXX='-KPIC'
lt_prog_compiler_static_CXX='-static'
;;
icpc* )
# Intel C++, used to be incompatible with GCC.
# ICC 10 doesn't accept -KPIC any more.
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_pic_CXX='-fPIC'
lt_prog_compiler_static_CXX='-static'
;;
pgCC* | pgcpp*)
# Portland Group C++ compiler
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_pic_CXX='-fpic'
lt_prog_compiler_static_CXX='-Bstatic'
;;
cxx*)
# Compaq C++
# Make sure the PIC flag is empty. It appears that all Alpha
# Linux and Compaq Tru64 Unix objects are PIC.
lt_prog_compiler_pic_CXX=
lt_prog_compiler_static_CXX='-non_shared'
;;
xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
# IBM XL 8.0, 9.0 on PPC and BlueGene
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_pic_CXX='-qpic'
lt_prog_compiler_static_CXX='-qstaticlink'
;;
*)
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*)
# Sun C++ 5.9
lt_prog_compiler_pic_CXX='-KPIC'
lt_prog_compiler_static_CXX='-Bstatic'
lt_prog_compiler_wl_CXX='-Qoption ld '
;;
esac
;;
esac
;;
lynxos*)
;;
m88k*)
;;
mvs*)
case $cc_basename in
cxx*)
lt_prog_compiler_pic_CXX='-W c,exportall'
;;
*)
;;
esac
;;
netbsd*)
;;
*qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
# it will coredump.
lt_prog_compiler_pic_CXX='-fPIC -shared'
;;
osf3* | osf4* | osf5*)
case $cc_basename in
KCC*)
lt_prog_compiler_wl_CXX='--backend -Wl,'
;;
RCC*)
# Rational C++ 2.4.1
lt_prog_compiler_pic_CXX='-pic'
;;
cxx*)
# Digital/Compaq C++
lt_prog_compiler_wl_CXX='-Wl,'
# Make sure the PIC flag is empty. It appears that all Alpha
# Linux and Compaq Tru64 Unix objects are PIC.
lt_prog_compiler_pic_CXX=
lt_prog_compiler_static_CXX='-non_shared'
;;
*)
;;
esac
;;
psos*)
;;
solaris*)
case $cc_basename in
CC* | sunCC*)
# Sun C++ 4.2, 5.x and Centerline C++
lt_prog_compiler_pic_CXX='-KPIC'
lt_prog_compiler_static_CXX='-Bstatic'
lt_prog_compiler_wl_CXX='-Qoption ld '
;;
gcx*)
# Green Hills C++ Compiler
lt_prog_compiler_pic_CXX='-PIC'
;;
*)
;;
esac
;;
sunos4*)
case $cc_basename in
CC*)
# Sun C++ 4.x
lt_prog_compiler_pic_CXX='-pic'
lt_prog_compiler_static_CXX='-Bstatic'
;;
lcc*)
# Lucid
lt_prog_compiler_pic_CXX='-pic'
;;
*)
;;
esac
;;
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
case $cc_basename in
CC*)
lt_prog_compiler_wl_CXX='-Wl,'
lt_prog_compiler_pic_CXX='-KPIC'
lt_prog_compiler_static_CXX='-Bstatic'
;;
esac
;;
tandem*)
case $cc_basename in
NCC*)
# NonStop-UX NCC 3.20
lt_prog_compiler_pic_CXX='-KPIC'
;;
*)
;;
esac
;;
vxworks*)
;;
*)
lt_prog_compiler_can_build_shared_CXX=no
;;
esac
fi
case $host_os in
# For platforms that do not support PIC, -DPIC is meaningless:
*djgpp*)
lt_prog_compiler_pic_CXX=
;;
*)
lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic_CXX"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_pic_works_CXX=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
# The option is referenced via a variable to avoid confusing sed.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_pic_works_CXX=yes
fi
fi
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
case $lt_prog_compiler_pic_CXX in
"" | " "*) ;;
*) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
esac
else
lt_prog_compiler_pic_CXX=
lt_prog_compiler_can_build_shared_CXX=no
fi
fi
#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_static_works_CXX=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
# The linker can only warn and ignore the option if not recognized
# So say no if there are warnings
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&5
$ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_static_works_CXX=yes
fi
else
lt_cv_prog_compiler_static_works_CXX=yes
fi
fi
$RM -r conftest*
LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
:
else
lt_prog_compiler_static_CXX=
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_c_o_CXX=no
$RM -r conftest 2>/dev/null
mkdir conftest
cd conftest
mkdir out
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-o out/conftest2.$ac_objext"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o_CXX=yes
fi
fi
chmod u+w . 2>&5
$RM conftest*
# SGI C++ compiler will create directory out/ii_files/ for
# template instantiation
test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
$RM out/* && rmdir out
cd ..
$RM -r conftest
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_c_o_CXX=no
$RM -r conftest 2>/dev/null
mkdir conftest
cd conftest
mkdir out
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-o out/conftest2.$ac_objext"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
$ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o_CXX=yes
fi
fi
chmod u+w . 2>&5
$RM conftest*
# SGI C++ compiler will create directory out/ii_files/ for
# template instantiation
test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
$RM out/* && rmdir out
cd ..
$RM -r conftest
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
hard_links=nottested
if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
# do not overwrite the value of need_locks provided by the user
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
hard_links=yes
$RM conftest*
ln conftest.a conftest.b 2>/dev/null && hard_links=no
touch conftest.a
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
if test no = "$hard_links"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
need_locks=warn
fi
else
need_locks=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
case $host_os in
aix[4-9]*)
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to GNU nm, but means don't demangle to AIX nm.
# Without the "-l" option, or with the "-B" option, AIX nm treats
# weak defined symbols like other global defined symbols, whereas
# GNU nm marks them as "W".
# While the 'weak' keyword is ignored in the Export File, we need
# it in the Import File for the 'aix-soname' feature, so we have
# to replace the "-B" option with "-P" for AIX nm.
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
export_symbols_cmds_CXX=$ltdll_cmds
;;
cygwin* | mingw* | cegcc*)
case $cc_basename in
cl*)
exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
;;
*)
export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
;;
esac
;;
*)
export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
$as_echo "$ld_shlibs_CXX" >&6; }
test no = "$ld_shlibs_CXX" && can_build_shared=no
with_gnu_ld_CXX=$with_gnu_ld
#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc_CXX" in
x|xyes)
# Assume -lc should be added
archive_cmds_need_lc_CXX=yes
if test yes,yes = "$GCC,$enable_shared"; then
case $archive_cmds_CXX in
*'~'*)
# FIXME: we may have to deal with multi-command sequences.
;;
'$CC '*)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
$RM conftest*
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } 2>conftest.err; then
soname=conftest
lib=conftest
libobjs=conftest.$ac_objext
deplibs=
wl=$lt_prog_compiler_wl_CXX
pic_flag=$lt_prog_compiler_pic_CXX
compiler_flags=-v
linker_flags=-v
verstring=
output_objdir=.
libname=conftest
lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
allow_undefined_flag_CXX=
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
(eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
then
lt_cv_archive_cmds_need_lc_CXX=no
else
lt_cv_archive_cmds_need_lc_CXX=yes
fi
allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
else
cat conftest.err 1>&5
fi
$RM conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
;;
esac
fi
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no
# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown
case $host_os in
aix3*)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
shlibpath_var=LIBPATH
# AIX 3 has no versioning support, so we append a major version to the name.
soname_spec='$libname$release$shared_ext$major'
;;
aix[4-9]*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
if test ia64 = "$host_cpu"; then
# AIX 5 supports IA64
library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
else
# With GCC up to 2.95.x, collect2 would create an import file
# for dependence libraries. The import file would start with
# the line '#! .'. This would cause the generated library to
# depend on '.', always an invalid library. This was fixed in
# development snapshots of GCC prior to 3.0.
case $host_os in
aix4 | aix4.[01] | aix4.[01].*)
if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
echo ' yes '
echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
:
else
can_build_shared=no
fi
;;
esac
# Using Import Files as archive members, it is possible to support
# filename-based versioning of shared library archives on AIX. While
# this would work for both with and without runtime linking, it will
# prevent static linking of such archives. So we do filename-based
# shared library versioning with .so extension only, which is used
# when both runtime linking and shared linking is enabled.
# Unfortunately, runtime linking may impact performance, so we do
# not want this to be the default eventually. Also, we use the
# versioned .so libs for executables only if there is the -brtl
# linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
# To allow for filename-based versioning support, we need to create
# libNAME.so.V as an archive file, containing:
# *) an Import File, referring to the versioned filename of the
# archive as well as the shared archive member, telling the
# bitwidth (32 or 64) of that shared object, and providing the
# list of exported symbols of that shared object, eventually
# decorated with the 'weak' keyword
# *) the shared object with the F_LOADONLY flag set, to really avoid
# it being seen by the linker.
# At run time we better use the real file rather than another symlink,
# but for link time we create the symlink libNAME.so -> libNAME.so.V
case $with_aix_soname,$aix_use_runtimelinking in
# AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
# soname into executable. Probably we can add versioning support to
# collect2, so additional links can be useful in future.
aix,yes) # traditional libtool
dynamic_linker='AIX unversionable lib.so'
# If using run time linking (on AIX 4.2 or later) use lib<name>.so
# instead of lib<name>.a to let people know that these are not
# typical AIX shared libraries.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
;;
aix,no) # traditional AIX only
dynamic_linker='AIX lib.a(lib.so.V)'
# We preserve .a as extension for shared libraries through AIX4.2
# and later when we are not doing run time linking.
library_names_spec='$libname$release.a $libname.a'
soname_spec='$libname$release$shared_ext$major'
;;
svr4,*) # full svr4 only
dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
# We do not specify a path in Import Files, so LIBPATH fires.
shlibpath_overrides_runpath=yes
;;
*,yes) # both, prefer svr4
dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
# unpreferred sharedlib libNAME.a needs extra handling
postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
# We do not specify a path in Import Files, so LIBPATH fires.
shlibpath_overrides_runpath=yes
;;
*,no) # both, prefer aix
dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
library_names_spec='$libname$release.a $libname.a'
soname_spec='$libname$release$shared_ext$major'
# unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
;;
esac
shlibpath_var=LIBPATH
fi
;;
amigaos*)
case $host_cpu in
powerpc)
# Since July 2007 AmigaOS4 officially supports .so libraries.
# When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
;;
m68k)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
esac
;;
beos*)
library_names_spec='$libname$shared_ext'
dynamic_linker="$host_os ld.so"
shlibpath_var=LIBRARY_PATH
;;
bsdi[45]*)
version_type=linux # correct to gnu/linux during the next big refactor
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
# the default ld.so.conf also contains /usr/contrib/lib and
# /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
# libtool to hard-code these into programs
;;
cygwin* | mingw* | pw32* | cegcc*)
version_type=windows
shrext_cmds=.dll
need_version=no
need_lib_prefix=no
case $GCC,$cc_basename in
yes,*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \$file`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
chmod a+x \$dldir/$dlname~
if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
fi'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
shlibpath_overrides_runpath=yes
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
mingw* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
*,cl*)
# Native MSVC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
case $build_os in
mingw*)
sys_lib_search_path_spec=
lt_save_ifs=$IFS
IFS=';'
for lt_path in $LIB
do
IFS=$lt_save_ifs
# Let DOS variable expansion print the short 8.3 style file name.
lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
done
IFS=$lt_save_ifs
# Convert to MSYS style.
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
# but this time dos style (no spaces!) so that the unix form looks
# like /cygdrive/c/PROGRA~1:/cygdr...
sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
;;
*)
sys_lib_search_path_spec=$LIB
if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
# It is most probably a Windows format PATH.
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
else
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
fi
# FIXME: find the short name or the path components, as spaces are
# common. (e.g. "Program Files" -> "PROGRA~1")
;;
esac
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \$file`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
shlibpath_overrides_runpath=yes
dynamic_linker='Win32 link.exe'
;;
*)
# Assume MSVC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
esac
# FIXME: first we should search . and the directory the executable is in
shlibpath_var=PATH
;;
darwin* | rhapsody*)
dynamic_linker="$host_os dyld"
version_type=darwin
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
soname_spec='$libname$release$major$shared_ext'
shlibpath_overrides_runpath=yes
shlibpath_var=DYLD_LIBRARY_PATH
shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
;;
dgux*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
objformat=`/usr/bin/objformat`
else
case $host_os in
freebsd[23].*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
version_type=freebsd-$objformat
case $version_type in
freebsd-elf*)
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
need_version=no
need_lib_prefix=no
;;
freebsd-*)
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
need_version=yes
;;
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
freebsd2.*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[01]* | freebsdelf3.[01]*)
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
*) # from 4.6 on, and DragonFly
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
esac
;;
haiku*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
dynamic_linker="$host_os runtime_loader"
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
shlibpath_overrides_runpath=no
sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
hardcode_into_libs=yes
;;
hpux9* | hpux10* | hpux11*)
# Give a soname corresponding to the major version so that dld.sl refuses to
# link against other versions.
version_type=sunos
need_lib_prefix=no
need_version=no
case $host_cpu in
ia64*)
shrext_cmds='.so'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.so"
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
if test 32 = "$HPUX_IA64_MODE"; then
sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
sys_lib_dlsearch_path_spec=/usr/lib/hpux32
else
sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
sys_lib_dlsearch_path_spec=/usr/lib/hpux64
fi
;;
hppa*64*)
shrext_cmds='.sl'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.sl"
shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
*)
shrext_cmds='.sl'
dynamic_linker="$host_os dld.sl"
shlibpath_var=SHLIB_PATH
shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
;;
esac
# HP-UX runs *really* slowly unless shared libraries are mode 555, ...
postinstall_cmds='chmod 555 $lib'
# or fails outright, so override atomically:
install_override_mode=555
;;
interix[3-9]*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
irix5* | irix6* | nonstopux*)
case $host_os in
nonstopux*) version_type=nonstopux ;;
*)
if test yes = "$lt_cv_prog_gnu_ld"; then
version_type=linux # correct to gnu/linux during the next big refactor
else
version_type=irix
fi ;;
esac
need_lib_prefix=no
need_version=no
soname_spec='$libname$release$shared_ext$major'
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
case $host_os in
irix5* | nonstopux*)
libsuff= shlibsuff=
;;
*)
case $LD in # libtool.m4 will add one of these switches to LD
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
libsuff= shlibsuff= libmagic=32-bit;;
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
libsuff=32 shlibsuff=N32 libmagic=N32;;
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
libsuff=64 shlibsuff=64 libmagic=64-bit;;
*) libsuff= shlibsuff= libmagic=never-match;;
esac
;;
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
shlibpath_overrides_runpath=no
sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
hardcode_into_libs=yes
;;
# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
linux*android*)
version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext'
soname_spec='$libname$release$shared_ext'
finish_cmds=
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
dynamic_linker='Android linker'
# Don't embed -rpath directories since the linker doesn't support them.
hardcode_libdir_flag_spec_CXX='-L$libdir'
;;
# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
# Some binutils ld are patched to set DT_RUNPATH
if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_shlibpath_overrides_runpath=no
save_LDFLAGS=$LDFLAGS
save_libdir=$libdir
eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
libdir=$save_libdir
fi
shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
# Ideally, we could use ldconfig to report *all* directores which are
# searched for libraries, however this is still not possible. Aside from not
# being certain /sbin/ldconfig is available, command
# 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
# even though it is searched at run-time. Try to do the best guess by
# appending ld.so.conf contents (and includes) to the search path.
if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
fi
# We used to test for /lib/ld.so.1 and disable shared libraries on
# powerpc, because MkLinux only supported shared libraries with the
# GNU dynamic linker. Since this was broken with cross compilers,
# most powerpc-linux boxes support dynamic linking these days and
# people can always --disable-shared, the test was removed, and we
# assume the GNU/Linux dynamic linker is in use.
dynamic_linker='GNU/Linux ld.so'
;;
netbsd*)
version_type=sunos
need_lib_prefix=no
need_version=no
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
dynamic_linker='NetBSD (a.out) ld.so'
else
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
dynamic_linker='NetBSD ld.elf_so'
fi
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
newsos6)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
*nto* | *qnx*)
version_type=qnx
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='ldqnx.so'
;;
openbsd* | bitrig*)
version_type=sunos
sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
need_version=no
else
need_version=yes
fi
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
os2*)
libname_spec='$name'
version_type=windows
shrext_cmds=.dll
need_version=no
need_lib_prefix=no
# OS/2 can only load a DLL with a base name of 8 characters or less.
soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
v=$($ECHO $release$versuffix | tr -d .-);
n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
$ECHO $n$v`$shared_ext'
library_names_spec='${libname}_dll.$libext'
dynamic_linker='OS/2 ld.exe'
shlibpath_var=BEGINLIBPATH
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
postinstall_cmds='base_file=`basename \$file`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
chmod a+x \$dldir/$dlname~
if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
fi'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
;;
osf3* | osf4* | osf5*)
version_type=osf
need_lib_prefix=no
need_version=no
soname_spec='$libname$release$shared_ext$major'
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
rdos*)
dynamic_linker=no
;;
solaris*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
# ldd complains unless libraries are executable
postinstall_cmds='chmod +x $lib'
;;
sunos4*)
version_type=sunos
library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
if test yes = "$with_gnu_ld"; then
need_lib_prefix=no
fi
need_version=yes
;;
sysv4 | sysv4.3*)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
case $host_vendor in
sni)
shlibpath_overrides_runpath=no
need_lib_prefix=no
runpath_var=LD_RUN_PATH
;;
siemens)
need_lib_prefix=no
;;
motorola)
need_lib_prefix=no
need_version=no
shlibpath_overrides_runpath=no
sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
;;
esac
;;
sysv4*MP*)
if test -d /usr/nec; then
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
soname_spec='$libname$shared_ext.$major'
shlibpath_var=LD_LIBRARY_PATH
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
version_type=sco
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
if test yes = "$with_gnu_ld"; then
sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
else
sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
case $host_os in
sco3.2v5*)
sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
;;
esac
fi
sys_lib_dlsearch_path_spec='/usr/lib'
;;
tpf*)
# TPF is a cross-target only. Preferred cross-host = GNU/Linux.
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
uts4*)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
*)
dynamic_linker=no
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
test no = "$dynamic_linker" && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test yes = "$GCC"; then
variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi
if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
fi
if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
fi
# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action_CXX=
if test -n "$hardcode_libdir_flag_spec_CXX" ||
test -n "$runpath_var_CXX" ||
test yes = "$hardcode_automatic_CXX"; then
# We can hardcode non-existent directories.
if test no != "$hardcode_direct_CXX" &&
# If the only mechanism to avoid hardcoding is shlibpath_var, we
# have to relink, otherwise we might link with an installed library
# when we should be linking with a yet-to-be-installed one
## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
test no != "$hardcode_minus_L_CXX"; then
# Linking always hardcodes the temporary library directory.
hardcode_action_CXX=relink
else
# We can link without hardcoding, and we can hardcode nonexisting dirs.
hardcode_action_CXX=immediate
fi
else
# We cannot hardcode anything, or else we can only hardcode existing
# directories.
hardcode_action_CXX=unsupported
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
$as_echo "$hardcode_action_CXX" >&6; }
if test relink = "$hardcode_action_CXX" ||
test yes = "$inherit_rpath_CXX"; then
# Fast installation is not supported
enable_fast_install=no
elif test yes = "$shlibpath_overrides_runpath" ||
test no = "$enable_shared"; then
# Fast installation is not necessary
enable_fast_install=needless
fi
fi # test -n "$compiler"
CC=$lt_save_CC
CFLAGS=$lt_save_CFLAGS
LDCXX=$LD
LD=$lt_save_LD
GCC=$lt_save_GCC
with_gnu_ld=$lt_save_with_gnu_ld
lt_cv_path_LDCXX=$lt_cv_path_LD
lt_cv_path_LD=$lt_save_path_LD
lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
fi # test yes != "$_lt_caught_CXX_error"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
ac_config_commands="$ac_config_commands libtool"
# Only expand once:
# Check whether --enable-experimental-libtool was given.
if test "${enable_experimental_libtool+set}" = set; then :
enableval=$enable_experimental_libtool; experimental_libtool=$enableval
else
experimental_libtool=no
fi
if test "$experimental_libtool" = "yes"; then
echo "using APR's libtool"
sh_libtool="`$apr_config --apr-libtool`"
LIBTOOL="$sh_libtool"
SVN_LIBTOOL="$sh_libtool"
else
sh_libtool="$abs_builddir/libtool"
SVN_LIBTOOL="\$(SHELL) \"$sh_libtool\""
fi
lt_pversion=`$LIBTOOL --version 2>/dev/null|$SED -e 's/([^)]*)//g;s/^[^0-9]*//;s/[- ].*//g;q'`
lt_version=`echo $lt_pversion|$SED -e 's/\([a-z]*\)$/.\1/'`
lt_major_version=`echo $lt_version | cut -d'.' -f 1`
svn_enable_static=yes
svn_enable_shared=yes
# Check whether --enable-static was given.
if test "${enable_static+set}" = set; then :
enableval=$enable_static; svn_enable_static="$enableval"
else
svn_enable_static="yes"
fi
# Check whether --enable-shared was given.
if test "${enable_shared+set}" = set; then :
enableval=$enable_shared; svn_enable_shared="$enableval"
else
svn_enable_shared="yes"
fi
if test "$svn_enable_static" = "yes" && test "$svn_enable_shared" = "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: building both shared and static libraries" >&5
$as_echo "$as_me: building both shared and static libraries" >&6;}
elif test "$svn_enable_static" = "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: building static libraries only" >&5
$as_echo "$as_me: building static libraries only" >&6;}
LT_CFLAGS="-static $LT_CFLAGS"
LT_LDFLAGS="-static $LT_LDFLAGS"
elif test "$svn_enable_shared" = "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: building shared libraries only" >&5
$as_echo "$as_me: building shared libraries only" >&6;}
if test "$lt_major_version" = "1" ; then
LT_CFLAGS="-prefer-pic $LT_CFLAGS"
elif test "$lt_major_version" = "2" ; then
LT_CFLAGS="-shared $LT_CFLAGS"
fi
LT_LDFLAGS="-shared $LT_LDFLAGS"
else
as_fn_error $? "cannot disable both shared and static libraries" "$LINENO" 5
fi
# Check whether --enable-all-static was given.
if test "${enable_all_static+set}" = set; then :
enableval=$enable_all_static;
if test "$enableval" = "yes" ; then
LT_LDFLAGS="-all-static $LT_LDFLAGS"
elif test "$enableval" != "no" ; then
as_fn_error $? "--enable-all-static doesn't accept argument" "$LINENO" 5
fi
fi
# Check whether --enable-local-library-preloading was given.
if test "${enable_local_library_preloading+set}" = set; then :
enableval=$enable_local_library_preloading;
if test "$enableval" != "no"; then
if test "$svn_enable_shared" = "yes"; then
TRANSFORM_LIBTOOL_SCRIPTS="transform-libtool-scripts"
else
as_fn_error $? "--enable-local-library-preloading conflicts with --disable-shared" "$LINENO" 5
fi
else
TRANSFORM_LIBTOOL_SCRIPTS=""
fi
else
TRANSFORM_LIBTOOL_SCRIPTS=""
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libtool needs -no-undefined" >&5
$as_echo_n "checking whether libtool needs -no-undefined... " >&6; }
case $host in
*-*-cygwin*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
LT_NO_UNDEFINED="-no-undefined"
;;
*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
LT_NO_UNDEFINED=""
;;
esac
trang=yes
# Check whether --with-trang was given.
if test "${with_trang+set}" = set; then :
withval=$with_trang;
trang="$withval"
fi
if test "$trang" = "yes"; then
# Extract the first word of "trang", so it can be a program name with args.
set dummy trang; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_TRANG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TRANG in
[\\/]* | ?:[\\/]*)
ac_cv_path_TRANG="$TRANG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_TRANG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_TRANG" && ac_cv_path_TRANG="none"
;;
esac
fi
TRANG=$ac_cv_path_TRANG
if test -n "$TRANG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRANG" >&5
$as_echo "$TRANG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
TRANG="$trang"
fi
doxygen=yes
# Check whether --with-doxygen was given.
if test "${with_doxygen+set}" = set; then :
withval=$with_doxygen;
doxygen="$withval"
fi
if test "$doxygen" = "yes"; then
# Extract the first word of "doxygen", so it can be a program name with args.
set dummy doxygen; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_DOXYGEN+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DOXYGEN in
[\\/]* | ?:[\\/]*)
ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_DOXYGEN" && ac_cv_path_DOXYGEN="none"
;;
esac
fi
DOXYGEN=$ac_cv_path_DOXYGEN
if test -n "$DOXYGEN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5
$as_echo "$DOXYGEN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
DOXYGEN="$doxygen"
fi
# Check whether --with-expat was given.
if test "${with_expat+set}" = set; then :
withval=$with_expat; svn_lib_expat="$withval"
else
svn_lib_expat="::expat"
fi
# APR-util accepts "builtin" as an argument to this option so if the user
# passed "builtin" pretend the user didn't specify the --with-expat option
# at all. Expat will (hopefully) be found in apr-util.
test "_$svn_lib_expat" = "_builtin" && svn_lib_expat="::expat"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Expat" >&5
$as_echo_n "checking for Expat... " >&6; }
if test -n "`echo "$svn_lib_expat" | $EGREP ":.*:"`"; then
SVN_XML_INCLUDES=""
for i in `echo "$svn_lib_expat" | $SED -e "s/\([^:]*\):.*/\1/"`; do
SVN_XML_INCLUDES="$SVN_XML_INCLUDES -I$i"
done
SVN_XML_INCLUDES="${SVN_XML_INCLUDES## }"
for l in `echo "$svn_lib_expat" | $SED -e "s/.*:\([^:]*\):.*/\1/"`; do
LDFLAGS="$LDFLAGS -L$l"
done
for l in `echo "$svn_lib_expat" | $SED -e "s/.*:\([^:]*\)/\1/"`; do
SVN_XML_LIBS="$SVN_XML_LIBS -l$l"
done
SVN_XML_LIBS="${SVN_XML_LIBS## }"
old_CPPFLAGS="$CPPFLAGS"
old_LIBS="$LIBS"
CPPFLAGS="$CPPFLAGS $SVN_XML_INCLUDES"
LIBS="$LIBS $SVN_XML_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <expat.h>
int main()
{XML_ParserCreate(NULL);}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
svn_lib_expat="yes"
else
svn_lib_expat="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS="$old_LIBS"
if test "$svn_lib_expat" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
SVN_XML_INCLUDES=""
SVN_XML_LIBS=""
CPPFLAGS="$CPPFLAGS $SVN_APRUTIL_INCLUDES"
if test "$enable_all_static" != "yes"; then
SVN_APRUTIL_LIBS="$SVN_APRUTIL_LIBS `$apu_config --libs`"
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <expat.h>
int main()
{XML_ParserCreate(NULL);}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
svn_lib_expat="yes"
else
svn_lib_expat="no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test "$svn_lib_expat" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Expat found amongst libraries used by APR-Util, but Subversion libraries might be needlessly linked against additional unused libraries. It can be avoided by specifying exact location of Expat in argument of --with-expat option." >&5
$as_echo "$as_me: WARNING: Expat found amongst libraries used by APR-Util, but Subversion libraries might be needlessly linked against additional unused libraries. It can be avoided by specifying exact location of Expat in argument of --with-expat option." >&2;}
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "Expat not found" "$LINENO" 5
fi
fi
CPPFLAGS="$old_CPPFLAGS"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$svn_lib_expat" = "yes"; then
as_fn_error $? "--with-expat option requires argument" "$LINENO" 5
elif test "$svn_lib_expat" = "no"; then
as_fn_error $? "Expat is required" "$LINENO" 5
else
as_fn_error $? "Invalid syntax of argument of --with-expat option" "$LINENO" 5
fi
fi
# Berkeley DB on SCO OpenServer needs -lsocket
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
$as_echo_n "checking for socket in -lsocket... " >&6; }
if ${ac_cv_lib_socket_socket+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char socket ();
int
main ()
{
return socket ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_socket_socket=yes
else
ac_cv_lib_socket_socket=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
$as_echo "$ac_cv_lib_socket_socket" >&6; }
if test "x$ac_cv_lib_socket_socket" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBSOCKET 1
_ACEOF
LIBS="-lsocket $LIBS"
fi
# Build the BDB filesystem library only if we have an appropriate
# version of Berkeley DB.
case "$host" in
powerpc-apple-darwin*)
# Berkeley DB 4.0 does not work on OS X.
SVN_FS_WANT_DB_MAJOR=4
SVN_FS_WANT_DB_MINOR=1
SVN_FS_WANT_DB_PATCH=25
;;
*)
SVN_FS_WANT_DB_MAJOR=4
SVN_FS_WANT_DB_MINOR=0
SVN_FS_WANT_DB_PATCH=14
;;
esac
db_alt_version="5.x"
# Look for libdb4.so first:
db_version=$SVN_FS_WANT_DB_MAJOR.$SVN_FS_WANT_DB_MINOR.$SVN_FS_WANT_DB_PATCH
# Check whether --with-berkeley-db was given.
if test "${with_berkeley_db+set}" = set; then :
withval=$with_berkeley_db;
if test "$withval" = "no"; then
bdb_status=skip
elif test "$withval" = "yes"; then
apu_db_version="`$apu_config --db-version`"
if test $? -ne 0; then
as_fn_error $? "Can't determine whether apr-util is linked against a
proper version of Berkeley DB." "$LINENO" 5
fi
if test "$withval" = "yes"; then
if test "$apu_db_version" -lt "4"; then
as_fn_error $? "APR-UTIL was linked against Berkeley DB version $apu_db_version,
while version 4 or higher is required. Reinstall
APR-UTIL with the appropriate options." "$LINENO" 5
fi
bdb_status=required
elif test "$apu_found" != "reconfig"; then
if test "$apu_db_version" -lt 4; then
as_fn_error $? "APR-UTIL was installed independently, it won't be
possible to use the specified Berkeley DB: $withval" "$LINENO" 5
fi
bdb_status=required
fi
else
if echo "$withval" | $EGREP ":.*:.*:" > /dev/null; then
svn_berkeley_db_header="`echo "$withval" | $SED -e "s/\([^:]*\):.*/\1/"`"
SVN_DB_INCLUDES=""
for i in `echo "$withval" | $SED -e "s/.*:\([^:]*\):[^:]*:.*/\1/"`; do
SVN_DB_INCLUDES="$SVN_DB_INCLUDES -I$i"
done
SVN_DB_INCLUDES="${SVN_DB_INCLUDES## }"
for l in `echo "$withval" | $SED -e "s/.*:[^:]*:\([^:]*\):.*/\1/"`; do
LDFLAGS="$LDFLAGS `
input_flags="-L$l"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
done
SVN_DB_LIBS=""
for l in `echo "$withval" | $SED -e "s/.*:\([^:]*\)/\1/"`; do
SVN_DB_LIBS="$SVN_DB_LIBS -l$l"
done
SVN_DB_LIBS="${SVN_DB_LIBS## }"
bdb_status=required
else
as_fn_error $? "Invalid syntax of argument of --with-berkeley-db option" "$LINENO" 5
fi
fi
else
# No --with-berkeley-db option:
#
# Check if APR-UTIL is providing the correct Berkeley DB version
# for us.
#
apu_db_version="`$apu_config --db-version`"
if test $? -ne 0; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Detected older version of APR-UTIL, trying to determine
whether apr-util is linked against Berkeley DB
$db_version" >&5
$as_echo "$as_me: WARNING: Detected older version of APR-UTIL, trying to determine
whether apr-util is linked against Berkeley DB
$db_version" >&2;}
bdb_status=try-link
elif test "$apu_db_version" -lt "4"; then
bdb_status=skip
else
bdb_status=try-link
fi
fi
if test "$bdb_status" = "skip"; then
svn_lib_berkeley_db=no
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for availability of Berkeley DB" >&5
$as_echo_n "checking for availability of Berkeley DB... " >&6; }
# Check whether --enable-bdb6 was given.
if test "${enable_bdb6+set}" = set; then :
enableval=$enable_bdb6; enable_bdb6=$enableval
else
enable_bdb6=unspecified
fi
svn_lib_berkeley_db_try_save_cppflags="$CPPFLAGS"
svn_lib_berkeley_db_try_save_libs="$LIBS"
svn_check_berkeley_db_major=$SVN_FS_WANT_DB_MAJOR
svn_check_berkeley_db_minor=$SVN_FS_WANT_DB_MINOR
svn_check_berkeley_db_patch=$SVN_FS_WANT_DB_PATCH
enable_bdb6=$enable_bdb6
if test -z "$SVN_DB_LIBS"; then
# We pass --dbm-libs here since Debian has modified apu-config not
# to return -ldb unless --dbm-libs is passed. This may also produce
# extra output beyond -ldb but since we're only filtering for -ldb
# it won't matter to us. However, --dbm-libs was added to apu-config
# in 1.3.8 so it's possible the version we have doesn't support it
# so fallback without it if we get an error.
svn_db_libs_prefiltered="`$apu_config --libs --dbm-libs`"
if test $? -ne 0; then
svn_db_libs_prefiltered="`$apu_config --libs`"
fi
# Extract only the -ldb.* flag from the libs supplied by apu-config
# Otherwise we get bit by the fact that expat might not be built yet
# Or that it resides in a non-standard location which we would have
# to compensate with using something like -R`$apu_config --prefix`/lib.
#
SVN_DB_LIBS="`echo \"$svn_db_libs_prefiltered\" | $SED -e 's/.*\(-ldb[^[:space:]]*\).*/\1/' | $EGREP -- '-ldb[^[:space:]]*'`"
fi
CPPFLAGS="$SVN_DB_INCLUDES $SVN_APRUTIL_INCLUDES $CPPFLAGS"
LIBS="`$apu_config --ldflags` $SVN_DB_LIBS $LIBS"
if test -n "$svn_berkeley_db_header"; then
SVN_DB_HEADER="#include <$svn_berkeley_db_header>"
svn_db_header="#include <$svn_berkeley_db_header>"
else
SVN_DB_HEADER="#include <apu_want.h>"
svn_db_header="#define APU_WANT_DB
#include <apu_want.h>"
fi
if test "$cross_compiling" = yes; then :
svn_have_berkeley_db=yes
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <string.h>
#include <stdlib.h>
$svn_db_header
int main ()
{
int major, minor, patch;
db_version (&major, &minor, &patch);
/* Sanity check: ensure that db.h constants actually match the db library */
if (major != DB_VERSION_MAJOR
|| minor != DB_VERSION_MINOR
|| patch != DB_VERSION_PATCH)
exit (1);
/* Block Berkeley DB 6, because (a) we haven't tested with it, (b) 6.0.20
and newer are under the AGPL, and we want use of AGPL dependencies to be
opt-in. */
if (major >= 6 && strcmp("$enable_bdb6", "yes"))
exit(2);
/* Run-time check: ensure the library claims to be the correct version. */
if (major < $svn_check_berkeley_db_major)
exit (1);
if (major > $svn_check_berkeley_db_major)
exit (0);
if (minor < $svn_check_berkeley_db_minor)
exit (1);
if (minor > $svn_check_berkeley_db_minor)
exit (0);
if (patch >= $svn_check_berkeley_db_patch)
exit (0);
else
exit (1);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
svn_have_berkeley_db=yes
else
rc=$?
svn_have_berkeley_db=no
if test $rc = 2; then
svn_have_berkeley_db=no6
fi
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
CPPFLAGS="$svn_lib_berkeley_db_try_save_cppflags"
LIBS="$svn_lib_berkeley_db_try_save_libs"
if test "$svn_have_berkeley_db" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
svn_lib_berkeley_db=yes
else
if test "$svn_have_berkeley_db" = "no6"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no (found version 6, but --enable-bdb6 not specified)" >&5
$as_echo "no (found version 6, but --enable-bdb6 not specified)" >&6; }
# A warning will be printed at the end of configure.ac.
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
svn_lib_berkeley_db=no
if test "$bdb_status" = "required"; then
as_fn_error $? "Berkeley DB $db_version or $db_alt_version wasn't found." "$LINENO" 5
fi
fi
fi
cat >>confdefs.h <<_ACEOF
#define SVN_FS_WANT_DB_MAJOR $SVN_FS_WANT_DB_MAJOR
_ACEOF
cat >>confdefs.h <<_ACEOF
#define SVN_FS_WANT_DB_MINOR $SVN_FS_WANT_DB_MINOR
_ACEOF
cat >>confdefs.h <<_ACEOF
#define SVN_FS_WANT_DB_PATCH $SVN_FS_WANT_DB_PATCH
_ACEOF
# Check whether --with-sasl was given.
if test "${with_sasl+set}" = set; then :
withval=$with_sasl;
with_sasl="$withval"
required="yes"
else
with_sasl="yes"
required="no"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to look for SASL" >&5
$as_echo_n "checking whether to look for SASL... " >&6; }
if test "${with_sasl}" = "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
svn_lib_sasl=no
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
saved_LDFLAGS="$LDFLAGS"
saved_CPPFLAGS="$CPPFLAGS"
if test "$with_sasl" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Looking in default locations" >&5
$as_echo "$as_me: Looking in default locations" >&6;}
ac_fn_c_check_header_mongrel "$LINENO" "sasl/sasl.h" "ac_cv_header_sasl_sasl_h" "$ac_includes_default"
if test "x$ac_cv_header_sasl_sasl_h" = xyes; then :
ac_fn_c_check_header_mongrel "$LINENO" "sasl/saslutil.h" "ac_cv_header_sasl_saslutil_h" "$ac_includes_default"
if test "x$ac_cv_header_sasl_saslutil_h" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for prop_get in -lsasl2" >&5
$as_echo_n "checking for prop_get in -lsasl2... " >&6; }
if ${ac_cv_lib_sasl2_prop_get+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsasl2 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char prop_get ();
int
main ()
{
return prop_get ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_sasl2_prop_get=yes
else
ac_cv_lib_sasl2_prop_get=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sasl2_prop_get" >&5
$as_echo "$ac_cv_lib_sasl2_prop_get" >&6; }
if test "x$ac_cv_lib_sasl2_prop_get" = xyes; then :
svn_lib_sasl=yes
else
svn_lib_sasl=no
fi
else
svn_lib_sasl=no
fi
else
svn_lib_sasl=no
fi
if test "$svn_lib_sasl" = "no"; then
with_sasl="/usr/local"
fi
else
svn_lib_sasl=no
fi
if test "$svn_lib_sasl" = "no"; then
SVN_SASL_INCLUDES="-I${with_sasl}/include"
CPPFLAGS="$CPPFLAGS $SVN_SASL_INCLUDES"
LDFLAGS="$LDFLAGS `
input_flags="-L${with_sasl}/lib"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
ac_fn_c_check_header_mongrel "$LINENO" "sasl/sasl.h" "ac_cv_header_sasl_sasl_h" "$ac_includes_default"
if test "x$ac_cv_header_sasl_sasl_h" = xyes; then :
ac_fn_c_check_header_mongrel "$LINENO" "sasl/saslutil.h" "ac_cv_header_sasl_saslutil_h" "$ac_includes_default"
if test "x$ac_cv_header_sasl_saslutil_h" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for prop_get in -lsasl2" >&5
$as_echo_n "checking for prop_get in -lsasl2... " >&6; }
if ${ac_cv_lib_sasl2_prop_get+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsasl2 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char prop_get ();
int
main ()
{
return prop_get ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_sasl2_prop_get=yes
else
ac_cv_lib_sasl2_prop_get=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sasl2_prop_get" >&5
$as_echo "$ac_cv_lib_sasl2_prop_get" >&6; }
if test "x$ac_cv_lib_sasl2_prop_get" = xyes; then :
svn_lib_sasl=yes
else
svn_lib_sasl=no
fi
else
svn_lib_sasl=no
fi
else
svn_lib_sasl=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for availability of Cyrus SASL v2" >&5
$as_echo_n "checking for availability of Cyrus SASL v2... " >&6; }
if test "$svn_lib_sasl" = "yes"; then
SVN_SASL_LIBS="-lsasl2"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$required" = "yes"; then
as_fn_error $? "Could not find Cyrus SASL v2" "$LINENO" 5
fi
SVN_SASL_INCLUDES=""
LDFLAGS="$saved_LDFLAGS"
fi
CPPFLAGS="$saved_CPPFLAGS"
fi
if test "$svn_lib_sasl" = "yes"; then
$as_echo "#define SVN_HAVE_SASL 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O dynamic module iteration functions" >&5
$as_echo_n "checking for Mach-O dynamic module iteration functions... " >&6; }
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <mach-o/dyld.h>
#include <mach-o/loader.h>
int
main ()
{
const struct mach_header *header = _dyld_get_image_header(0);
const char *name = _dyld_get_image_name(0);
if (name && header) return 0;
return 1;
;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
$as_echo "#define SVN_HAVE_MACHO_ITERATE 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mac OS property list utilities" >&5
$as_echo_n "checking for Mac OS property list utilities... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <AvailabilityMacros.h>
#if !defined(MAC_OS_X_VERSION_MAX_ALLOWED) \
|| !defined(MAC_OS_X_VERSION_10_0) \
|| (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_0)
#error ProperyList API unavailable.
#endif
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
LIBS="$LIBS -framework CoreFoundation"
$as_echo "#define SVN_HAVE_MACOS_PLIST 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Check whether --enable-keychain was given.
if test "${enable_keychain+set}" = set; then :
enableval=$enable_keychain; enable_keychain=$enableval
else
enable_keychain=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mac OS KeyChain Services" >&5
$as_echo_n "checking for Mac OS KeyChain Services... " >&6; }
if test "$enable_keychain" = "yes"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <AvailabilityMacros.h>
#if !defined(MAC_OS_X_VERSION_MAX_ALLOWED) \
|| !defined(MAC_OS_X_VERSION_10_2) \
|| (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2)
#error KeyChain API unavailable.
#endif
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
LIBS="$LIBS -framework Security"
LIBS="$LIBS -framework CoreServices"
$as_echo "#define SVN_HAVE_KEYCHAIN_SERVICES 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
enable_keychain=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether APR has support for DSOs" >&5
$as_echo_n "checking whether APR has support for DSOs... " >&6; }
old_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
#if !APR_HAS_DSO
#error
#endif
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
APR_HAS_DSO="yes"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
APR_HAS_DSO="no"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f conftest.err conftest.i conftest.$ac_ext
CPPFLAGS="$old_CPPFLAGS"
if test -n "$PKG_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for D-Bus .pc file" >&5
$as_echo_n "checking for D-Bus .pc file... " >&6; }
if $PKG_CONFIG --exists dbus-1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
old_CPPFLAGS="$CPPFLAGS"
old_LIBS="$LIBS"
DBUS_CPPFLAGS="`$PKG_CONFIG --cflags dbus-1`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking D-Bus version" >&5
$as_echo_n "checking D-Bus version... " >&6; }
DBUS_VERSION="`$PKG_CONFIG --modversion dbus-1`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DBUS_VERSION" >&5
$as_echo "$DBUS_VERSION" >&6; }
# D-Bus 0.* requires DBUS_API_SUBJECT_TO_CHANGE
if test -n "`echo "$DBUS_VERSION" | $EGREP '^0\.[[:digit:]]+'`"; then
DBUS_CPPFLAGS="$DBUS_CPPFLAGS -DDBUS_API_SUBJECT_TO_CHANGE"
fi
DBUS_LIBS="`$PKG_CONFIG --libs dbus-1`"
CPPFLAGS="$CPPFLAGS $DBUS_CPPFLAGS"
LIBS="$LIBS $DBUS_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for D-Bus" >&5
$as_echo_n "checking for D-Bus... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <dbus/dbus.h>
int main()
{dbus_bus_get(DBUS_BUS_SESSION, NULL);}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
HAVE_DBUS="yes"
else
HAVE_DBUS="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$HAVE_DBUS" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
CPPFLAGS="$old_CPPFLAGS"
LIBS="$old_LIBS"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
# Check whether --with-gpg_agent was given.
if test "${with_gpg_agent+set}" = set; then :
withval=$with_gpg_agent;
else
with_gpg_agent=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support GPG-Agent" >&5
$as_echo_n "checking whether to support GPG-Agent... " >&6; }
if test "$with_gpg_agent" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
$as_echo "#define SVN_HAVE_GPG_AGENT 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
# Check whether --with-gnome_keyring was given.
if test "${with_gnome_keyring+set}" = set; then :
withval=$with_gnome_keyring; with_gnome_keyring="$withval"
else
with_gnome_keyring=auto
fi
found_gnome_keyring=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to look for GNOME Keyring" >&5
$as_echo_n "checking whether to look for GNOME Keyring... " >&6; }
if test "$with_gnome_keyring" != "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
case "$host" in
*-*-darwin*)
if test "$with_gnome_keyring" = "yes"; then
as_fn_error $? "--with-gnome-keyring is not supported on Mac OS X." "$LINENO" 5
else
with_gnome_keyring=no
fi
;;
*)
if test "$svn_enable_shared" = "yes"; then
if test "$APR_HAS_DSO" = "yes"; then
if test -n "$PKG_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLib and GNOME Keyring .pc files" >&5
$as_echo_n "checking for GLib and GNOME Keyring .pc files... " >&6; }
if $PKG_CONFIG --exists glib-2.0 gnome-keyring-1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
old_CPPFLAGS="$CPPFLAGS"
SVN_GNOME_KEYRING_INCLUDES="`$PKG_CONFIG --cflags glib-2.0 gnome-keyring-1`"
CPPFLAGS="$CPPFLAGS $SVN_GNOME_KEYRING_INCLUDES"
ac_fn_c_check_header_mongrel "$LINENO" "gnome-keyring.h" "ac_cv_header_gnome_keyring_h" "$ac_includes_default"
if test "x$ac_cv_header_gnome_keyring_h" = xyes; then :
found_gnome_keyring=yes
else
found_gnome_keyring=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNOME Keyring" >&5
$as_echo_n "checking for GNOME Keyring... " >&6; }
if test "$found_gnome_keyring" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
$as_echo "#define SVN_HAVE_GNOME_KEYRING 1" >>confdefs.h
CPPFLAGS="$old_CPPFLAGS"
SVN_GNOME_KEYRING_LIBS="`$PKG_CONFIG --libs glib-2.0 gnome-keyring-1`"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_gnome_keyring" = "yes"; then
as_fn_error $? "cannot find GNOME Keyring" "$LINENO" 5
fi
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_gnome_keyring" = "yes"; then
as_fn_error $? "cannot find GLib and GNOME Keyring .pc files." "$LINENO" 5
else
with_gnome_keyring=no
fi
fi
else
if test "$with_gnome_keyring" = "yes"; then
as_fn_error $? "cannot find pkg-config. GNOME Keyring requires this." "$LINENO" 5
else
with_gnome_keyring=no
fi
fi
else
if test "$with_gnome_keyring" = "yes"; then
as_fn_error $? "APR does not have support for DSOs. GNOME Keyring requires this." "$LINENO" 5
else
with_gnome_keyring=no
fi
fi
else
if test "$with_gnome_keyring" = "yes"; then
as_fn_error $? "--with-gnome-keyring conflicts with --disable-shared" "$LINENO" 5
else
with_gnome_keyring=no
fi
fi
;;
esac
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
# Check whether --enable-gmock was given.
if test "${enable_gmock+set}" = set; then :
enableval=$enable_gmock;
else
enable_gmock=yes
fi
GMOCK_SRCDIR=$abs_srcdir/gmock-fused
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use Googlemock" >&5
$as_echo_n "checking whether use Googlemock... " >&6; }
if test "$enable_gmock" != "no"; then
if test -d "$GMOCK_SRCDIR"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
SVN_USE_GMOCK=true
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
SVN_USE_GMOCK=false
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
SVN_USE_GMOCK_SOURCES=false
fi
# Check whether --enable-ev2-impl was given.
if test "${enable_ev2_impl+set}" = set; then :
enableval=$enable_ev2_impl; enable_ev2_impl=$enableval
else
enable_ev2_impl=no
fi
if test "$enable_ev2_impl" = "yes"; then
$as_echo "#define ENABLE_EV2_IMPL 1" >>confdefs.h
fi
# Check whether --enable-nls was given.
if test "${enable_nls+set}" = set; then :
enableval=$enable_nls; enable_nls=$enableval
else
enable_nls=yes
fi
USE_NLS="no"
SVN_INTL_LIBS=""
if test "$enable_nls" = "yes"; then
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MSGFMT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MSGFMT in
[\\/]* | ?:[\\/]*)
ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="none"
;;
esac
fi
MSGFMT=$ac_cv_path_MSGFMT
if test -n "$MSGFMT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
$as_echo "$MSGFMT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
# Extract the first word of "msgmerge", so it can be a program name with args.
set dummy msgmerge; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MSGMERGE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MSGMERGE in
[\\/]* | ?:[\\/]*)
ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE="none"
;;
esac
fi
MSGMERGE=$ac_cv_path_MSGMERGE
if test -n "$MSGMERGE"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
$as_echo "$MSGMERGE" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_XGETTEXT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $XGETTEXT in
[\\/]* | ?:[\\/]*)
ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT="none"
;;
esac
fi
XGETTEXT=$ac_cv_path_XGETTEXT
if test -n "$XGETTEXT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
$as_echo "$XGETTEXT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "$MSGFMT" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing bindtextdomain" >&5
$as_echo_n "checking for library containing bindtextdomain... " >&6; }
if ${ac_cv_search_bindtextdomain+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char bindtextdomain ();
int
main ()
{
return bindtextdomain ();
;
return 0;
}
_ACEOF
for ac_lib in '' intl; do
if test -z "$ac_lib"; then
ac_res="none required"
else
ac_res=-l$ac_lib
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
fi
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_search_bindtextdomain=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext
if ${ac_cv_search_bindtextdomain+:} false; then :
break
fi
done
if ${ac_cv_search_bindtextdomain+:} false; then :
else
ac_cv_search_bindtextdomain=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_bindtextdomain" >&5
$as_echo "$ac_cv_search_bindtextdomain" >&6; }
ac_res=$ac_cv_search_bindtextdomain
if test "$ac_res" != no; then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
# in case libintl needs to be linked explicitly,
# $ac_cv_search_bindtextdomain contains -l linker flags
if echo "$ac_cv_search_bindtextdomain" | grep '^-l' >/dev/null
then
SVN_INTL_LIBS="$ac_cv_search_bindtextdomain"
fi
else
enable_nls="no"
fi
if test "$enable_nls" = "no"; then
# Destroy the cached result so we can test again
unset ac_cv_search_bindtextdomain
# On some systems, libintl needs libiconv to link properly,
# so try again with -liconv.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing bindtextdomain" >&5
$as_echo_n "checking for library containing bindtextdomain... " >&6; }
if ${ac_cv_search_bindtextdomain+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char bindtextdomain ();
int
main ()
{
return bindtextdomain ();
;
return 0;
}
_ACEOF
for ac_lib in '' intl; do
if test -z "$ac_lib"; then
ac_res="none required"
else
ac_res=-l$ac_lib
LIBS="-l$ac_lib -liconv $ac_func_search_save_LIBS"
fi
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_search_bindtextdomain=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext
if ${ac_cv_search_bindtextdomain+:} false; then :
break
fi
done
if ${ac_cv_search_bindtextdomain+:} false; then :
else
ac_cv_search_bindtextdomain=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_bindtextdomain" >&5
$as_echo "$ac_cv_search_bindtextdomain" >&6; }
ac_res=$ac_cv_search_bindtextdomain
if test "$ac_res" != no; then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
enable_nls="yes"
if echo "$ac_cv_search_bindtextdomain" | grep '^-l' >/dev/null
then
SVN_INTL_LIBS="$ac_cv_search_bindtextdomain"
fi
# This is here so that -liconv ends up in LIBS
# if it worked with -liconv.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5
$as_echo_n "checking for libiconv_open in -liconv... " >&6; }
if ${ac_cv_lib_iconv_libiconv_open+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-liconv $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char libiconv_open ();
int
main ()
{
return libiconv_open ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_iconv_libiconv_open=yes
else
ac_cv_lib_iconv_libiconv_open=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5
$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; }
if test "x$ac_cv_lib_iconv_libiconv_open" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBICONV 1
_ACEOF
LIBS="-liconv $LIBS"
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: bindtextdomain() not found. Disabling NLS." >&5
$as_echo "$as_me: WARNING: bindtextdomain() not found. Disabling NLS." >&2;}
enable_nls="no"
fi
fi
if test "$enable_nls" = "yes"; then
$as_echo "#define ENABLE_NLS 1" >>confdefs.h
USE_NLS="yes"
fi
fi
fi
GETTEXT_CODESET=\#
NO_GETTEXT_CODESET=\#
if test $USE_NLS = "yes"; then
for ac_func in bind_textdomain_codeset
do :
ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_BIND_TEXTDOMAIN_CODESET 1
_ACEOF
GETTEXT_CODESET=""
else
NO_GETTEXT_CODESET=""
fi
done
fi
# Check if we are using GNU gettext.
GNU_GETTEXT=no
MSGFMTFLAGS=''
if test $USE_NLS = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we are using GNU gettext" >&5
$as_echo_n "checking if we are using GNU gettext... " >&6; }
if $MSGFMT --version 2>&1 | $EGREP GNU > /dev/null; then
GNU_GETTEXT=yes
MSGFMTFLAGS='-c'
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNU_GETTEXT" >&5
$as_echo "$GNU_GETTEXT" >&6; }
fi
libmagic_found=no
# Check whether --with-libmagic was given.
if test "${with_libmagic+set}" = set; then :
withval=$with_libmagic;
if test "$withval" = "yes" ; then
ac_fn_c_check_header_mongrel "$LINENO" "magic.h" "ac_cv_header_magic_h" "$ac_includes_default"
if test "x$ac_cv_header_magic_h" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for magic_open in -lmagic" >&5
$as_echo_n "checking for magic_open in -lmagic... " >&6; }
if ${ac_cv_lib_magic_magic_open+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmagic $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char magic_open ();
int
main ()
{
return magic_open ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_magic_magic_open=yes
else
ac_cv_lib_magic_magic_open=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_magic_magic_open" >&5
$as_echo "$ac_cv_lib_magic_magic_open" >&6; }
if test "x$ac_cv_lib_magic_magic_open" = xyes; then :
libmagic_found="builtin"
fi
fi
libmagic_prefix="the default locations"
elif test "$withval" != "no"; then
libmagic_prefix=$withval
save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -I$libmagic_prefix/include"
for ac_header in magic.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "magic.h" "ac_cv_header_magic_h" "$ac_includes_default"
if test "x$ac_cv_header_magic_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_MAGIC_H 1
_ACEOF
save_ldflags="$LDFLAGS"
LDFLAGS="-L$libmagic_prefix/lib $LDFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for magic_open in -lmagic" >&5
$as_echo_n "checking for magic_open in -lmagic... " >&6; }
if ${ac_cv_lib_magic_magic_open+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmagic $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char magic_open ();
int
main ()
{
return magic_open ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_magic_magic_open=yes
else
ac_cv_lib_magic_magic_open=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_magic_magic_open" >&5
$as_echo "$ac_cv_lib_magic_magic_open" >&6; }
if test "x$ac_cv_lib_magic_magic_open" = xyes; then :
libmagic_found="yes"
fi
LDFLAGS="$save_ldflags"
fi
done
CPPFLAGS="$save_cppflags"
fi
if test "$withval" != "no" && test "$libmagic_found" = "no"; then
as_fn_error $? "--with-libmagic requested, but libmagic not found at $libmagic_prefix" "$LINENO" 5
fi
else
ac_fn_c_check_header_mongrel "$LINENO" "magic.h" "ac_cv_header_magic_h" "$ac_includes_default"
if test "x$ac_cv_header_magic_h" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for magic_open in -lmagic" >&5
$as_echo_n "checking for magic_open in -lmagic... " >&6; }
if ${ac_cv_lib_magic_magic_open+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmagic $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char magic_open ();
int
main ()
{
return magic_open ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_magic_magic_open=yes
else
ac_cv_lib_magic_magic_open=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_magic_magic_open" >&5
$as_echo "$ac_cv_lib_magic_magic_open" >&6; }
if test "x$ac_cv_lib_magic_magic_open" = xyes; then :
libmagic_found="builtin"
fi
fi
fi
if test "$libmagic_found" != "no"; then
$as_echo "#define SVN_HAVE_LIBMAGIC 1" >>confdefs.h
SVN_MAGIC_LIBS="-lmagic"
fi
if test "$libmagic_found" = "yes"; then
SVN_MAGIC_INCLUDES="-I$libmagic_prefix/include"
LDFLAGS="$LDFLAGS `
input_flags="-L$libmagic_prefix/lib"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
fi
# Check whether --with-kwallet was given.
if test "${with_kwallet+set}" = set; then :
withval=$with_kwallet; svn_lib_kwallet="$withval"
else
svn_lib_kwallet=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to look for KWallet" >&5
$as_echo_n "checking whether to look for KWallet... " >&6; }
if test "$svn_lib_kwallet" != "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
case "$host" in
*-*-darwin*)
as_fn_error $? "--with-kwallet is not supported on Mac OS X." "$LINENO" 5
;;
*)
if test "$svn_enable_shared" = "yes"; then
if test "$APR_HAS_DSO" = "yes"; then
if test -n "$PKG_CONFIG"; then
if test "$HAVE_DBUS" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QtCore, QtDBus, QtGui" >&5
$as_echo_n "checking for QtCore, QtDBus, QtGui... " >&6; }
if $PKG_CONFIG --exists QtCore QtDBus QtGui; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
if test "$svn_lib_kwallet" != "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kde4-config" >&5
$as_echo_n "checking for kde4-config... " >&6; }
KDE4_CONFIG="$svn_lib_kwallet/bin/kde4-config"
if test -f "$KDE4_CONFIG" && test -x "$KDE4_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
KDE4_CONFIG=""
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
# Extract the first word of "kde4-config", so it can be a program name with args.
set dummy kde4-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_KDE4_CONFIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $KDE4_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_KDE4_CONFIG="$KDE4_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_KDE4_CONFIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
KDE4_CONFIG=$ac_cv_path_KDE4_CONFIG
if test -n "$KDE4_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $KDE4_CONFIG" >&5
$as_echo "$KDE4_CONFIG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -n "$KDE4_CONFIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for KWallet" >&5
$as_echo_n "checking for KWallet... " >&6; }
old_CXXFLAGS="$CXXFLAGS"
old_LDFLAGS="$LDFLAGS"
old_LIBS="$LIBS"
for d in `$PKG_CONFIG --cflags QtCore QtDBus QtGui`; do
if test -n "`echo "$d" | $EGREP -- '^-D[^[:space:]]*'`"; then
CPPFLAGS="$CPPFLAGS $d"
fi
done
qt_include_dirs="`$PKG_CONFIG --cflags-only-I QtCore QtDBus QtGui`"
kde_incdir="`$KDE4_CONFIG --install include`"
SVN_KWALLET_INCLUDES="$DBUS_CPPFLAGS $qt_include_dirs -I$kde_incdir"
qt_libs_other_options="`$PKG_CONFIG --libs-only-other QtCore QtDBus QtGui`"
SVN_KWALLET_LIBS="$DBUS_LIBS -lQtCore -lQtDBus -lQtGui -lkdecore -lkdeui $qt_libs_other_options"
CXXFLAGS="$CXXFLAGS $SVN_KWALLET_INCLUDES"
LIBS="$LIBS $SVN_KWALLET_LIBS"
qt_lib_dirs="`$PKG_CONFIG --libs-only-L QtCore QtDBus QtGui`"
kde_libdir="`$KDE4_CONFIG --install lib`"
LDFLAGS="$old_LDFLAGS `
input_flags="$qt_lib_dirs -L$kde_libdir"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <kwallet.h>
int main()
{KWallet::Wallet::walletList();}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
svn_lib_kwallet="yes"
else
svn_lib_kwallet="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test "$svn_lib_kwallet" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
CXXFLAGS="$old_CXXFLAGS"
LIBS="$old_LIBS"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "cannot find KWallet" "$LINENO" 5
fi
else
as_fn_error $? "cannot find kde4-config" "$LINENO" 5
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "cannot find QtCore, QtDBus, QtGui" "$LINENO" 5
fi
else
as_fn_error $? "cannot find D-Bus" "$LINENO" 5
fi
else
as_fn_error $? "cannot find pkg-config" "$LINENO" 5
fi
else
as_fn_error $? "APR does not have support for DSOs" "$LINENO" 5
fi
else
as_fn_error $? "--with-kwallet conflicts with --disable-shared" "$LINENO" 5
fi
;;
esac
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "$svn_lib_kwallet" = "yes"; then
$as_echo "#define SVN_HAVE_KWALLET 1" >>confdefs.h
fi
# Check whether --enable-plaintext-password-storage was given.
if test "${enable_plaintext_password_storage+set}" = set; then :
enableval=$enable_plaintext_password_storage;
if test "$enableval" = "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Disabling plaintext password/passphrase storage" >&5
$as_echo "$as_me: Disabling plaintext password/passphrase storage" >&6;}
$as_echo "#define SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE 1" >>confdefs.h
fi
fi
INSTALL_STATIC_RULES="install-bin install-docs"
INSTALL_RULES="install-fsmod-lib install-ramod-lib install-lib install-include install-static"
INSTALL_RULES="$INSTALL_RULES $INSTALL_APACHE_RULE"
BUILD_RULES="fsmod-lib ramod-lib lib bin test sub-test $BUILD_APACHE_RULE tools"
if test "$svn_lib_berkeley_db" = "yes"; then
BUILD_RULES="$BUILD_RULES bdb-lib bdb-test"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-fsmod-lib/install-fsmod-lib install-bdb-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-bdb-lib"
BDB_TEST_DEPS="\$(BDB_TEST_DEPS)"
BDB_TEST_PROGRAMS="\$(BDB_TEST_PROGRAMS)"
fi
if test "$svn_lib_serf" = "yes"; then
BUILD_RULES="$BUILD_RULES serf-lib"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-ramod-lib/install-ramod-lib install-serf-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-serf-lib"
fi
if test "$svn_lib_kwallet" = "yes"; then
BUILD_RULES="$BUILD_RULES kwallet-lib"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-lib/install-lib install-kwallet-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-kwallet-lib"
fi
if test "$found_gnome_keyring" = "yes"; then
BUILD_RULES="$BUILD_RULES gnome-keyring-lib"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-lib/install-lib install-gnome-keyring-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-gnome-keyring-lib"
fi
if test "$USE_NLS" = "yes"; then
BUILD_RULES="$BUILD_RULES locale"
INSTALL_RULES="$INSTALL_RULES install-locale"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_header_stdc=yes
else
ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <string.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "memchr" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "free" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then :
:
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ctype.h>
#include <stdlib.h>
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
(('a' <= (c) && (c) <= 'i') \
|| ('j' <= (c) && (c) <= 'r') \
|| ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
int i;
for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i))
|| toupper (i) != TOUPPER (i))
return 2;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
else
ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then
$as_echo "#define STDC_HEADERS 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
if ${ac_cv_c_const+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#ifndef __cplusplus
/* Ultrix mips cc rejects this sort of thing. */
typedef int charset[2];
const charset cs = { 0, 0 };
/* SunOS 4.1.1 cc rejects this. */
char const *const *pcpcc;
char **ppc;
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
/* AIX XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in
an arm of an if-expression whose if-part is not a constant
expression */
const char *g = "string";
pcpcc = &g + (g ? g-g : 0);
/* HPUX 7.0 cc rejects these. */
++pcpcc;
ppc = (char**) pcpcc;
pcpcc = (char const *const *) ppc;
{ /* SCO 3.2v4 cc rejects this sort of thing. */
char tx;
char *t = &tx;
char const *s = 0 ? (char *) 0 : (char const *) 0;
*t++ = 0;
if (s) return 0;
}
{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
int x[] = {25, 17};
const int *foo = &x[0];
++foo;
}
{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
typedef const int *iptr;
iptr p = 0;
++p;
}
{ /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
struct s { int j; const int *ap[3]; } bx;
struct s *b = &bx; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
const int foo = 10;
if (!foo) return 0;
}
return !cs[0] && !zero.x;
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_c_const=yes
else
ac_cv_c_const=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
$as_echo "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then
$as_echo "#define const /**/" >>confdefs.h
fi
ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
if test "x$ac_cv_type_size_t" = xyes; then :
else
cat >>confdefs.h <<_ACEOF
#define size_t unsigned int
_ACEOF
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5
$as_echo_n "checking for working memcmp... " >&6; }
if ${ac_cv_func_memcmp_working+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
ac_cv_func_memcmp_working=no
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
int
main ()
{
/* Some versions of memcmp are not 8-bit clean. */
char c0 = '\100', c1 = '\200', c2 = '\201';
if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0)
return 1;
/* The Next x86 OpenStep bug shows up only when comparing 16 bytes
or more and with at least one buffer not starting on a 4-byte boundary.
William Lewis provided this test program. */
{
char foo[21];
char bar[21];
int i;
for (i = 0; i < 4; i++)
{
char *a = foo + i;
char *b = bar + i;
strcpy (a, "--------01111111");
strcpy (b, "--------10000000");
if (memcmp (a, b, 16) >= 0)
return 1;
}
return 0;
}
;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
ac_cv_func_memcmp_working=yes
else
ac_cv_func_memcmp_working=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5
$as_echo "$ac_cv_func_memcmp_working" >&6; }
test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in
*" memcmp.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS memcmp.$ac_objext"
;;
esac
for ac_func in vprintf
do :
ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf"
if test "x$ac_cv_func_vprintf" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_VPRINTF 1
_ACEOF
ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt"
if test "x$ac_cv_func__doprnt" = xyes; then :
$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h
fi
fi
done
for ac_func in symlink readlink
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in sys/utsname.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_utsname_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_UTSNAME_H 1
_ACEOF
for ac_func in uname
do :
ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname"
if test "x$ac_cv_func_uname" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_UNAME 1
_ACEOF
fi
done
fi
done
ac_fn_c_check_header_mongrel "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default"
if test "x$ac_cv_header_termios_h" = xyes; then :
for ac_func in tcgetattr tcsetattr
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
$as_echo "#define HAVE_TERMIOS_H 1" >>confdefs.h
fi
done
fi
# Check whether --enable-debug was given.
if test "${enable_debug+set}" = set; then :
enableval=$enable_debug;
if test "$enableval" = "yes" ; then
enable_debugging="yes"
else
enable_debugging="no"
fi
else
# Neither --enable-debug nor --disable-debug was passed.
enable_debugging="maybe"
fi
# Check whether --enable-optimize was given.
if test "${enable_optimize+set}" = set; then :
enableval=$enable_optimize;
if test "$enableval" = "yes" ; then
enable_optimization="yes"
else
enable_optimization="no"
fi
else
# Neither --enable-optimize nor --disable-optimize was passed.
enable_optimization="maybe"
fi
# Check whether --enable-disallowing-of-undefined-references was given.
if test "${enable_disallowing_of_undefined_references+set}" = set; then :
enableval=$enable_disallowing_of_undefined_references;
fi
if test "$enable_disallowing_of_undefined_references" != "yes" && test "`uname`" != "Linux"; then
enable_disallowing_of_undefined_references="no"
fi
if test "$enable_disallowing_of_undefined_references" != "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Wl,--no-undefined" >&5
$as_echo_n "checking for -Wl,--no-undefined... " >&6; }
old_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -Wl,--no-undefined"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
svn_wl_no_undefined="yes"
else
svn_wl_no_undefined="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS="$old_LDFLAGS"
if test "$svn_wl_no_undefined" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
for library_dir in "$abs_srcdir/subversion/libsvn_"*; do
eval "`basename $library_dir`_LDFLAGS=-Wl,--no-undefined"
done
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$enable_disallowing_of_undefined_references" = "yes"; then
as_fn_error $? "--enable-disallowing-of-undefined-references explicitly requested, but -Wl,--no-undefined not supported" "$LINENO" 5
fi
fi
fi
# Check whether --enable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then :
enableval=$enable_maintainer_mode;
if test "$enableval" = "yes" ; then
if test "$enable_debugging" = "no" ; then
as_fn_error $? "Can't have --disable-debug and --enable-maintainer-mode" "$LINENO" 5
fi
enable_debugging=yes
if test "$GCC" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: maintainer-mode: adding GCC warning flags" >&5
$as_echo "$as_me: maintainer-mode: adding GCC warning flags" >&6;}
CFLAGS_KEEP="$CFLAGS"
CFLAGS=""
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=implicit-function-declaration" >&5
$as_echo_n "checking if $CC accepts -Werror=implicit-function-declaration... " >&6; }
CFLAGS="-Werror=implicit-function-declaration $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=declaration-after-statement" >&5
$as_echo_n "checking if $CC accepts -Werror=declaration-after-statement... " >&6; }
CFLAGS="-Werror=declaration-after-statement $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wextra-tokens" >&5
$as_echo_n "checking if $CC accepts -Wextra-tokens... " >&6; }
CFLAGS="-Wextra-tokens $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wnewline-eof" >&5
$as_echo_n "checking if $CC accepts -Wnewline-eof... " >&6; }
CFLAGS="-Wnewline-eof $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wshorten-64-to-32" >&5
$as_echo_n "checking if $CC accepts -Wshorten-64-to-32... " >&6; }
CFLAGS="-Wshorten-64-to-32 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wold-style-definition" >&5
$as_echo_n "checking if $CC accepts -Wold-style-definition... " >&6; }
CFLAGS="-Wold-style-definition $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wno-system-headers" >&5
$as_echo_n "checking if $CC accepts -Wno-system-headers... " >&6; }
CFLAGS="-Wno-system-headers $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wno-format-nonliteral" >&5
$as_echo_n "checking if $CC accepts -Wno-format-nonliteral... " >&6; }
CFLAGS="-Wno-format-nonliteral $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wmissing-variable-declarations" >&5
$as_echo_n "checking if $CC accepts -Wmissing-variable-declarations... " >&6; }
CFLAGS="-Wmissing-variable-declarations $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
CMAINTAINERFLAGS="$CFLAGS"
CFLAGS="$CFLAGS_KEEP"
CMAINTAINERFLAGS="-Wall -Wpointer-arith -Wwrite-strings -Wshadow -Wformat=2 -Wunused -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wno-multichar -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wbad-function-cast $CMAINTAINERFLAGS"
fi
if test "$GXX" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: maintainer-mode: adding G++ warning flags" >&5
$as_echo "$as_me: maintainer-mode: adding G++ warning flags" >&6;}
CXXFLAGS_KEEP="$CXXFLAGS"
CXXFLAGS=""
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Wextra-tokens" >&5
$as_echo_n "checking if $CXX accepts -Wextra-tokens... " >&6; }
CXXFLAGS="-Wextra-tokens $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Wnewline-eof" >&5
$as_echo_n "checking if $CXX accepts -Wnewline-eof... " >&6; }
CXXFLAGS="-Wnewline-eof $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Wshorten-64-to-32" >&5
$as_echo_n "checking if $CXX accepts -Wshorten-64-to-32... " >&6; }
CXXFLAGS="-Wshorten-64-to-32 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Wno-system-headers" >&5
$as_echo_n "checking if $CXX accepts -Wno-system-headers... " >&6; }
CXXFLAGS="-Wno-system-headers $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
CXXMAINTAINERFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS_KEEP"
CXXMAINTAINERFLAGS="-Wall -Wpointer-arith -Wwrite-strings -Wshadow -Wunused -Wunreachable-code $CXXMAINTAINERFLAGS"
fi
fi
fi
if test "$enable_debugging" = "yes" ; then
if test "$enable_optimization" != "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Disabling optimizations for debugging" >&5
$as_echo "$as_me: Disabling optimizations for debugging" >&6;}
CFLAGS="`echo $CFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"
CXXFLAGS="`echo $CXXFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"
fi
if test -z "`echo $CUSERFLAGS' ' | $EGREP -- '-g[0-9]? '`"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling debugging for C" >&5
$as_echo "$as_me: Enabling debugging for C" >&6;}
CFLAGS="`echo $CFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-inline" >&5
$as_echo_n "checking if $CC accepts -fno-inline... " >&6; }
CFLAGS="-fno-inline $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-omit-frame-pointer" >&5
$as_echo_n "checking if $CC accepts -fno-omit-frame-pointer... " >&6; }
CFLAGS="-fno-omit-frame-pointer $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -g3" >&5
$as_echo_n "checking if $CC accepts -g3... " >&6; }
CFLAGS="-g3 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -g2" >&5
$as_echo_n "checking if $CC accepts -g2... " >&6; }
CFLAGS="-g2 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -g" >&5
$as_echo_n "checking if $CC accepts -g... " >&6; }
CFLAGS="-g $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
if test -z "`echo $CXXUSERFLAGS' ' | $EGREP -- '-g[0-9]? '`"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling debugging for C++" >&5
$as_echo "$as_me: Enabling debugging for C++" >&6;}
CXXFLAGS="`echo $CXXFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -fno-inline" >&5
$as_echo_n "checking if $CXX accepts -fno-inline... " >&6; }
CXXFLAGS="-fno-inline $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -fno-omit-frame-pointer" >&5
$as_echo_n "checking if $CXX accepts -fno-omit-frame-pointer... " >&6; }
CXXFLAGS="-fno-omit-frame-pointer $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -g3" >&5
$as_echo_n "checking if $CXX accepts -g3... " >&6; }
CXXFLAGS="-g3 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -g2" >&5
$as_echo_n "checking if $CXX accepts -g2... " >&6; }
CXXFLAGS="-g2 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -g" >&5
$as_echo_n "checking if $CXX accepts -g... " >&6; }
CXXFLAGS="-g $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
CFLAGS="$CFLAGS -DSVN_DEBUG -DAP_DEBUG"
CXXFLAGS="$CXXFLAGS -DSVN_DEBUG -DAP_DEBUG"
elif test "$enable_debugging" = "no" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Disabling debugging" >&5
$as_echo "$as_me: Disabling debugging" >&6;}
CFLAGS="`echo $CFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"
CXXFLAGS="`echo $CXXFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"
CFLAGS="$CFLAGS -DNDEBUG"
CXXFLAGS="$CXXFLAGS -DNDEBUG"
# elif test "$enable_debugging" = "maybe" ; then
# # do nothing
fi
if test "$enable_optimization" = "yes"; then
if test -z "`echo $CUSERFLAGS' ' | $EGREP -- '-O[^ ]* '`"; then
CFLAGS="`echo $CFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"
if test "$enable_debugging" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling optimizations for C (with debugging enabled)" >&5
$as_echo "$as_me: Enabling optimizations for C (with debugging enabled)" >&6;}
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -O1" >&5
$as_echo_n "checking if $CC accepts -O1... " >&6; }
CFLAGS="-O1 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -O" >&5
$as_echo_n "checking if $CC accepts -O... " >&6; }
CFLAGS="-O $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling optimizations for C" >&5
$as_echo "$as_me: Enabling optimizations for C" >&6;}
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -O3" >&5
$as_echo_n "checking if $CC accepts -O3... " >&6; }
CFLAGS="-O3 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -O2" >&5
$as_echo_n "checking if $CC accepts -O2... " >&6; }
CFLAGS="-O2 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -O1" >&5
$as_echo_n "checking if $CC accepts -O1... " >&6; }
CFLAGS="-O1 $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -O" >&5
$as_echo_n "checking if $CC accepts -O... " >&6; }
CFLAGS="-O $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wno-clobbered" >&5
$as_echo_n "checking if $CC accepts -Wno-clobbered... " >&6; }
CFLAGS="-Wno-clobbered $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -flto" >&5
$as_echo_n "checking if $CC accepts -flto... " >&6; }
CFLAGS="-flto $CFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
fi
if test -z "`echo $CXXUSERFLAGS' ' | $EGREP -- '-O[^ ]* '`"; then
CXXFLAGS="`echo $CXXFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"
if test "$enable_debugging" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling optimizations for C++ (with debugging enabled)" >&5
$as_echo "$as_me: Enabling optimizations for C++ (with debugging enabled)" >&6;}
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -O1" >&5
$as_echo_n "checking if $CXX accepts -O1... " >&6; }
CXXFLAGS="-O1 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -O" >&5
$as_echo_n "checking if $CXX accepts -O... " >&6; }
CXXFLAGS="-O $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling optimizations for C++" >&5
$as_echo "$as_me: Enabling optimizations for C++" >&6;}
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -O3" >&5
$as_echo_n "checking if $CXX accepts -O3... " >&6; }
CXXFLAGS="-O3 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -O2" >&5
$as_echo_n "checking if $CXX accepts -O2... " >&6; }
CXXFLAGS="-O2 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -O1" >&5
$as_echo_n "checking if $CXX accepts -O1... " >&6; }
CXXFLAGS="-O1 $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -O" >&5
$as_echo_n "checking if $CXX accepts -O... " >&6; }
CXXFLAGS="-O $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Wno-clobbered" >&5
$as_echo_n "checking if $CXX accepts -Wno-clobbered... " >&6; }
CXXFLAGS="-Wno-clobbered $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
_svn_xxflags__save="$CXXFLAGS"
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -flto" >&5
$as_echo_n "checking if $CXX accepts -flto... " >&6; }
CXXFLAGS="-flto $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(){}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$_svn_xxflags__save"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
fi
elif test "$enable_optimization" = "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Disabling optimizations" >&5
$as_echo "$as_me: Disabling optimizations" >&6;}
CFLAGS="`echo $CFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"
CXXFLAGS="`echo $CXXFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"
# elif test "$enable_optimization" = "maybe" ; then
# # do nothing
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: C compiler flags: $CFLAGS" >&5
$as_echo "$as_me: C compiler flags: $CFLAGS" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: user-defined: $CUSERFLAGS" >&5
$as_echo "$as_me: user-defined: $CUSERFLAGS" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: maintainer-mode: $CMAINTAINERFLAGS" >&5
$as_echo "$as_me: maintainer-mode: $CMAINTAINERFLAGS" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: C++ compiler flags: $CXXFLAGS" >&5
$as_echo "$as_me: C++ compiler flags: $CXXFLAGS" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: user-defined: $CXXUSERFLAGS" >&5
$as_echo "$as_me: user-defined: $CXXUSERFLAGS" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: maintainer-mode: $CXXMAINTAINERFLAGS" >&5
$as_echo "$as_me: maintainer-mode: $CXXMAINTAINERFLAGS" >&6;}
# Check whether --enable-full-version-match was given.
if test "${enable_full_version_match+set}" = set; then :
enableval=$enable_full_version_match;
if test "$enableval" = "no" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Disabling svn full version matching" >&5
$as_echo "$as_me: Disabling svn full version matching" >&6;}
$as_echo "#define SVN_DISABLE_FULL_VERSION_MATCH 1" >>confdefs.h
fi
fi
# Check whether --with-editor was given.
if test "${with_editor+set}" = set; then :
withval=$with_editor;
if test "$withval" = "yes" ; then
as_fn_error $? "--with-editor requires an argument." "$LINENO" 5
else
SVN_CLIENT_EDITOR=$withval
cat >>confdefs.h <<_ACEOF
#define SVN_CLIENT_EDITOR "$SVN_CLIENT_EDITOR"
_ACEOF
fi
fi
zlib_found=no
+ zlib_skip=no
# Check whether --with-zlib was given.
if test "${with_zlib+set}" = set; then :
withval=$with_zlib;
- if test "$withval" = "yes" ; then
- ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_zlib_h" = xyes; then :
+ if test "$withval" = "yes"; then
+ zlib_skip=no
+ elif test "$withval" = "no"; then
+ zlib_skip=yes
+ else
+ zlib_skip=no
+ zlib_prefix="$withval"
+ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
-$as_echo_n "checking for inflate in -lz... " >&6; }
-if ${ac_cv_lib_z_inflate+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lz $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char inflate ();
-int
-main ()
-{
-return inflate ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_z_inflate=yes
-else
- ac_cv_lib_z_inflate=no
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
-$as_echo "$ac_cv_lib_z_inflate" >&6; }
-if test "x$ac_cv_lib_z_inflate" = xyes; then :
- zlib_found="builtin"
-fi
-fi
+ if test "$zlib_skip" = "yes"; then
+ as_fn_error $? "subversion requires zlib" "$LINENO" 5
+ fi
-
- elif test "$withval" = "no" ; then
- as_fn_error $? "cannot compile without zlib." "$LINENO" 5
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: zlib library configuration" >&5
-$as_echo "$as_me: zlib library configuration" >&6;}
- zlib_prefix=$withval
- save_cppflags="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS -I$zlib_prefix/include"
- for ac_header in zlib.h
+ if test -n "$zlib_prefix"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: zlib library configuration via prefix" >&5
+$as_echo "$as_me: zlib library configuration via prefix" >&6;}
+ save_cppflags="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -I$zlib_prefix/include"
+ for ac_header in zlib.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
if test "x$ac_cv_header_zlib_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_ZLIB_H 1
_ACEOF
- save_ldflags="$LDFLAGS"
- LDFLAGS="$LDFLAGS -L$zlib_prefix/lib"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
+ save_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -L$zlib_prefix/lib"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
$as_echo_n "checking for inflate in -lz... " >&6; }
if ${ac_cv_lib_z_inflate+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lz $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char inflate ();
int
main ()
{
return inflate ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_z_inflate=yes
else
ac_cv_lib_z_inflate=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
$as_echo "$ac_cv_lib_z_inflate" >&6; }
if test "x$ac_cv_lib_z_inflate" = xyes; then :
- zlib_found="yes"
+
+ zlib_found="yes"
+ SVN_ZLIB_INCLUDES="-I$zlib_prefix/include"
+ SVN_ZLIB_LIBS="`
+ input_flags="-L$zlib_prefix/lib"
+ output_flags=""
+ filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
+ for flag in $input_flags; do
+ filter="no"
+ for dir in $filtered_dirs; do
+ if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
+ filter="yes"
+ break
+ fi
+ done
+ if test "$filter" = "no"; then
+ output_flags="$output_flags $flag"
+ fi
+ done
+ if test -n "$output_flags"; then
+ printf "%s" "${output_flags# }"
+ fi
+` -lz"
+
fi
- LDFLAGS="$save_ldflags"
+ LDFLAGS="$save_ldflags"
fi
done
- CPPFLAGS="$save_cppflags"
+ CPPFLAGS="$save_cppflags"
+ else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: zlib library configuration via pkg-config" >&5
+$as_echo "$as_me: zlib library configuration via pkg-config" >&6;}
+ if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for zlib library" >&5
+$as_echo_n "checking for zlib library... " >&6; }
+ if $PKG_CONFIG zlib --exists; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ zlib_found=yes
+ SVN_ZLIB_INCLUDES=`$PKG_CONFIG zlib --cflags`
+ SVN_ZLIB_LIBS=`$PKG_CONFIG zlib --libs`
+ SVN_ZLIB_LIBS="`
+ input_flags="$SVN_ZLIB_LIBS"
+ output_flags=""
+ filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
+ for flag in $input_flags; do
+ filter="no"
+ for dir in $filtered_dirs; do
+ if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
+ filter="yes"
+ break
+ fi
+ done
+ if test "$filter" = "no"; then
+ output_flags="$output_flags $flag"
fi
+ done
+ if test -n "$output_flags"; then
+ printf "%s" "${output_flags# }"
+ fi
+`"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ fi
-else
- ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
+ if test "$zlib_found" = "no"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: zlib library configuration" >&5
+$as_echo "$as_me: zlib library configuration" >&6;}
+ ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
if test "x$ac_cv_header_zlib_h" = xyes; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
$as_echo_n "checking for inflate in -lz... " >&6; }
if ${ac_cv_lib_z_inflate+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lz $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char inflate ();
int
main ()
{
return inflate ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_z_inflate=yes
else
ac_cv_lib_z_inflate=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
$as_echo "$ac_cv_lib_z_inflate" >&6; }
if test "x$ac_cv_lib_z_inflate" = xyes; then :
- zlib_found="builtin"
-fi
+ zlib_found="builtin"
+ SVN_ZLIB_LIBS="-lz"
fi
-
fi
+ fi
+ fi
+
if test "$zlib_found" = "no"; then
as_fn_error $? "subversion requires zlib" "$LINENO" 5
fi
- if test "$zlib_found" = "yes"; then
- SVN_ZLIB_INCLUDES="-I$zlib_prefix/include"
- LDFLAGS="$LDFLAGS `
- input_flags="-L$zlib_prefix/lib"
- output_flags=""
- filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
- for flag in $input_flags; do
- filter="no"
- for dir in $filtered_dirs; do
- if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
- filter="yes"
- break
- fi
- done
- if test "$filter" = "no"; then
- output_flags="$output_flags $flag"
- fi
- done
- if test -n "$output_flags"; then
- printf "%s" "${output_flags# }"
- fi
-`"
- fi
- SVN_ZLIB_LIBS="-lz"
-
-
MOD_ACTIVATION=""
# Check whether --enable-mod-activation was given.
if test "${enable_mod_activation+set}" = set; then :
enableval=$enable_mod_activation;
if test "$enableval" = "yes" ; then
MOD_ACTIVATION="-a"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling apache module activation" >&5
$as_echo "$as_me: Enabling apache module activation" >&6;}
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: Disabling apache module activation" >&5
$as_echo "$as_me: Disabling apache module activation" >&6;}
fi
fi
# Check whether --enable-gcov was given.
if test "${enable_gcov+set}" = set; then :
enableval=$enable_gcov;
if test "$enableval" = "yes" ; then
if test "$GCC" = "yes"; then
if test "$svn_enable_shared" = "yes" ; then
as_fn_error $? "Can't have --enable-gcov without --disable-shared (we
recommend also using --enable-all-static)." "$LINENO" 5
fi
if test ! "$enable_all_static" = "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: We recommend --enable-all-static with --enable-gcov." >&5
$as_echo "$as_me: WARNING: We recommend --enable-all-static with --enable-gcov." >&2;}
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling gcov coverage testing." >&5
$as_echo "$as_me: Enabling gcov coverage testing." >&6;}
CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
else
as_fn_error $? "We only support --enable-gcov with GCC right now." "$LINENO" 5
fi
fi
fi
# Check whether --enable-gprof was given.
if test "${enable_gprof+set}" = set; then :
enableval=$enable_gprof;
if test "$enableval" = "yes" ; then
if test "$GCC" = "yes"; then
if test "$svn_enable_shared" = "yes" ; then
as_fn_error $? "Can't have --enable-gprof without --disable-shared (we
recommend also using --enable-all-static)." "$LINENO" 5
fi
if test ! "$enable_all_static" = "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: We recommend --enable-all-static with --enable-gprof." >&5
$as_echo "$as_me: WARNING: We recommend --enable-all-static with --enable-gprof." >&2;}
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling gprof profiling data (to gmon.out)." >&5
$as_echo "$as_me: Enabling gprof profiling data (to gmon.out)." >&6;}
CFLAGS="$CFLAGS -pg"
CXXFLAGS="$CXXFLAGS -pg"
LT_LDFLAGS="$LT_LDFLAGS -pg"
else
as_fn_error $? "We only support --enable-gprof with GCC right now." "$LINENO" 5
fi
fi
fi
# Scripting and Bindings languages
# Python: Used for testsuite, and bindings
PYTHON="`$abs_srcdir/build/find_python.sh`"
if test -z "$PYTHON"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Python 2.7 or later is required to run the testsuite" >&5
$as_echo "$as_me: WARNING: Python 2.7 or later is required to run the testsuite" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: or to use the Subversion Python bindings" >&5
$as_echo "$as_me: WARNING: or to use the Subversion Python bindings" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: " >&5
$as_echo "$as_me: WARNING: " >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: If you have a suitable Python installed, but not on the" >&5
$as_echo "$as_me: WARNING: If you have a suitable Python installed, but not on the" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PATH, set the environment variable PYTHON to the full path" >&5
$as_echo "$as_me: WARNING: PATH, set the environment variable PYTHON to the full path" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: to the Python executable, and re-run configure" >&5
$as_echo "$as_me: WARNING: to the Python executable, and re-run configure" >&2;}
fi
for ac_prog in "$PYTHON"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PYTHON+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PYTHON in
[\\/]* | ?:[\\/]*)
ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PYTHON=$ac_cv_path_PYTHON
if test -n "$PYTHON"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
$as_echo "$PYTHON" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$PYTHON" && break
done
test -n "$PYTHON" || PYTHON="none"
# The minimum version for the JVM runtime for our Java bytecode.
JAVA_OLDEST_WORKING_VER='1.6'
# SVN_CHECK_JDK sets $JAVA_CLASSPATH
JAVA_OLDEST_WORKING_VER="$JAVA_OLDEST_WORKING_VER"
# Check whether --with-jdk was given.
if test "${with_jdk+set}" = set; then :
withval=$with_jdk;
case "$withval" in
"no")
JDK_SUITABLE=no
;;
"yes")
where=check
JAVA_OLDEST_WORKING_VER="$JAVA_OLDEST_WORKING_VER"
JDK=none
JAVA_BIN=none
JAVADOC=none
JAVAC=none
JAVAH=none
JAR=none
JNI_INCLUDES=none
JDK_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JDK" >&5
$as_echo_n "checking for JDK... " >&6; }
if test $where = check; then
if test -x "$JAVA_HOME/bin/java"; then
JDK="$JAVA_HOME"
elif test -x "/usr/libexec/java_home"; then
JDK=`/usr/libexec/java_home`
elif test -x "/Library/Java/Home/bin/java"; then
JDK="/Library/Java/Home"
elif test -x "/usr/bin/java"; then
JDK="/usr"
elif test -x "/usr/local/bin/java"; then
JDK="/usr/local"
fi
else
JDK=$where
fi
os_arch="`uname`"
if test "$os_arch" = "Darwin"; then
OSX_VER=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 | cut -d"." -f1,2`
if test "$OSX_VER" = "10.4"; then
OSX_VER="10.4u"
fi
OSX_SYS_JAVA_FRAMEWORK="/System/Library/Frameworks/JavaVM.framework"
OSX_SDK_JAVA_FRAMEWORK="/Developer/SDKs/MacOSX$OSX_VER.sdk/System/Library"
OSX_SDK_JAVA_FRAMEWORK="$OSX_SDK_JAVA_FRAMEWORK/Frameworks/JavaVM.framework"
fi
if test "$os_arch" = "Darwin" && test "$JDK" = "/usr" &&
test -d "/Library/Java/Home"; then
JDK="/Library/Java/Home"
fi
if test "$os_arch" = "Darwin" && test "$JDK" = "/Library/Java/Home"; then
JRE_LIB_DIR="$OSX_SYS_JAVA_FRAMEWORK/Classes"
else
JRE_LIB_DIR="$JDK/jre/lib"
fi
if test -f "$JDK/include/jni.h"; then
JNI_INCLUDEDIR="$JDK/include"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" && test -e "$JDK/Headers/jni.h"; then
JNI_INCLUDEDIR="$JDK/Headers"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" &&
test -e "$OSX_SYS_JAVA_FRAMEWORK/Headers/jni.h"; then
JNI_INCLUDEDIR="$OSX_SYS_JAVA_FRAMEWORK/Headers"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" &&
test -e "$OSX_SDK_JAVA_FRAMEWORK/Headers/jni.h"; then
JNI_INCLUDEDIR="$OSX_SDK_JAVA_FRAMEWORK/Headers"
JDK_SUITABLE=yes
else
JDK_SUITABLE=no
fi
if test "$JDK_SUITABLE" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $JNI_INCLUDEDIR/jni.h" >&5
$as_echo "$JNI_INCLUDEDIR/jni.h" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$where" != "check"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no JNI header files found." >&5
$as_echo "$as_me: WARNING: no JNI header files found." >&2;}
if test "$os_arch" = "Darwin"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may need to install the latest Java Development package from http://connect.apple.com/. Apple no longer includes the JNI header files by default on Java updates." >&5
$as_echo "$as_me: WARNING: You may need to install the latest Java Development package from http://connect.apple.com/. Apple no longer includes the JNI header files by default on Java updates." >&2;}
fi
fi
fi
if test "$JDK_SUITABLE" = "yes"; then
JAVA_BIN='$(JDK)/bin'
JAVA="$JAVA_BIN/java"
JAVAC="$JAVA_BIN/javac"
JAVAH="$JAVA_BIN/javah"
JAVADOC="$JAVA_BIN/javadoc"
JAR="$JAVA_BIN/jar"
jikes_options="/usr/local/bin/jikes /usr/bin/jikes"
# Check whether --with-jikes was given.
if test "${with_jikes+set}" = set; then :
withval=$with_jikes;
if test "$withval" != "no" && test "$withval" != "yes"; then
jikes_options="$withval $jikes_options"
fi
requested_jikes="$withval" # will be 'yes' if path unspecified
fi
if test "$requested_jikes" != "no"; then
for jikes in $jikes_options; do
if test -z "$jikes_found" && test -x "$jikes"; then
jikes_found="yes"
JAVAC="$jikes"
JAVA_CLASSPATH="$JRE_LIB_DIR"
for jar in $JRE_LIB_DIR/*.jar; do
JAVA_CLASSPATH="$JAVA_CLASSPATH:$jar"
done
fi
done
fi
if test -n "$requested_jikes" && test "$requested_jikes" != "no"; then
if test -z "$jikes_found"; then
as_fn_error $? "Could not find a usable version of Jikes" "$LINENO" 5
elif test -n "$jikes_found" && test "$requested_jikes" != "yes" &&
test "$JAVAC" != "$requested_jikes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-jikes PATH was invalid, substitute found" >&5
$as_echo "$as_me: WARNING: --with-jikes PATH was invalid, substitute found" >&2;}
fi
fi
# The release for "-source" could actually be greater than that
# of "-target", if we want to cross-compile for lesser JVMs.
if test -z "$JAVAC_FLAGS"; then
JAVAC_FLAGS="-target $JAVA_OLDEST_WORKING_VER -source 1.6"
if test "$enable_debugging" = "yes"; then
JAVAC_FLAGS="-g -Xlint -Xlint:unchecked -Xlint:serial -Xlint:path $JAVAC_FLAGS"
if test -z "$JAVAC_COMPAT_FLAGS"; then
JAVAC_COMPAT_FLAGS="$JAVAC_FLAGS -Xlint:-unchecked -Xlint:-deprecation -Xlint:-dep-ann -Xlint:-rawtypes"
fi
fi
fi
JNI_INCLUDES="-I$JNI_INCLUDEDIR"
list="`find "$JNI_INCLUDEDIR" -type d -print`"
for dir in $list; do
JNI_INCLUDES="$JNI_INCLUDES -I$dir"
done
fi
;;
*)
where=$withval
JAVA_OLDEST_WORKING_VER="$JAVA_OLDEST_WORKING_VER"
JDK=none
JAVA_BIN=none
JAVADOC=none
JAVAC=none
JAVAH=none
JAR=none
JNI_INCLUDES=none
JDK_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JDK" >&5
$as_echo_n "checking for JDK... " >&6; }
if test $where = check; then
if test -x "$JAVA_HOME/bin/java"; then
JDK="$JAVA_HOME"
elif test -x "/usr/libexec/java_home"; then
JDK=`/usr/libexec/java_home`
elif test -x "/Library/Java/Home/bin/java"; then
JDK="/Library/Java/Home"
elif test -x "/usr/bin/java"; then
JDK="/usr"
elif test -x "/usr/local/bin/java"; then
JDK="/usr/local"
fi
else
JDK=$where
fi
os_arch="`uname`"
if test "$os_arch" = "Darwin"; then
OSX_VER=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 | cut -d"." -f1,2`
if test "$OSX_VER" = "10.4"; then
OSX_VER="10.4u"
fi
OSX_SYS_JAVA_FRAMEWORK="/System/Library/Frameworks/JavaVM.framework"
OSX_SDK_JAVA_FRAMEWORK="/Developer/SDKs/MacOSX$OSX_VER.sdk/System/Library"
OSX_SDK_JAVA_FRAMEWORK="$OSX_SDK_JAVA_FRAMEWORK/Frameworks/JavaVM.framework"
fi
if test "$os_arch" = "Darwin" && test "$JDK" = "/usr" &&
test -d "/Library/Java/Home"; then
JDK="/Library/Java/Home"
fi
if test "$os_arch" = "Darwin" && test "$JDK" = "/Library/Java/Home"; then
JRE_LIB_DIR="$OSX_SYS_JAVA_FRAMEWORK/Classes"
else
JRE_LIB_DIR="$JDK/jre/lib"
fi
if test -f "$JDK/include/jni.h"; then
JNI_INCLUDEDIR="$JDK/include"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" && test -e "$JDK/Headers/jni.h"; then
JNI_INCLUDEDIR="$JDK/Headers"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" &&
test -e "$OSX_SYS_JAVA_FRAMEWORK/Headers/jni.h"; then
JNI_INCLUDEDIR="$OSX_SYS_JAVA_FRAMEWORK/Headers"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" &&
test -e "$OSX_SDK_JAVA_FRAMEWORK/Headers/jni.h"; then
JNI_INCLUDEDIR="$OSX_SDK_JAVA_FRAMEWORK/Headers"
JDK_SUITABLE=yes
else
JDK_SUITABLE=no
fi
if test "$JDK_SUITABLE" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $JNI_INCLUDEDIR/jni.h" >&5
$as_echo "$JNI_INCLUDEDIR/jni.h" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$where" != "check"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no JNI header files found." >&5
$as_echo "$as_me: WARNING: no JNI header files found." >&2;}
if test "$os_arch" = "Darwin"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may need to install the latest Java Development package from http://connect.apple.com/. Apple no longer includes the JNI header files by default on Java updates." >&5
$as_echo "$as_me: WARNING: You may need to install the latest Java Development package from http://connect.apple.com/. Apple no longer includes the JNI header files by default on Java updates." >&2;}
fi
fi
fi
if test "$JDK_SUITABLE" = "yes"; then
JAVA_BIN='$(JDK)/bin'
JAVA="$JAVA_BIN/java"
JAVAC="$JAVA_BIN/javac"
JAVAH="$JAVA_BIN/javah"
JAVADOC="$JAVA_BIN/javadoc"
JAR="$JAVA_BIN/jar"
jikes_options="/usr/local/bin/jikes /usr/bin/jikes"
# Check whether --with-jikes was given.
if test "${with_jikes+set}" = set; then :
withval=$with_jikes;
if test "$withval" != "no" && test "$withval" != "yes"; then
jikes_options="$withval $jikes_options"
fi
requested_jikes="$withval" # will be 'yes' if path unspecified
fi
if test "$requested_jikes" != "no"; then
for jikes in $jikes_options; do
if test -z "$jikes_found" && test -x "$jikes"; then
jikes_found="yes"
JAVAC="$jikes"
JAVA_CLASSPATH="$JRE_LIB_DIR"
for jar in $JRE_LIB_DIR/*.jar; do
JAVA_CLASSPATH="$JAVA_CLASSPATH:$jar"
done
fi
done
fi
if test -n "$requested_jikes" && test "$requested_jikes" != "no"; then
if test -z "$jikes_found"; then
as_fn_error $? "Could not find a usable version of Jikes" "$LINENO" 5
elif test -n "$jikes_found" && test "$requested_jikes" != "yes" &&
test "$JAVAC" != "$requested_jikes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-jikes PATH was invalid, substitute found" >&5
$as_echo "$as_me: WARNING: --with-jikes PATH was invalid, substitute found" >&2;}
fi
fi
# The release for "-source" could actually be greater than that
# of "-target", if we want to cross-compile for lesser JVMs.
if test -z "$JAVAC_FLAGS"; then
JAVAC_FLAGS="-target $JAVA_OLDEST_WORKING_VER -source 1.6"
if test "$enable_debugging" = "yes"; then
JAVAC_FLAGS="-g -Xlint -Xlint:unchecked -Xlint:serial -Xlint:path $JAVAC_FLAGS"
if test -z "$JAVAC_COMPAT_FLAGS"; then
JAVAC_COMPAT_FLAGS="$JAVAC_FLAGS -Xlint:-unchecked -Xlint:-deprecation -Xlint:-dep-ann -Xlint:-rawtypes"
fi
fi
fi
JNI_INCLUDES="-I$JNI_INCLUDEDIR"
list="`find "$JNI_INCLUDEDIR" -type d -print`"
for dir in $list; do
JNI_INCLUDES="$JNI_INCLUDES -I$dir"
done
fi
;;
esac
else
where=check
JAVA_OLDEST_WORKING_VER="$JAVA_OLDEST_WORKING_VER"
JDK=none
JAVA_BIN=none
JAVADOC=none
JAVAC=none
JAVAH=none
JAR=none
JNI_INCLUDES=none
JDK_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JDK" >&5
$as_echo_n "checking for JDK... " >&6; }
if test $where = check; then
if test -x "$JAVA_HOME/bin/java"; then
JDK="$JAVA_HOME"
elif test -x "/usr/libexec/java_home"; then
JDK=`/usr/libexec/java_home`
elif test -x "/Library/Java/Home/bin/java"; then
JDK="/Library/Java/Home"
elif test -x "/usr/bin/java"; then
JDK="/usr"
elif test -x "/usr/local/bin/java"; then
JDK="/usr/local"
fi
else
JDK=$where
fi
os_arch="`uname`"
if test "$os_arch" = "Darwin"; then
OSX_VER=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 | cut -d"." -f1,2`
if test "$OSX_VER" = "10.4"; then
OSX_VER="10.4u"
fi
OSX_SYS_JAVA_FRAMEWORK="/System/Library/Frameworks/JavaVM.framework"
OSX_SDK_JAVA_FRAMEWORK="/Developer/SDKs/MacOSX$OSX_VER.sdk/System/Library"
OSX_SDK_JAVA_FRAMEWORK="$OSX_SDK_JAVA_FRAMEWORK/Frameworks/JavaVM.framework"
fi
if test "$os_arch" = "Darwin" && test "$JDK" = "/usr" &&
test -d "/Library/Java/Home"; then
JDK="/Library/Java/Home"
fi
if test "$os_arch" = "Darwin" && test "$JDK" = "/Library/Java/Home"; then
JRE_LIB_DIR="$OSX_SYS_JAVA_FRAMEWORK/Classes"
else
JRE_LIB_DIR="$JDK/jre/lib"
fi
if test -f "$JDK/include/jni.h"; then
JNI_INCLUDEDIR="$JDK/include"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" && test -e "$JDK/Headers/jni.h"; then
JNI_INCLUDEDIR="$JDK/Headers"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" &&
test -e "$OSX_SYS_JAVA_FRAMEWORK/Headers/jni.h"; then
JNI_INCLUDEDIR="$OSX_SYS_JAVA_FRAMEWORK/Headers"
JDK_SUITABLE=yes
elif test "$os_arch" = "Darwin" &&
test -e "$OSX_SDK_JAVA_FRAMEWORK/Headers/jni.h"; then
JNI_INCLUDEDIR="$OSX_SDK_JAVA_FRAMEWORK/Headers"
JDK_SUITABLE=yes
else
JDK_SUITABLE=no
fi
if test "$JDK_SUITABLE" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $JNI_INCLUDEDIR/jni.h" >&5
$as_echo "$JNI_INCLUDEDIR/jni.h" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$where" != "check"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no JNI header files found." >&5
$as_echo "$as_me: WARNING: no JNI header files found." >&2;}
if test "$os_arch" = "Darwin"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may need to install the latest Java Development package from http://connect.apple.com/. Apple no longer includes the JNI header files by default on Java updates." >&5
$as_echo "$as_me: WARNING: You may need to install the latest Java Development package from http://connect.apple.com/. Apple no longer includes the JNI header files by default on Java updates." >&2;}
fi
fi
fi
if test "$JDK_SUITABLE" = "yes"; then
JAVA_BIN='$(JDK)/bin'
JAVA="$JAVA_BIN/java"
JAVAC="$JAVA_BIN/javac"
JAVAH="$JAVA_BIN/javah"
JAVADOC="$JAVA_BIN/javadoc"
JAR="$JAVA_BIN/jar"
jikes_options="/usr/local/bin/jikes /usr/bin/jikes"
# Check whether --with-jikes was given.
if test "${with_jikes+set}" = set; then :
withval=$with_jikes;
if test "$withval" != "no" && test "$withval" != "yes"; then
jikes_options="$withval $jikes_options"
fi
requested_jikes="$withval" # will be 'yes' if path unspecified
fi
if test "$requested_jikes" != "no"; then
for jikes in $jikes_options; do
if test -z "$jikes_found" && test -x "$jikes"; then
jikes_found="yes"
JAVAC="$jikes"
JAVA_CLASSPATH="$JRE_LIB_DIR"
for jar in $JRE_LIB_DIR/*.jar; do
JAVA_CLASSPATH="$JAVA_CLASSPATH:$jar"
done
fi
done
fi
if test -n "$requested_jikes" && test "$requested_jikes" != "no"; then
if test -z "$jikes_found"; then
as_fn_error $? "Could not find a usable version of Jikes" "$LINENO" 5
elif test -n "$jikes_found" && test "$requested_jikes" != "yes" &&
test "$JAVAC" != "$requested_jikes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-jikes PATH was invalid, substitute found" >&5
$as_echo "$as_me: WARNING: --with-jikes PATH was invalid, substitute found" >&2;}
fi
fi
# The release for "-source" could actually be greater than that
# of "-target", if we want to cross-compile for lesser JVMs.
if test -z "$JAVAC_FLAGS"; then
JAVAC_FLAGS="-target $JAVA_OLDEST_WORKING_VER -source 1.6"
if test "$enable_debugging" = "yes"; then
JAVAC_FLAGS="-g -Xlint -Xlint:unchecked -Xlint:serial -Xlint:path $JAVAC_FLAGS"
if test -z "$JAVAC_COMPAT_FLAGS"; then
JAVAC_COMPAT_FLAGS="$JAVAC_FLAGS -Xlint:-unchecked -Xlint:-deprecation -Xlint:-dep-ann -Xlint:-rawtypes"
fi
fi
fi
JNI_INCLUDES="-I$JNI_INCLUDEDIR"
list="`find "$JNI_INCLUDEDIR" -type d -print`"
for dir in $list; do
JNI_INCLUDES="$JNI_INCLUDES -I$dir"
done
fi
fi
# Extract the first word of "perl", so it can be a program name with args.
set dummy perl; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PERL+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PERL in
[\\/]* | ?:[\\/]*)
ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="none"
;;
esac
fi
PERL=$ac_cv_path_PERL
if test -n "$PERL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
$as_echo "$PERL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test -n "$RUBY"; then
# Extract the first word of ""$RUBY"", so it can be a program name with args.
set dummy "$RUBY"; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_RUBY+:} false; then :
$as_echo_n "(cached) " >&6
else
case $RUBY in
[\\/]* | ?:[\\/]*)
ac_cv_path_RUBY="$RUBY" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_RUBY="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_RUBY" && ac_cv_path_RUBY="none"
;;
esac
fi
RUBY=$ac_cv_path_RUBY
if test -n "$RUBY"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5
$as_echo "$RUBY" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
for ac_prog in ruby ruby1.8 ruby18 ruby1.9 ruby1 ruby1.9.3 ruby193 ruby2.0 ruby2.1
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_RUBY+:} false; then :
$as_echo_n "(cached) " >&6
else
case $RUBY in
[\\/]* | ?:[\\/]*)
ac_cv_path_RUBY="$RUBY" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_RUBY="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
RUBY=$ac_cv_path_RUBY
if test -n "$RUBY"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5
$as_echo "$RUBY" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$RUBY" && break
done
test -n "$RUBY" || RUBY="none"
fi
if test "$RUBY" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking rb_hash_foreach" >&5
$as_echo_n "checking rb_hash_foreach... " >&6; }
if "$RUBY" -r mkmf -e 'exit(have_func("rb_hash_foreach") ? 0 : 1)' >/dev/null; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
if test -n "$RDOC"; then
# Extract the first word of ""$RDOC"", so it can be a program name with args.
set dummy "$RDOC"; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_RDOC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $RDOC in
[\\/]* | ?:[\\/]*)
ac_cv_path_RDOC="$RDOC" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_RDOC="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_RDOC" && ac_cv_path_RDOC="none"
;;
esac
fi
RDOC=$ac_cv_path_RDOC
if test -n "$RDOC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $RDOC" >&5
$as_echo "$RDOC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
for ac_prog in rdoc rdoc1.8 rdoc18 rdoc1.9 rdoc19 rdoc1.9.3 rdoc193 rdoc2.0 rdoc2.1
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_RDOC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $RDOC in
[\\/]* | ?:[\\/]*)
ac_cv_path_RDOC="$RDOC" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_RDOC="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
RDOC=$ac_cv_path_RDOC
if test -n "$RDOC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $RDOC" >&5
$as_echo "$RDOC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$RDOC" && break
done
test -n "$RDOC" || RDOC="none"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby major version" >&5
$as_echo_n "checking for Ruby major version... " >&6; }
if ${svn_cv_ruby_major+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_major="`$RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MAJOR))'`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_major" >&5
$as_echo "$svn_cv_ruby_major" >&6; }
RUBY_MAJOR="$svn_cv_ruby_major"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby minor version" >&5
$as_echo_n "checking for Ruby minor version... " >&6; }
if ${svn_cv_ruby_minor+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_minor="`$RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MINOR))'`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_minor" >&5
$as_echo "$svn_cv_ruby_minor" >&6; }
RUBY_MINOR="$svn_cv_ruby_minor"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby teeny version" >&5
$as_echo_n "checking for Ruby teeny version... " >&6; }
if ${svn_cv_ruby_teeny+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_teeny="`$RUBY -rrbconfig -e 'major, minor, teeny = RUBY_VERSION.split("."); print teeny;'`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_teeny" >&5
$as_echo "$svn_cv_ruby_teeny" >&6; }
RUBY_TEENY="$svn_cv_ruby_teeny"
if test \( "$RUBY_MAJOR" -eq "1" -a "$RUBY_MINOR" -gt "8" -a "$RUBY_TEENY" -lt "3" \); then
# Disallow Ruby between 1.8.7 and 1.9.3
RUBY="none"
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The detected Ruby is between 1.9 and 1.9.3" >&5
$as_echo "$as_me: WARNING: The detected Ruby is between 1.9 and 1.9.3" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Only 1.8.x and 1.9.3 releases are supported at this time" >&5
$as_echo "$as_me: WARNING: Only 1.8.x and 1.9.3 releases are supported at this time" >&2;}
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
RUBY="none"
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The detected Ruby is too old for Subversion to use" >&5
$as_echo "$as_me: WARNING: The detected Ruby is too old for Subversion to use" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: A Ruby which has rb_hash_foreach is required to use the" >&5
$as_echo "$as_me: WARNING: A Ruby which has rb_hash_foreach is required to use the" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion Ruby bindings" >&5
$as_echo "$as_me: WARNING: Subversion Ruby bindings" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Upgrade to the official 1.8.2 release, or later" >&5
$as_echo "$as_me: WARNING: Upgrade to the official 1.8.2 release, or later" >&2;}
fi
fi
# Check whether --with-swig was given.
if test "${with_swig+set}" = set; then :
withval=$with_swig;
case "$withval" in
"no")
SWIG_SUITABLE=no
where=no
if test $where = no; then
SWIG=none
elif test $where = check; then
# Extract the first word of "swig", so it can be a program name with args.
set dummy swig; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_SWIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SWIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_SWIG" && ac_cv_path_SWIG="none"
;;
esac
fi
SWIG=$ac_cv_path_SWIG
if test -n "$SWIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5
$as_echo "$SWIG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
if test -f "$where"; then
SWIG="$where"
else
SWIG="$where/bin/swig"
fi
if test ! -f "$SWIG" || test ! -x "$SWIG"; then
as_fn_error $? "Could not find swig binary at $SWIG" "$LINENO" 5
fi
fi
if test "$SWIG" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking swig version" >&5
$as_echo_n "checking swig version... " >&6; }
SWIG_VERSION_RAW="`$SWIG -version 2>&1 | \
$SED -ne 's/^.*Version \(.*\)$/\1/p'`"
# We want the version as an integer so we can test against
# which version we're using. SWIG doesn't provide this
# to us so we have to come up with it on our own.
# The major is passed straight through,
# the minor is zero padded to two places,
# and the patch level is zero padded to three places.
# e.g. 1.3.24 becomes 103024
SWIG_VERSION="`echo \"$SWIG_VERSION_RAW\" | \
$SED -e 's/[^0-9\.].*$//' \
-e 's/\.\([0-9]\)$/.0\1/' \
-e 's/\.\([0-9][0-9]\)$/.0\1/' \
-e 's/\.\([0-9]\)\./0\1/; s/\.//g;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_VERSION_RAW" >&5
$as_echo "$SWIG_VERSION_RAW" >&6; }
# If you change the required swig version number, don't forget to update:
# subversion/bindings/swig/INSTALL
# packages/rpm/redhat-8+/subversion.spec
# packages/rpm/redhat-7.x/subversion.spec
# packages/rpm/rhel-3/subversion.spec
# packages/rpm/rhel-4/subversion.spec
- if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024" && \
- test "$SWIG_VERSION" -lt "300000"; then
+ if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024"; then
SWIG_SUITABLE=yes
else
SWIG_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&5
$as_echo "$as_me: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&5
-$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24" >&5
+$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24" >&2;}
fi
fi
SWIG_PY_COMPILE="none"
SWIG_PY_LINK="none"
if test "$PYTHON" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring python swig binding" >&5
$as_echo "$as_me: Configuring python swig binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python includes" >&5
$as_echo_n "checking for Python includes... " >&6; }
if ${ac_cv_python_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_includes="`$PYTHON ${abs_srcdir}/build/get-py-info.py --includes`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_includes" >&5
$as_echo "$ac_cv_python_includes" >&6; }
SWIG_PY_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python_includes"
if test "$ac_cv_python_includes" = "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: python bindings cannot be built without distutils module" >&5
$as_echo "$as_me: WARNING: python bindings cannot be built without distutils module" >&2;}
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiling Python extensions" >&5
$as_echo_n "checking for compiling Python extensions... " >&6; }
if ${ac_cv_python_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_compile="`$PYTHON ${abs_srcdir}/build/get-py-info.py --compile`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_compile" >&5
$as_echo "$ac_cv_python_compile" >&6; }
SWIG_PY_COMPILE="$ac_cv_python_compile $CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python extensions" >&5
$as_echo_n "checking for linking Python extensions... " >&6; }
if ${ac_cv_python_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_link="`$PYTHON ${abs_srcdir}/build/get-py-info.py --link`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_link" >&5
$as_echo "$ac_cv_python_link" >&6; }
SWIG_PY_LINK="$ac_cv_python_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python libraries" >&5
$as_echo_n "checking for linking Python libraries... " >&6; }
if ${ac_cv_python_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_libs="`$PYTHON ${abs_srcdir}/build/get-py-info.py --libs`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_libs" >&5
$as_echo "$ac_cv_python_libs" >&6; }
SWIG_PY_LIBS="`
input_flags="$ac_cv_python_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_PYCFMT_SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for apr_int64_t Python/C API format string" >&5
$as_echo_n "checking for apr_int64_t Python/C API format string... " >&6; }
if ${svn_cv_pycfmt_apr_int64_t+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"lld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="L"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
r
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"ld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="l"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"d\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="i"
fi
rm -f conftest*
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_pycfmt_apr_int64_t" >&5
$as_echo "$svn_cv_pycfmt_apr_int64_t" >&6; }
CPPFLAGS="$SVN_PYCFMT_SAVE_CPPFLAGS"
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
as_fn_error $? "failed to recognize APR_INT64_T_FMT on this platform" "$LINENO" 5
fi
cat >>confdefs.h <<_ACEOF
#define SVN_APR_INT64_T_PYCFMT "$svn_cv_pycfmt_apr_int64_t"
_ACEOF
fi
if test "$PERL" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
$as_echo_n "checking perl version... " >&6; }
PERL_VERSION="`$PERL -e 'q([); print $] * 1000000,$/;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_VERSION" >&5
$as_echo "$PERL_VERSION" >&6; }
if test "$PERL_VERSION" -ge "5008000"; then
SWIG_PL_INCLUDES="\$(SWIG_INCLUDES) `$PERL -MExtUtils::Embed -e ccopts`"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl bindings require perl 5.8.0 or newer." >&5
$as_echo "$as_me: WARNING: perl bindings require perl 5.8.0 or newer." >&2;}
fi
fi
SWIG_RB_COMPILE="none"
SWIG_RB_LINK="none"
if test "$RUBY" != "none"; then
rbconfig="$RUBY -rrbconfig -e "
for var_name in arch archdir CC LDSHARED DLEXT LIBS LIBRUBYARG \
rubyhdrdir rubyarchhdrdir sitedir sitelibdir sitearchdir libdir
do
rbconfig_tmp=`$rbconfig "print RbConfig::CONFIG['$var_name']"`
eval "rbconfig_$var_name=\"$rbconfig_tmp\""
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Ruby SWIG binding" >&5
$as_echo "$as_me: Configuring Ruby SWIG binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby include path" >&5
$as_echo_n "checking for Ruby include path... " >&6; }
if ${svn_cv_ruby_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -d "$rbconfig_rubyhdrdir"; then
svn_cv_ruby_includes="-I. -I$rbconfig_rubyhdrdir -I$rbconfig_rubyhdrdir/ruby -I$rbconfig_rubyhdrdir/ruby/backward"
if test -d "$rbconfig_rubyarchhdrdir"; then
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyarchhdrdir"
else
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyhdrdir/$rbconfig_arch"
fi
else
svn_cv_ruby_includes="-I. -I$rbconfig_archdir"
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_includes" >&5
$as_echo "$svn_cv_ruby_includes" >&6; }
SWIG_RB_INCLUDES="\$(SWIG_INCLUDES) $svn_cv_ruby_includes"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to compile Ruby extensions" >&5
$as_echo_n "checking how to compile Ruby extensions... " >&6; }
if ${svn_cv_ruby_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_compile="$rbconfig_CC $CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_compile" >&5
$as_echo "$svn_cv_ruby_compile" >&6; }
SWIG_RB_COMPILE="$svn_cv_ruby_compile"
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-ansi//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c89//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c90//'`
SWIG_RB_COMPILE="$SWIG_RB_COMPILE -Wno-int-to-pointer-cast"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby extensions" >&5
$as_echo_n "checking how to link Ruby extensions... " >&6; }
if ${svn_cv_ruby_link+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_link="`$RUBY -e 'ARGV.shift; print ARGV.join(%q( ))' \
$rbconfig_LDSHARED`"
svn_cv_ruby_link="$rbconfig_CC $svn_cv_ruby_link"
svn_cv_ruby_link="$svn_cv_ruby_link -shrext .$rbconfig_DLEXT"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_link" >&5
$as_echo "$svn_cv_ruby_link" >&6; }
SWIG_RB_LINK="$svn_cv_ruby_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby libraries" >&5
$as_echo_n "checking how to link Ruby libraries... " >&6; }
if ${ac_cv_ruby_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_ruby_libs="$rbconfig_LIBRUBYARG $rbconfig_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ruby_libs" >&5
$as_echo "$ac_cv_ruby_libs" >&6; }
SWIG_RB_LIBS="`
input_flags="$ac_cv_ruby_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rb_errinfo" >&5
$as_echo_n "checking for rb_errinfo... " >&6; }
old_CFLAGS="$CFLAGS"
old_LIBS="$LIBS"
CFLAGS="$CFLAGS $svn_cv_ruby_includes"
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-ansi//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c89//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c90//'`
LIBS="$SWIG_RB_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ruby.h>
int main()
{rb_errinfo();}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
have_rb_errinfo="yes"
else
have_rb_errinfo="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$have_rb_errinfo" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
$as_echo "#define HAVE_RB_ERRINFO 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
CFLAGS="$old_CFLAGS"
LIBS="$old_LIBS"
if ${svn_cv_ruby_sitedir+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir="$rbconfig_sitedir"
fi
# Check whether --with-ruby-sitedir was given.
if test "${with_ruby_sitedir+set}" = set; then :
withval=$with_ruby_sitedir; svn_ruby_installdir="$withval"
else
svn_ruby_installdir="$svn_cv_ruby_sitedir"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby scripts" >&5
$as_echo_n "checking where to install Ruby scripts... " >&6; }
if ${svn_cv_ruby_sitedir_libsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_libsuffix="`echo "$rbconfig_sitelibdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_LIB_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_libsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_LIB_DIR" >&5
$as_echo "$SWIG_RB_SITE_LIB_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby extensions" >&5
$as_echo_n "checking where to install Ruby extensions... " >&6; }
if ${svn_cv_ruby_sitedir_archsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_archsuffix="`echo "$rbconfig_sitearchdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_ARCH_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_archsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_ARCH_DIR" >&5
$as_echo "$SWIG_RB_SITE_ARCH_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to use output level for Ruby bindings tests" >&5
$as_echo_n "checking how to use output level for Ruby bindings tests... " >&6; }
if ${svn_cv_ruby_test_verbose+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_test_verbose="normal"
fi
# Check whether --with-ruby-test-verbose was given.
if test "${with_ruby_test_verbose+set}" = set; then :
withval=$with_ruby_test_verbose; svn_ruby_test_verbose="$withval"
else
svn_ruby_test_verbose="$svn_cv_ruby_test_verbose"
fi
SWIG_RB_TEST_VERBOSE="$svn_ruby_test_verbose"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_TEST_VERBOSE" >&5
$as_echo "$SWIG_RB_TEST_VERBOSE" >&6; }
fi
;;
"yes")
where=check
if test $where = no; then
SWIG=none
elif test $where = check; then
# Extract the first word of "swig", so it can be a program name with args.
set dummy swig; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_SWIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SWIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_SWIG" && ac_cv_path_SWIG="none"
;;
esac
fi
SWIG=$ac_cv_path_SWIG
if test -n "$SWIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5
$as_echo "$SWIG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
if test -f "$where"; then
SWIG="$where"
else
SWIG="$where/bin/swig"
fi
if test ! -f "$SWIG" || test ! -x "$SWIG"; then
as_fn_error $? "Could not find swig binary at $SWIG" "$LINENO" 5
fi
fi
if test "$SWIG" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking swig version" >&5
$as_echo_n "checking swig version... " >&6; }
SWIG_VERSION_RAW="`$SWIG -version 2>&1 | \
$SED -ne 's/^.*Version \(.*\)$/\1/p'`"
# We want the version as an integer so we can test against
# which version we're using. SWIG doesn't provide this
# to us so we have to come up with it on our own.
# The major is passed straight through,
# the minor is zero padded to two places,
# and the patch level is zero padded to three places.
# e.g. 1.3.24 becomes 103024
SWIG_VERSION="`echo \"$SWIG_VERSION_RAW\" | \
$SED -e 's/[^0-9\.].*$//' \
-e 's/\.\([0-9]\)$/.0\1/' \
-e 's/\.\([0-9][0-9]\)$/.0\1/' \
-e 's/\.\([0-9]\)\./0\1/; s/\.//g;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_VERSION_RAW" >&5
$as_echo "$SWIG_VERSION_RAW" >&6; }
# If you change the required swig version number, don't forget to update:
# subversion/bindings/swig/INSTALL
# packages/rpm/redhat-8+/subversion.spec
# packages/rpm/redhat-7.x/subversion.spec
# packages/rpm/rhel-3/subversion.spec
# packages/rpm/rhel-4/subversion.spec
- if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024" && \
- test "$SWIG_VERSION" -lt "300000"; then
+ if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024"; then
SWIG_SUITABLE=yes
else
SWIG_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&5
$as_echo "$as_me: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&5
-$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24" >&5
+$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24" >&2;}
fi
fi
SWIG_PY_COMPILE="none"
SWIG_PY_LINK="none"
if test "$PYTHON" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring python swig binding" >&5
$as_echo "$as_me: Configuring python swig binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python includes" >&5
$as_echo_n "checking for Python includes... " >&6; }
if ${ac_cv_python_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_includes="`$PYTHON ${abs_srcdir}/build/get-py-info.py --includes`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_includes" >&5
$as_echo "$ac_cv_python_includes" >&6; }
SWIG_PY_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python_includes"
if test "$ac_cv_python_includes" = "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: python bindings cannot be built without distutils module" >&5
$as_echo "$as_me: WARNING: python bindings cannot be built without distutils module" >&2;}
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiling Python extensions" >&5
$as_echo_n "checking for compiling Python extensions... " >&6; }
if ${ac_cv_python_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_compile="`$PYTHON ${abs_srcdir}/build/get-py-info.py --compile`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_compile" >&5
$as_echo "$ac_cv_python_compile" >&6; }
SWIG_PY_COMPILE="$ac_cv_python_compile $CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python extensions" >&5
$as_echo_n "checking for linking Python extensions... " >&6; }
if ${ac_cv_python_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_link="`$PYTHON ${abs_srcdir}/build/get-py-info.py --link`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_link" >&5
$as_echo "$ac_cv_python_link" >&6; }
SWIG_PY_LINK="$ac_cv_python_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python libraries" >&5
$as_echo_n "checking for linking Python libraries... " >&6; }
if ${ac_cv_python_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_libs="`$PYTHON ${abs_srcdir}/build/get-py-info.py --libs`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_libs" >&5
$as_echo "$ac_cv_python_libs" >&6; }
SWIG_PY_LIBS="`
input_flags="$ac_cv_python_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_PYCFMT_SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for apr_int64_t Python/C API format string" >&5
$as_echo_n "checking for apr_int64_t Python/C API format string... " >&6; }
if ${svn_cv_pycfmt_apr_int64_t+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"lld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="L"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
r
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"ld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="l"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"d\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="i"
fi
rm -f conftest*
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_pycfmt_apr_int64_t" >&5
$as_echo "$svn_cv_pycfmt_apr_int64_t" >&6; }
CPPFLAGS="$SVN_PYCFMT_SAVE_CPPFLAGS"
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
as_fn_error $? "failed to recognize APR_INT64_T_FMT on this platform" "$LINENO" 5
fi
cat >>confdefs.h <<_ACEOF
#define SVN_APR_INT64_T_PYCFMT "$svn_cv_pycfmt_apr_int64_t"
_ACEOF
fi
if test "$PERL" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
$as_echo_n "checking perl version... " >&6; }
PERL_VERSION="`$PERL -e 'q([); print $] * 1000000,$/;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_VERSION" >&5
$as_echo "$PERL_VERSION" >&6; }
if test "$PERL_VERSION" -ge "5008000"; then
SWIG_PL_INCLUDES="\$(SWIG_INCLUDES) `$PERL -MExtUtils::Embed -e ccopts`"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl bindings require perl 5.8.0 or newer." >&5
$as_echo "$as_me: WARNING: perl bindings require perl 5.8.0 or newer." >&2;}
fi
fi
SWIG_RB_COMPILE="none"
SWIG_RB_LINK="none"
if test "$RUBY" != "none"; then
rbconfig="$RUBY -rrbconfig -e "
for var_name in arch archdir CC LDSHARED DLEXT LIBS LIBRUBYARG \
rubyhdrdir rubyarchhdrdir sitedir sitelibdir sitearchdir libdir
do
rbconfig_tmp=`$rbconfig "print RbConfig::CONFIG['$var_name']"`
eval "rbconfig_$var_name=\"$rbconfig_tmp\""
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Ruby SWIG binding" >&5
$as_echo "$as_me: Configuring Ruby SWIG binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby include path" >&5
$as_echo_n "checking for Ruby include path... " >&6; }
if ${svn_cv_ruby_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -d "$rbconfig_rubyhdrdir"; then
svn_cv_ruby_includes="-I. -I$rbconfig_rubyhdrdir -I$rbconfig_rubyhdrdir/ruby -I$rbconfig_rubyhdrdir/ruby/backward"
if test -d "$rbconfig_rubyarchhdrdir"; then
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyarchhdrdir"
else
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyhdrdir/$rbconfig_arch"
fi
else
svn_cv_ruby_includes="-I. -I$rbconfig_archdir"
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_includes" >&5
$as_echo "$svn_cv_ruby_includes" >&6; }
SWIG_RB_INCLUDES="\$(SWIG_INCLUDES) $svn_cv_ruby_includes"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to compile Ruby extensions" >&5
$as_echo_n "checking how to compile Ruby extensions... " >&6; }
if ${svn_cv_ruby_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_compile="$rbconfig_CC $CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_compile" >&5
$as_echo "$svn_cv_ruby_compile" >&6; }
SWIG_RB_COMPILE="$svn_cv_ruby_compile"
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-ansi//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c89//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c90//'`
SWIG_RB_COMPILE="$SWIG_RB_COMPILE -Wno-int-to-pointer-cast"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby extensions" >&5
$as_echo_n "checking how to link Ruby extensions... " >&6; }
if ${svn_cv_ruby_link+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_link="`$RUBY -e 'ARGV.shift; print ARGV.join(%q( ))' \
$rbconfig_LDSHARED`"
svn_cv_ruby_link="$rbconfig_CC $svn_cv_ruby_link"
svn_cv_ruby_link="$svn_cv_ruby_link -shrext .$rbconfig_DLEXT"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_link" >&5
$as_echo "$svn_cv_ruby_link" >&6; }
SWIG_RB_LINK="$svn_cv_ruby_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby libraries" >&5
$as_echo_n "checking how to link Ruby libraries... " >&6; }
if ${ac_cv_ruby_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_ruby_libs="$rbconfig_LIBRUBYARG $rbconfig_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ruby_libs" >&5
$as_echo "$ac_cv_ruby_libs" >&6; }
SWIG_RB_LIBS="`
input_flags="$ac_cv_ruby_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rb_errinfo" >&5
$as_echo_n "checking for rb_errinfo... " >&6; }
old_CFLAGS="$CFLAGS"
old_LIBS="$LIBS"
CFLAGS="$CFLAGS $svn_cv_ruby_includes"
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-ansi//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c89//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c90//'`
LIBS="$SWIG_RB_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ruby.h>
int main()
{rb_errinfo();}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
have_rb_errinfo="yes"
else
have_rb_errinfo="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$have_rb_errinfo" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
$as_echo "#define HAVE_RB_ERRINFO 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
CFLAGS="$old_CFLAGS"
LIBS="$old_LIBS"
if ${svn_cv_ruby_sitedir+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir="$rbconfig_sitedir"
fi
# Check whether --with-ruby-sitedir was given.
if test "${with_ruby_sitedir+set}" = set; then :
withval=$with_ruby_sitedir; svn_ruby_installdir="$withval"
else
svn_ruby_installdir="$svn_cv_ruby_sitedir"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby scripts" >&5
$as_echo_n "checking where to install Ruby scripts... " >&6; }
if ${svn_cv_ruby_sitedir_libsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_libsuffix="`echo "$rbconfig_sitelibdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_LIB_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_libsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_LIB_DIR" >&5
$as_echo "$SWIG_RB_SITE_LIB_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby extensions" >&5
$as_echo_n "checking where to install Ruby extensions... " >&6; }
if ${svn_cv_ruby_sitedir_archsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_archsuffix="`echo "$rbconfig_sitearchdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_ARCH_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_archsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_ARCH_DIR" >&5
$as_echo "$SWIG_RB_SITE_ARCH_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to use output level for Ruby bindings tests" >&5
$as_echo_n "checking how to use output level for Ruby bindings tests... " >&6; }
if ${svn_cv_ruby_test_verbose+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_test_verbose="normal"
fi
# Check whether --with-ruby-test-verbose was given.
if test "${with_ruby_test_verbose+set}" = set; then :
withval=$with_ruby_test_verbose; svn_ruby_test_verbose="$withval"
else
svn_ruby_test_verbose="$svn_cv_ruby_test_verbose"
fi
SWIG_RB_TEST_VERBOSE="$svn_ruby_test_verbose"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_TEST_VERBOSE" >&5
$as_echo "$SWIG_RB_TEST_VERBOSE" >&6; }
fi
;;
*)
where=$withval
if test $where = no; then
SWIG=none
elif test $where = check; then
# Extract the first word of "swig", so it can be a program name with args.
set dummy swig; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_SWIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SWIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_SWIG" && ac_cv_path_SWIG="none"
;;
esac
fi
SWIG=$ac_cv_path_SWIG
if test -n "$SWIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5
$as_echo "$SWIG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
if test -f "$where"; then
SWIG="$where"
else
SWIG="$where/bin/swig"
fi
if test ! -f "$SWIG" || test ! -x "$SWIG"; then
as_fn_error $? "Could not find swig binary at $SWIG" "$LINENO" 5
fi
fi
if test "$SWIG" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking swig version" >&5
$as_echo_n "checking swig version... " >&6; }
SWIG_VERSION_RAW="`$SWIG -version 2>&1 | \
$SED -ne 's/^.*Version \(.*\)$/\1/p'`"
# We want the version as an integer so we can test against
# which version we're using. SWIG doesn't provide this
# to us so we have to come up with it on our own.
# The major is passed straight through,
# the minor is zero padded to two places,
# and the patch level is zero padded to three places.
# e.g. 1.3.24 becomes 103024
SWIG_VERSION="`echo \"$SWIG_VERSION_RAW\" | \
$SED -e 's/[^0-9\.].*$//' \
-e 's/\.\([0-9]\)$/.0\1/' \
-e 's/\.\([0-9][0-9]\)$/.0\1/' \
-e 's/\.\([0-9]\)\./0\1/; s/\.//g;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_VERSION_RAW" >&5
$as_echo "$SWIG_VERSION_RAW" >&6; }
# If you change the required swig version number, don't forget to update:
# subversion/bindings/swig/INSTALL
# packages/rpm/redhat-8+/subversion.spec
# packages/rpm/redhat-7.x/subversion.spec
# packages/rpm/rhel-3/subversion.spec
# packages/rpm/rhel-4/subversion.spec
- if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024" && \
- test "$SWIG_VERSION" -lt "300000"; then
+ if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024"; then
SWIG_SUITABLE=yes
else
SWIG_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&5
$as_echo "$as_me: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&5
-$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24" >&5
+$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24" >&2;}
fi
fi
SWIG_PY_COMPILE="none"
SWIG_PY_LINK="none"
if test "$PYTHON" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring python swig binding" >&5
$as_echo "$as_me: Configuring python swig binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python includes" >&5
$as_echo_n "checking for Python includes... " >&6; }
if ${ac_cv_python_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_includes="`$PYTHON ${abs_srcdir}/build/get-py-info.py --includes`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_includes" >&5
$as_echo "$ac_cv_python_includes" >&6; }
SWIG_PY_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python_includes"
if test "$ac_cv_python_includes" = "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: python bindings cannot be built without distutils module" >&5
$as_echo "$as_me: WARNING: python bindings cannot be built without distutils module" >&2;}
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiling Python extensions" >&5
$as_echo_n "checking for compiling Python extensions... " >&6; }
if ${ac_cv_python_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_compile="`$PYTHON ${abs_srcdir}/build/get-py-info.py --compile`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_compile" >&5
$as_echo "$ac_cv_python_compile" >&6; }
SWIG_PY_COMPILE="$ac_cv_python_compile $CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python extensions" >&5
$as_echo_n "checking for linking Python extensions... " >&6; }
if ${ac_cv_python_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_link="`$PYTHON ${abs_srcdir}/build/get-py-info.py --link`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_link" >&5
$as_echo "$ac_cv_python_link" >&6; }
SWIG_PY_LINK="$ac_cv_python_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python libraries" >&5
$as_echo_n "checking for linking Python libraries... " >&6; }
if ${ac_cv_python_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_libs="`$PYTHON ${abs_srcdir}/build/get-py-info.py --libs`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_libs" >&5
$as_echo "$ac_cv_python_libs" >&6; }
SWIG_PY_LIBS="`
input_flags="$ac_cv_python_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_PYCFMT_SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for apr_int64_t Python/C API format string" >&5
$as_echo_n "checking for apr_int64_t Python/C API format string... " >&6; }
if ${svn_cv_pycfmt_apr_int64_t+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"lld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="L"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
r
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"ld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="l"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"d\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="i"
fi
rm -f conftest*
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_pycfmt_apr_int64_t" >&5
$as_echo "$svn_cv_pycfmt_apr_int64_t" >&6; }
CPPFLAGS="$SVN_PYCFMT_SAVE_CPPFLAGS"
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
as_fn_error $? "failed to recognize APR_INT64_T_FMT on this platform" "$LINENO" 5
fi
cat >>confdefs.h <<_ACEOF
#define SVN_APR_INT64_T_PYCFMT "$svn_cv_pycfmt_apr_int64_t"
_ACEOF
fi
if test "$PERL" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
$as_echo_n "checking perl version... " >&6; }
PERL_VERSION="`$PERL -e 'q([); print $] * 1000000,$/;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_VERSION" >&5
$as_echo "$PERL_VERSION" >&6; }
if test "$PERL_VERSION" -ge "5008000"; then
SWIG_PL_INCLUDES="\$(SWIG_INCLUDES) `$PERL -MExtUtils::Embed -e ccopts`"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl bindings require perl 5.8.0 or newer." >&5
$as_echo "$as_me: WARNING: perl bindings require perl 5.8.0 or newer." >&2;}
fi
fi
SWIG_RB_COMPILE="none"
SWIG_RB_LINK="none"
if test "$RUBY" != "none"; then
rbconfig="$RUBY -rrbconfig -e "
for var_name in arch archdir CC LDSHARED DLEXT LIBS LIBRUBYARG \
rubyhdrdir rubyarchhdrdir sitedir sitelibdir sitearchdir libdir
do
rbconfig_tmp=`$rbconfig "print RbConfig::CONFIG['$var_name']"`
eval "rbconfig_$var_name=\"$rbconfig_tmp\""
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Ruby SWIG binding" >&5
$as_echo "$as_me: Configuring Ruby SWIG binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby include path" >&5
$as_echo_n "checking for Ruby include path... " >&6; }
if ${svn_cv_ruby_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -d "$rbconfig_rubyhdrdir"; then
svn_cv_ruby_includes="-I. -I$rbconfig_rubyhdrdir -I$rbconfig_rubyhdrdir/ruby -I$rbconfig_rubyhdrdir/ruby/backward"
if test -d "$rbconfig_rubyarchhdrdir"; then
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyarchhdrdir"
else
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyhdrdir/$rbconfig_arch"
fi
else
svn_cv_ruby_includes="-I. -I$rbconfig_archdir"
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_includes" >&5
$as_echo "$svn_cv_ruby_includes" >&6; }
SWIG_RB_INCLUDES="\$(SWIG_INCLUDES) $svn_cv_ruby_includes"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to compile Ruby extensions" >&5
$as_echo_n "checking how to compile Ruby extensions... " >&6; }
if ${svn_cv_ruby_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_compile="$rbconfig_CC $CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_compile" >&5
$as_echo "$svn_cv_ruby_compile" >&6; }
SWIG_RB_COMPILE="$svn_cv_ruby_compile"
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-ansi//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c89//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c90//'`
SWIG_RB_COMPILE="$SWIG_RB_COMPILE -Wno-int-to-pointer-cast"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby extensions" >&5
$as_echo_n "checking how to link Ruby extensions... " >&6; }
if ${svn_cv_ruby_link+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_link="`$RUBY -e 'ARGV.shift; print ARGV.join(%q( ))' \
$rbconfig_LDSHARED`"
svn_cv_ruby_link="$rbconfig_CC $svn_cv_ruby_link"
svn_cv_ruby_link="$svn_cv_ruby_link -shrext .$rbconfig_DLEXT"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_link" >&5
$as_echo "$svn_cv_ruby_link" >&6; }
SWIG_RB_LINK="$svn_cv_ruby_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby libraries" >&5
$as_echo_n "checking how to link Ruby libraries... " >&6; }
if ${ac_cv_ruby_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_ruby_libs="$rbconfig_LIBRUBYARG $rbconfig_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ruby_libs" >&5
$as_echo "$ac_cv_ruby_libs" >&6; }
SWIG_RB_LIBS="`
input_flags="$ac_cv_ruby_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rb_errinfo" >&5
$as_echo_n "checking for rb_errinfo... " >&6; }
old_CFLAGS="$CFLAGS"
old_LIBS="$LIBS"
CFLAGS="$CFLAGS $svn_cv_ruby_includes"
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-ansi//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c89//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c90//'`
LIBS="$SWIG_RB_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ruby.h>
int main()
{rb_errinfo();}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
have_rb_errinfo="yes"
else
have_rb_errinfo="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$have_rb_errinfo" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
$as_echo "#define HAVE_RB_ERRINFO 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
CFLAGS="$old_CFLAGS"
LIBS="$old_LIBS"
if ${svn_cv_ruby_sitedir+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir="$rbconfig_sitedir"
fi
# Check whether --with-ruby-sitedir was given.
if test "${with_ruby_sitedir+set}" = set; then :
withval=$with_ruby_sitedir; svn_ruby_installdir="$withval"
else
svn_ruby_installdir="$svn_cv_ruby_sitedir"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby scripts" >&5
$as_echo_n "checking where to install Ruby scripts... " >&6; }
if ${svn_cv_ruby_sitedir_libsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_libsuffix="`echo "$rbconfig_sitelibdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_LIB_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_libsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_LIB_DIR" >&5
$as_echo "$SWIG_RB_SITE_LIB_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby extensions" >&5
$as_echo_n "checking where to install Ruby extensions... " >&6; }
if ${svn_cv_ruby_sitedir_archsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_archsuffix="`echo "$rbconfig_sitearchdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_ARCH_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_archsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_ARCH_DIR" >&5
$as_echo "$SWIG_RB_SITE_ARCH_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to use output level for Ruby bindings tests" >&5
$as_echo_n "checking how to use output level for Ruby bindings tests... " >&6; }
if ${svn_cv_ruby_test_verbose+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_test_verbose="normal"
fi
# Check whether --with-ruby-test-verbose was given.
if test "${with_ruby_test_verbose+set}" = set; then :
withval=$with_ruby_test_verbose; svn_ruby_test_verbose="$withval"
else
svn_ruby_test_verbose="$svn_cv_ruby_test_verbose"
fi
SWIG_RB_TEST_VERBOSE="$svn_ruby_test_verbose"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_TEST_VERBOSE" >&5
$as_echo "$SWIG_RB_TEST_VERBOSE" >&6; }
fi
;;
esac
else
where=check
if test $where = no; then
SWIG=none
elif test $where = check; then
# Extract the first word of "swig", so it can be a program name with args.
set dummy swig; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_SWIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SWIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_SWIG" && ac_cv_path_SWIG="none"
;;
esac
fi
SWIG=$ac_cv_path_SWIG
if test -n "$SWIG"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5
$as_echo "$SWIG" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
if test -f "$where"; then
SWIG="$where"
else
SWIG="$where/bin/swig"
fi
if test ! -f "$SWIG" || test ! -x "$SWIG"; then
as_fn_error $? "Could not find swig binary at $SWIG" "$LINENO" 5
fi
fi
if test "$SWIG" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking swig version" >&5
$as_echo_n "checking swig version... " >&6; }
SWIG_VERSION_RAW="`$SWIG -version 2>&1 | \
$SED -ne 's/^.*Version \(.*\)$/\1/p'`"
# We want the version as an integer so we can test against
# which version we're using. SWIG doesn't provide this
# to us so we have to come up with it on our own.
# The major is passed straight through,
# the minor is zero padded to two places,
# and the patch level is zero padded to three places.
# e.g. 1.3.24 becomes 103024
SWIG_VERSION="`echo \"$SWIG_VERSION_RAW\" | \
$SED -e 's/[^0-9\.].*$//' \
-e 's/\.\([0-9]\)$/.0\1/' \
-e 's/\.\([0-9][0-9]\)$/.0\1/' \
-e 's/\.\([0-9]\)\./0\1/; s/\.//g;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_VERSION_RAW" >&5
$as_echo "$SWIG_VERSION_RAW" >&6; }
# If you change the required swig version number, don't forget to update:
# subversion/bindings/swig/INSTALL
# packages/rpm/redhat-8+/subversion.spec
# packages/rpm/redhat-7.x/subversion.spec
# packages/rpm/rhel-3/subversion.spec
# packages/rpm/rhel-4/subversion.spec
- if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024" && \
- test "$SWIG_VERSION" -lt "300000"; then
+ if test -n "$SWIG_VERSION" && test "$SWIG_VERSION" -ge "103024"; then
SWIG_SUITABLE=yes
else
SWIG_SUITABLE=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&5
$as_echo "$as_me: WARNING: Detected SWIG version $SWIG_VERSION_RAW" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&5
-$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24 and < 3.0.0 " >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Subversion requires SWIG >= 1.3.24" >&5
+$as_echo "$as_me: WARNING: Subversion requires SWIG >= 1.3.24" >&2;}
fi
fi
SWIG_PY_COMPILE="none"
SWIG_PY_LINK="none"
if test "$PYTHON" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring python swig binding" >&5
$as_echo "$as_me: Configuring python swig binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python includes" >&5
$as_echo_n "checking for Python includes... " >&6; }
if ${ac_cv_python_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_includes="`$PYTHON ${abs_srcdir}/build/get-py-info.py --includes`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_includes" >&5
$as_echo "$ac_cv_python_includes" >&6; }
SWIG_PY_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python_includes"
if test "$ac_cv_python_includes" = "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: python bindings cannot be built without distutils module" >&5
$as_echo "$as_me: WARNING: python bindings cannot be built without distutils module" >&2;}
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiling Python extensions" >&5
$as_echo_n "checking for compiling Python extensions... " >&6; }
if ${ac_cv_python_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_compile="`$PYTHON ${abs_srcdir}/build/get-py-info.py --compile`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_compile" >&5
$as_echo "$ac_cv_python_compile" >&6; }
SWIG_PY_COMPILE="$ac_cv_python_compile $CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python extensions" >&5
$as_echo_n "checking for linking Python extensions... " >&6; }
if ${ac_cv_python_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_link="`$PYTHON ${abs_srcdir}/build/get-py-info.py --link`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_link" >&5
$as_echo "$ac_cv_python_link" >&6; }
SWIG_PY_LINK="$ac_cv_python_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking Python libraries" >&5
$as_echo_n "checking for linking Python libraries... " >&6; }
if ${ac_cv_python_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_python_libs="`$PYTHON ${abs_srcdir}/build/get-py-info.py --libs`"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_python_libs" >&5
$as_echo "$ac_cv_python_libs" >&6; }
SWIG_PY_LIBS="`
input_flags="$ac_cv_python_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
SVN_PYCFMT_SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for apr_int64_t Python/C API format string" >&5
$as_echo_n "checking for apr_int64_t Python/C API format string... " >&6; }
if ${svn_cv_pycfmt_apr_int64_t+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"lld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="L"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
r
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"ld\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="l"
fi
rm -f conftest*
fi
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <apr.h>
MaTcHtHiS APR_INT64_T_FMT EnDeNd
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "MaTcHtHiS +\"d\" +EnDeNd" >/dev/null 2>&1; then :
svn_cv_pycfmt_apr_int64_t="i"
fi
rm -f conftest*
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_pycfmt_apr_int64_t" >&5
$as_echo "$svn_cv_pycfmt_apr_int64_t" >&6; }
CPPFLAGS="$SVN_PYCFMT_SAVE_CPPFLAGS"
if test "x$svn_cv_pycfmt_apr_int64_t" = "x"; then
as_fn_error $? "failed to recognize APR_INT64_T_FMT on this platform" "$LINENO" 5
fi
cat >>confdefs.h <<_ACEOF
#define SVN_APR_INT64_T_PYCFMT "$svn_cv_pycfmt_apr_int64_t"
_ACEOF
fi
if test "$PERL" != "none"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
$as_echo_n "checking perl version... " >&6; }
PERL_VERSION="`$PERL -e 'q([); print $] * 1000000,$/;'`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_VERSION" >&5
$as_echo "$PERL_VERSION" >&6; }
if test "$PERL_VERSION" -ge "5008000"; then
SWIG_PL_INCLUDES="\$(SWIG_INCLUDES) `$PERL -MExtUtils::Embed -e ccopts`"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl bindings require perl 5.8.0 or newer." >&5
$as_echo "$as_me: WARNING: perl bindings require perl 5.8.0 or newer." >&2;}
fi
fi
SWIG_RB_COMPILE="none"
SWIG_RB_LINK="none"
if test "$RUBY" != "none"; then
rbconfig="$RUBY -rrbconfig -e "
for var_name in arch archdir CC LDSHARED DLEXT LIBS LIBRUBYARG \
rubyhdrdir rubyarchhdrdir sitedir sitelibdir sitearchdir libdir
do
rbconfig_tmp=`$rbconfig "print RbConfig::CONFIG['$var_name']"`
eval "rbconfig_$var_name=\"$rbconfig_tmp\""
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Ruby SWIG binding" >&5
$as_echo "$as_me: Configuring Ruby SWIG binding" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby include path" >&5
$as_echo_n "checking for Ruby include path... " >&6; }
if ${svn_cv_ruby_includes+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -d "$rbconfig_rubyhdrdir"; then
svn_cv_ruby_includes="-I. -I$rbconfig_rubyhdrdir -I$rbconfig_rubyhdrdir/ruby -I$rbconfig_rubyhdrdir/ruby/backward"
if test -d "$rbconfig_rubyarchhdrdir"; then
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyarchhdrdir"
else
svn_cv_ruby_includes="$svn_cv_ruby_includes -I$rbconfig_rubyhdrdir/$rbconfig_arch"
fi
else
svn_cv_ruby_includes="-I. -I$rbconfig_archdir"
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_includes" >&5
$as_echo "$svn_cv_ruby_includes" >&6; }
SWIG_RB_INCLUDES="\$(SWIG_INCLUDES) $svn_cv_ruby_includes"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to compile Ruby extensions" >&5
$as_echo_n "checking how to compile Ruby extensions... " >&6; }
if ${svn_cv_ruby_compile+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_compile="$rbconfig_CC $CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_compile" >&5
$as_echo "$svn_cv_ruby_compile" >&6; }
SWIG_RB_COMPILE="$svn_cv_ruby_compile"
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-ansi//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c89//'`
SWIG_RB_COMPILE=`echo "$SWIG_RB_COMPILE" | $SED -e 's/-std=c90//'`
SWIG_RB_COMPILE="$SWIG_RB_COMPILE -Wno-int-to-pointer-cast"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby extensions" >&5
$as_echo_n "checking how to link Ruby extensions... " >&6; }
if ${svn_cv_ruby_link+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_link="`$RUBY -e 'ARGV.shift; print ARGV.join(%q( ))' \
$rbconfig_LDSHARED`"
svn_cv_ruby_link="$rbconfig_CC $svn_cv_ruby_link"
svn_cv_ruby_link="$svn_cv_ruby_link -shrext .$rbconfig_DLEXT"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $svn_cv_ruby_link" >&5
$as_echo "$svn_cv_ruby_link" >&6; }
SWIG_RB_LINK="$svn_cv_ruby_link"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link Ruby libraries" >&5
$as_echo_n "checking how to link Ruby libraries... " >&6; }
if ${ac_cv_ruby_libs+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_ruby_libs="$rbconfig_LIBRUBYARG $rbconfig_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ruby_libs" >&5
$as_echo "$ac_cv_ruby_libs" >&6; }
SWIG_RB_LIBS="`
input_flags="$ac_cv_ruby_libs"
output_flags=""
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
for flag in $input_flags; do
filter="no"
for dir in $filtered_dirs; do
if test "$flag" = "-L$dir" || test "$flag" = "-L$dir/"; then
filter="yes"
break
fi
done
if test "$filter" = "no"; then
output_flags="$output_flags $flag"
fi
done
if test -n "$output_flags"; then
printf "%s" "${output_flags# }"
fi
`"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rb_errinfo" >&5
$as_echo_n "checking for rb_errinfo... " >&6; }
old_CFLAGS="$CFLAGS"
old_LIBS="$LIBS"
CFLAGS="$CFLAGS $svn_cv_ruby_includes"
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-ansi//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c89//'`
CFLAGS=`echo "$CFLAGS" | $SED -e 's/-std=c90//'`
LIBS="$SWIG_RB_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ruby.h>
int main()
{rb_errinfo();}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
have_rb_errinfo="yes"
else
have_rb_errinfo="no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$have_rb_errinfo" = "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
$as_echo "#define HAVE_RB_ERRINFO 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
CFLAGS="$old_CFLAGS"
LIBS="$old_LIBS"
if ${svn_cv_ruby_sitedir+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir="$rbconfig_sitedir"
fi
# Check whether --with-ruby-sitedir was given.
if test "${with_ruby_sitedir+set}" = set; then :
withval=$with_ruby_sitedir; svn_ruby_installdir="$withval"
else
svn_ruby_installdir="$svn_cv_ruby_sitedir"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby scripts" >&5
$as_echo_n "checking where to install Ruby scripts... " >&6; }
if ${svn_cv_ruby_sitedir_libsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_libsuffix="`echo "$rbconfig_sitelibdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_LIB_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_libsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_LIB_DIR" >&5
$as_echo "$SWIG_RB_SITE_LIB_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install Ruby extensions" >&5
$as_echo_n "checking where to install Ruby extensions... " >&6; }
if ${svn_cv_ruby_sitedir_archsuffix+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_sitedir_archsuffix="`echo "$rbconfig_sitearchdir" | \
$SED -e "s,^$rbconfig_sitedir,,"`"
fi
SWIG_RB_SITE_ARCH_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_archsuffix}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_SITE_ARCH_DIR" >&5
$as_echo "$SWIG_RB_SITE_ARCH_DIR" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to use output level for Ruby bindings tests" >&5
$as_echo_n "checking how to use output level for Ruby bindings tests... " >&6; }
if ${svn_cv_ruby_test_verbose+:} false; then :
$as_echo_n "(cached) " >&6
else
svn_cv_ruby_test_verbose="normal"
fi
# Check whether --with-ruby-test-verbose was given.
if test "${with_ruby_test_verbose+set}" = set; then :
withval=$with_ruby_test_verbose; svn_ruby_test_verbose="$withval"
else
svn_ruby_test_verbose="$svn_cv_ruby_test_verbose"
fi
SWIG_RB_TEST_VERBOSE="$svn_ruby_test_verbose"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_RB_TEST_VERBOSE" >&5
$as_echo "$SWIG_RB_TEST_VERBOSE" >&6; }
fi
fi
# Check whether --with-ctypesgen was given.
if test "${with_ctypesgen+set}" = set; then :
withval=$with_ctypesgen;
case "$withval" in
"no")
where=no
CTYPESGEN=none
if test $where = check; then
# Extract the first word of ""ctypesgen.py"", so it can be a program name with args.
set dummy "ctypesgen.py"; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_CTYPESGEN+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CTYPESGEN in
[\\/]* | ?:[\\/]*)
ac_cv_path_CTYPESGEN="$CTYPESGEN" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_CTYPESGEN="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_CTYPESGEN" && ac_cv_path_CTYPESGEN="none"
;;
esac
fi
CTYPESGEN=$ac_cv_path_CTYPESGEN
if test -n "$CTYPESGEN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
elif test $where != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ctypesgen.py" >&5
$as_echo_n "checking for ctypesgen.py... " >&6; }
if test -f "$where"; then
CTYPESGEN="$where"
elif test -f "$where/bin/ctypesgen.py"; then
CTYPESGEN="$where/bin/ctypesgen.py"
else
CTYPESGEN="$where/ctypesgen.py"
fi
if test ! -f "$CTYPESGEN" || test ! -x "$CTYPESGEN"; then
as_fn_error $? "Could not find ctypesgen at $where/ctypesgen.py or at
$where/bin/ctypesgen.py" "$LINENO" 5
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
fi
fi
;;
"yes")
where=check
CTYPESGEN=none
if test $where = check; then
# Extract the first word of ""ctypesgen.py"", so it can be a program name with args.
set dummy "ctypesgen.py"; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_CTYPESGEN+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CTYPESGEN in
[\\/]* | ?:[\\/]*)
ac_cv_path_CTYPESGEN="$CTYPESGEN" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_CTYPESGEN="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_CTYPESGEN" && ac_cv_path_CTYPESGEN="none"
;;
esac
fi
CTYPESGEN=$ac_cv_path_CTYPESGEN
if test -n "$CTYPESGEN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
elif test $where != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ctypesgen.py" >&5
$as_echo_n "checking for ctypesgen.py... " >&6; }
if test -f "$where"; then
CTYPESGEN="$where"
elif test -f "$where/bin/ctypesgen.py"; then
CTYPESGEN="$where/bin/ctypesgen.py"
else
CTYPESGEN="$where/ctypesgen.py"
fi
if test ! -f "$CTYPESGEN" || test ! -x "$CTYPESGEN"; then
as_fn_error $? "Could not find ctypesgen at $where/ctypesgen.py or at
$where/bin/ctypesgen.py" "$LINENO" 5
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
fi
fi
;;
*)
where=$withval
CTYPESGEN=none
if test $where = check; then
# Extract the first word of ""ctypesgen.py"", so it can be a program name with args.
set dummy "ctypesgen.py"; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_CTYPESGEN+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CTYPESGEN in
[\\/]* | ?:[\\/]*)
ac_cv_path_CTYPESGEN="$CTYPESGEN" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_CTYPESGEN="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_CTYPESGEN" && ac_cv_path_CTYPESGEN="none"
;;
esac
fi
CTYPESGEN=$ac_cv_path_CTYPESGEN
if test -n "$CTYPESGEN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
elif test $where != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ctypesgen.py" >&5
$as_echo_n "checking for ctypesgen.py... " >&6; }
if test -f "$where"; then
CTYPESGEN="$where"
elif test -f "$where/bin/ctypesgen.py"; then
CTYPESGEN="$where/bin/ctypesgen.py"
else
CTYPESGEN="$where/ctypesgen.py"
fi
if test ! -f "$CTYPESGEN" || test ! -x "$CTYPESGEN"; then
as_fn_error $? "Could not find ctypesgen at $where/ctypesgen.py or at
$where/bin/ctypesgen.py" "$LINENO" 5
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
fi
fi
;;
esac
else
where=check
CTYPESGEN=none
if test $where = check; then
# Extract the first word of ""ctypesgen.py"", so it can be a program name with args.
set dummy "ctypesgen.py"; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_CTYPESGEN+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CTYPESGEN in
[\\/]* | ?:[\\/]*)
ac_cv_path_CTYPESGEN="$CTYPESGEN" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_CTYPESGEN="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
test -z "$ac_cv_path_CTYPESGEN" && ac_cv_path_CTYPESGEN="none"
;;
esac
fi
CTYPESGEN=$ac_cv_path_CTYPESGEN
if test -n "$CTYPESGEN"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
elif test $where != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ctypesgen.py" >&5
$as_echo_n "checking for ctypesgen.py... " >&6; }
if test -f "$where"; then
CTYPESGEN="$where"
elif test -f "$where/bin/ctypesgen.py"; then
CTYPESGEN="$where/bin/ctypesgen.py"
else
CTYPESGEN="$where/ctypesgen.py"
fi
if test ! -f "$CTYPESGEN" || test ! -x "$CTYPESGEN"; then
as_fn_error $? "Could not find ctypesgen at $where/ctypesgen.py or at
$where/bin/ctypesgen.py" "$LINENO" 5
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CTYPESGEN" >&5
$as_echo "$CTYPESGEN" >&6; }
fi
fi
fi
# Check whether --enable-runtime-module-search was given.
if test "${enable_runtime_module_search+set}" = set; then :
enableval=$enable_runtime_module_search;
if test "$enableval" = "yes"; then
use_dso=yes
if test "$svn_enable_shared" = "no"; then
as_fn_error $? "--enable-runtime-module-search conflicts with --disable-shared" "$LINENO" 5
fi
$as_echo "#define SVN_USE_DSO 1" >>confdefs.h
fi
fi
if test "$svn_enable_shared" = "no" || test "$use_dso" != "yes"; then
$as_echo "#define SVN_LIBSVN_CLIENT_LINKS_RA_LOCAL 1" >>confdefs.h
svn_ra_lib_deps="\$(RA_LOCAL_DEPS)"
svn_ra_lib_install_deps="install-ramod-lib"
svn_ra_lib_link="\$(RA_LOCAL_LINK)"
$as_echo "#define SVN_LIBSVN_CLIENT_LINKS_RA_SVN 1" >>confdefs.h
svn_ra_lib_deps="$svn_ra_lib_deps \$(RA_SVN_DEPS)"
svn_ra_lib_link="$svn_ra_lib_link \$(RA_SVN_LINK)"
if test "$svn_lib_serf" = "yes"; then
$as_echo "#define SVN_LIBSVN_CLIENT_LINKS_RA_SERF 1" >>confdefs.h
svn_ra_lib_deps="$svn_ra_lib_deps \$(RA_SERF_DEPS)"
svn_ra_lib_install_deps="$svn_ra_lib_install_deps install-serf-lib"
svn_ra_lib_link="$svn_ra_lib_link \$(RA_SERF_LINK)"
fi
SVN_RA_LIB_DEPS=$svn_ra_lib_deps
SVN_RA_LIB_INSTALL_DEPS=$svn_ra_lib_install_deps
SVN_RA_LIB_LINK=$svn_ra_lib_link
$as_echo "#define SVN_LIBSVN_FS_LINKS_FS_FS 1" >>confdefs.h
svn_fs_lib_deps="\$(FS_FS_DEPS)"
svn_fs_lib_install_deps="install-fsmod-lib"
svn_fs_lib_link="\$(FS_FS_LINK)"
$as_echo "#define SVN_LIBSVN_FS_LINKS_FS_X 1" >>confdefs.h
svn_fs_lib_deps="$svn_fs_lib_deps \$(FS_X_DEPS)"
svn_fs_lib_link="$svn_fs_lib_link \$(FS_X_LINK)"
if test "$svn_lib_berkeley_db" = "yes"; then
$as_echo "#define SVN_LIBSVN_FS_LINKS_FS_BASE 1" >>confdefs.h
svn_fs_lib_deps="$svn_fs_lib_deps \$(FS_BASE_DEPS)"
svn_fs_lib_install_deps="$svn_fs_lib_install_deps install-bdb-lib"
svn_fs_lib_link="$svn_fs_lib_link \$(FS_BASE_LINK)"
fi
SVN_FS_LIB_DEPS=$svn_fs_lib_deps
SVN_FS_LIB_INSTALL_DEPS=$svn_fs_lib_install_deps
SVN_FS_LIB_LINK=$svn_fs_lib_link
fi
# ==== JavaHL ================================================================
do_javahl_build=no
# Check whether --enable-javahl was given.
if test "${enable_javahl+set}" = set; then :
enableval=$enable_javahl; if test "$enableval" = "yes" ; then
do_javahl_build="yes"
fi
fi
JAVAHL_OBJDIR=""
INSTALL_EXTRA_JAVAHL_LIB=""
FIX_JAVAHL_LIB=""
JAVAHL_TESTS_TARGET=""
JAVAHL_COMPAT_TESTS_TARGET=""
LT_CXX_LIBADD=""
if test "$do_javahl_build" = "yes"; then
if test "$JDK_SUITABLE" = "no"; then
as_fn_error $? "Cannot compile JavaHL without a suitable JDK.
Please specify a suitable JDK using the --with-jdk option." "$LINENO" 5
fi
JAVAHL_OBJDIR='$(libsvnjavahl_PATH)/.libs'
os_arch=`uname`
if test "$os_arch" = "Darwin"; then
INSTALL_EXTRA_JAVAHL_LIB='ln -sf $(libdir)/libsvnjavahl-1.dylib $(libdir)/libsvnjavahl-1.jnilib'
FIX_JAVAHL_LIB="ln -sf libsvnjavahl-1.dylib $JAVAHL_OBJDIR/libsvnjavahl-1.jnilib"
fi
# This segment (and the rest of r10800) is very likely unnecessary
# with libtool 1.5, which automatically adds libstdc++ as a
# dependency to the C++ libraries it builds. So at some future time
# when autogen.sh requires libtool 1.5 or higher, we can get rid of
# it.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for additional flags to link C++ libraries" >&5
$as_echo_n "checking for additional flags to link C++ libraries... " >&6; }
if test "x$ac_compiler_gnu" = "xyes"; then
case "$host" in
*freebsd10*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; }
;;
*)
LT_CXX_LIBADD="-lstdc++"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LT_CXX_LIBADD" >&5
$as_echo "$LT_CXX_LIBADD" >&6; }
;;
esac
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; }
fi
fi
# Check whether --with-junit was given.
if test "${with_junit+set}" = set; then :
withval=$with_junit;
if test "$withval" != "no"; then
if test -n "$JAVA_CLASSPATH"; then
JAVA_CLASSPATH="$withval:$JAVA_CLASSPATH"
else
JAVA_CLASSPATH="$withval"
fi
JAVAHL_TESTS_TARGET="javahl-tests"
JAVAHL_COMPAT_TESTS_TARGET="javahl-compat-tests"
fi
fi
# ==== Miscellaneous bits ====================================================
for ac_header in stdbool.h inttypes.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
# Strip '-no-cpp-precomp' from CPPFLAGS for the clang compiler
### I think we get this flag from APR, so the fix probably belongs there
if test "$CC" = "clang"; then
CPPFLAGS=`echo "$CPPFLAGS" | $SED -e 's/-no-cpp-precomp //'`
fi
# Need to strip '-no-cpp-precomp' from CPPFLAGS for SWIG as well.
SWIG_CPPFLAGS="$CPPFLAGS"
SWIG_CPPFLAGS=`echo "$SWIG_CPPFLAGS" | $SED -e 's/-no-cpp-precomp //'`
+ SWIG_CPPFLAGS=`echo "$SWIG_CPPFLAGS" | $SED -e 's/-Wdate-time //'`
+
+
cat >>confdefs.h <<_ACEOF
#define SVN_PATH_LOCAL_SEPARATOR '/'
_ACEOF
cat >>confdefs.h <<_ACEOF
#define SVN_NULL_DEVICE_NAME "/dev/null"
_ACEOF
DEFAULT_FS_TYPE="fsfs"
cat >>confdefs.h <<_ACEOF
#define DEFAULT_FS_TYPE "$DEFAULT_FS_TYPE"
_ACEOF
DEFAULT_HTTP_LIBRARY="serf"
cat >>confdefs.h <<_ACEOF
#define DEFAULT_HTTP_LIBRARY "$DEFAULT_HTTP_LIBRARY"
_ACEOF
# BSD/OS (BSDi) needs to use a different include syntax in Makefile
INCLUDE_OUTPUTS="include \$(top_srcdir)/build-outputs.mk"
case "$host" in
*bsdi*)
# Check whether they've installed GNU make
if ! make --version > /dev/null 2>&1; then
# BSDi make
INCLUDE_OUTPUTS=".include \"\$(top_srcdir)/build-outputs.mk\""
fi
;;
esac
# ==== Detection complete - output and run config.status =====================
ac_config_headers="$ac_config_headers subversion/svn_private_config.h.tmp:subversion/svn_private_config.h.in"
ac_config_commands="$ac_config_commands svn_private_config.h.tmp"
ac_config_files="$ac_config_files Makefile"
# Create pkg-config .pc files from .pc.in files
for pc_in_file in "${abs_srcdir}"/subversion/libsvn_*/*.pc.in; do
pc_file=${pc_in_file#${abs_srcdir}/}
pc_file=${pc_file%.in}
ac_config_files="$ac_config_files ${pc_file}"
done
SVN_CONFIG_SCRIPT_FILES="$SVN_CONFIG_SCRIPT_FILES tools/backup/hot-backup.py"
ac_config_files="$ac_config_files tools/backup/hot-backup.py"
SVN_CONFIG_SCRIPT_FILES="$SVN_CONFIG_SCRIPT_FILES tools/hook-scripts/commit-access-control.pl"
ac_config_files="$ac_config_files tools/hook-scripts/commit-access-control.pl"
SVN_CONFIG_SCRIPT_FILES="$SVN_CONFIG_SCRIPT_FILES subversion/bindings/swig/perl/native/Makefile.PL"
ac_config_files="$ac_config_files subversion/bindings/swig/perl/native/Makefile.PL"
if test -e packages/solaris/pkginfo.in; then
SVN_CONFIG_SCRIPT_FILES="$SVN_CONFIG_SCRIPT_FILES packages/solaris/pkginfo"
ac_config_files="$ac_config_files packages/solaris/pkginfo"
fi
# Ensure that SWIG is checked after reconfiguration.
rm -f .swig_checked
cat >>confdefs.h <<_ACEOF
#define SVN_BUILD_HOST "${host}"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define SVN_BUILD_TARGET "${target}"
_ACEOF
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems. If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.
_ACEOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
eval ac_val=\$$ac_var
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
*_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
*) { eval $ac_var=; unset $ac_var;} ;;
esac ;;
esac
done
(set) 2>&1 |
case $as_nl`(ac_space=' '; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
# `set' does not quote correctly, so add quotes: double-quote
# substitution turns \\\\ into \\, and sed turns \\ into \.
sed -n \
"s/'/'\\\\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
;; #(
*)
# `set' quotes correctly as required by POSIX, so do not add quotes.
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
sort
) |
sed '
/^ac_cv_env_/b end
t clear
:clear
s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
case $cache_file in #(
*/* | ?:*)
mv -f confcache "$cache_file"$$ &&
mv -f "$cache_file"$$ "$cache_file" ;; #(
*)
mv -f confcache "$cache_file" ;;
esac
fi
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
DEFS=-DHAVE_CONFIG_H
ac_libobjs=
ac_ltlibobjs=
U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.
debug=false
ac_cs_recheck=false
ac_cs_silent=false
SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
esac
fi
as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
&& (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='print -r --'
as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='printf %s\n'
as_echo_n='printf %s'
else
if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
as_echo_n='/usr/ucb/echo -n'
else
as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
as_echo_n_body='eval
arg=$1;
case $arg in #(
*"$as_nl"*)
expr "X$arg" : "X\\(.*\\)$as_nl";
arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
esac;
expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
'
export as_echo_n_body
as_echo_n='sh -c $as_echo_n_body as_echo'
fi
export as_echo_body
as_echo='sh -c $as_echo_body as_echo'
fi
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
PATH_SEPARATOR=';'
}
fi
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
done
IFS=$as_save_IFS
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
$as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there. '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
&& ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
$as_echo "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
return $1
} # as_fn_set_status
# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
set +e
as_fn_set_status $1
exit $1
} # as_fn_exit
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
else
as_fn_append ()
{
eval $1=\$$1\$2
}
fi # as_fn_append
# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
else
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
if expr a : '\(a\)' >/dev/null 2>&1 &&
test "X`expr 00001 : '.*\(...\)'`" = X001; then
as_expr=expr
else
as_expr=false
fi
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
as_basename=basename
else
as_basename=false
fi
if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
as_dirname=dirname
else
as_dirname=false
fi
as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
}
/^X\/\(\/\/\)$/{
s//\1/
q
}
/^X\/\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
case `echo 'xy\c'` in
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
xy) ECHO_C='\c';;
*) echo `echo ksh88 bug on AIX 6.1` > /dev/null
ECHO_T=' ';;
esac;;
*)
ECHO_N='-n';;
esac
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
else
rm -f conf$$.dir
mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
as_ln_s='cp -pR'
fi
else
as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{
case $as_dir in #(
-*) as_dir=./$as_dir;;
esac
test -d "$as_dir" || eval $as_mkdir_p || {
as_dirs=
while :; do
case $as_dir in #(
*\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
as_mkdir_p='mkdir -p "$as_dir"'
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
test -f "$1" && test -x "$1"
} # as_fn_executable_p
as_test_x='test -x'
as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by subversion $as_me 1.9.4, which was
+This file was extended by subversion $as_me 1.9.5, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
CONFIG_LINKS = $CONFIG_LINKS
CONFIG_COMMANDS = $CONFIG_COMMANDS
$ $0 $@
on `(hostname || uname -n) 2>/dev/null | sed 1q`
"
_ACEOF
case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac
case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"
config_commands="$ac_config_commands"
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
\`$as_me' instantiates files and other configuration actions
from templates according to the current configuration. Unless the files
and actions are specified as TAGs, all are instantiated by default.
Usage: $0 [OPTION]... [TAG]...
-h, --help print this help, then exit
-V, --version print version number and configuration settings, then exit
--config print configuration, then exit
-q, --quiet, --silent
do not print progress messages
-d, --debug don't remove temporary files
--recheck update $as_me by reconfiguring in the same conditions
--file=FILE[:TEMPLATE]
instantiate the configuration file FILE
--header=FILE[:TEMPLATE]
instantiate the configuration header FILE
Configuration files:
$config_files
Configuration headers:
$config_headers
Configuration commands:
$config_commands
Report bugs to <http://subversion.apache.org/>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-subversion config.status 1.9.4
+subversion config.status 1.9.5
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
AWK='$AWK'
test -n "\$AWK" || AWK=awk
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
case $1 in
--*=?*)
ac_option=`expr "X$1" : 'X\([^=]*\)='`
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
ac_shift=:
;;
--*=)
ac_option=`expr "X$1" : 'X\([^=]*\)='`
ac_optarg=
ac_shift=:
;;
*)
ac_option=$1
ac_optarg=$2
ac_shift=shift
;;
esac
case $ac_option in
# Handling of the options.
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
$as_echo "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
$as_echo "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--header | --heade | --head | --hea )
$ac_shift
case $ac_optarg in
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
as_fn_append CONFIG_HEADERS " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h)
# Conflict between --help and --header
as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
--help | --hel | -h )
$as_echo "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
# This is an error.
-*) as_fn_error $? "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;
*) as_fn_append ac_config_targets " $1"
ac_need_defaults=false ;;
esac
shift
done
ac_configure_extra_args=
if $ac_cs_silent; then
exec 6>/dev/null
ac_configure_extra_args="$ac_configure_extra_args --silent"
fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
fi
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
echo
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
$as_echo "$ac_log"
} >&5
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
sed_quote_subst='$sed_quote_subst'
double_quote_subst='$double_quote_subst'
delay_variable_subst='$delay_variable_subst'
macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
LTCC='$LTCC'
LTCFLAGS='$LTCFLAGS'
compiler='$compiler_DEFAULT'
# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
eval 'cat <<_LTECHO_EOF
\$1
_LTECHO_EOF'
}
# Quote evaled strings.
for var in SHELL \
ECHO \
PATH_SEPARATOR \
SED \
GREP \
EGREP \
FGREP \
LD \
NM \
LN_S \
lt_SP2NL \
lt_NL2SP \
reload_flag \
OBJDUMP \
deplibs_check_method \
file_magic_cmd \
file_magic_glob \
want_nocaseglob \
DLLTOOL \
sharedlib_from_linklib_cmd \
AR \
AR_FLAGS \
archiver_list_spec \
STRIP \
RANLIB \
CC \
CFLAGS \
compiler \
lt_cv_sys_global_symbol_pipe \
lt_cv_sys_global_symbol_to_cdecl \
lt_cv_sys_global_symbol_to_import \
lt_cv_sys_global_symbol_to_c_name_address \
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
lt_cv_nm_interface \
nm_file_list_spec \
lt_cv_truncate_bin \
lt_prog_compiler_no_builtin_flag \
lt_prog_compiler_pic \
lt_prog_compiler_wl \
lt_prog_compiler_static \
lt_cv_prog_compiler_c_o \
need_locks \
MANIFEST_TOOL \
DSYMUTIL \
NMEDIT \
LIPO \
OTOOL \
OTOOL64 \
shrext_cmds \
export_dynamic_flag_spec \
whole_archive_flag_spec \
compiler_needs_object \
with_gnu_ld \
allow_undefined_flag \
no_undefined_flag \
hardcode_libdir_flag_spec \
hardcode_libdir_separator \
exclude_expsyms \
include_expsyms \
file_list_spec \
variables_saved_for_relink \
libname_spec \
library_names_spec \
soname_spec \
install_override_mode \
finish_eval \
old_striplib \
striplib \
compiler_lib_search_dirs \
predep_objects \
postdep_objects \
predeps \
postdeps \
compiler_lib_search_path \
LD_CXX \
reload_flag_CXX \
compiler_CXX \
lt_prog_compiler_no_builtin_flag_CXX \
lt_prog_compiler_pic_CXX \
lt_prog_compiler_wl_CXX \
lt_prog_compiler_static_CXX \
lt_cv_prog_compiler_c_o_CXX \
export_dynamic_flag_spec_CXX \
whole_archive_flag_spec_CXX \
compiler_needs_object_CXX \
with_gnu_ld_CXX \
allow_undefined_flag_CXX \
no_undefined_flag_CXX \
hardcode_libdir_flag_spec_CXX \
hardcode_libdir_separator_CXX \
exclude_expsyms_CXX \
include_expsyms_CXX \
file_list_spec_CXX \
compiler_lib_search_dirs_CXX \
predep_objects_CXX \
postdep_objects_CXX \
predeps_CXX \
postdeps_CXX \
compiler_lib_search_path_CXX; do
case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[\\\\\\\`\\"\\\$]*)
eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
;;
esac
done
# Double-quote double-evaled strings.
for var in reload_cmds \
old_postinstall_cmds \
old_postuninstall_cmds \
old_archive_cmds \
extract_expsyms_cmds \
old_archive_from_new_cmds \
old_archive_from_expsyms_cmds \
archive_cmds \
archive_expsym_cmds \
module_cmds \
module_expsym_cmds \
export_symbols_cmds \
prelink_cmds \
postlink_cmds \
postinstall_cmds \
postuninstall_cmds \
finish_cmds \
sys_lib_search_path_spec \
configure_time_dlsearch_path \
configure_time_lt_sys_library_path \
reload_cmds_CXX \
old_archive_cmds_CXX \
old_archive_from_new_cmds_CXX \
old_archive_from_expsyms_cmds_CXX \
archive_cmds_CXX \
archive_expsym_cmds_CXX \
module_cmds_CXX \
module_expsym_cmds_CXX \
export_symbols_cmds_CXX \
prelink_cmds_CXX \
postlink_cmds_CXX; do
case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[\\\\\\\`\\"\\\$]*)
eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
;;
esac
done
ac_aux_dir='$ac_aux_dir'
# See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes INIT.
if test -n "\${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
PACKAGE='$PACKAGE'
VERSION='$VERSION'
RM='$RM'
ofile='$ofile'
SED="$SED"
SVN_DB_HEADER="$SVN_DB_HEADER"
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Handling of arguments.
for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"subversion/svn_private_config.h.tmp") CONFIG_HEADERS="$CONFIG_HEADERS subversion/svn_private_config.h.tmp:subversion/svn_private_config.h.in" ;;
"svn_private_config.h.tmp") CONFIG_COMMANDS="$CONFIG_COMMANDS svn_private_config.h.tmp" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"${pc_file}") CONFIG_FILES="$CONFIG_FILES ${pc_file}" ;;
"tools/backup/hot-backup.py") CONFIG_FILES="$CONFIG_FILES tools/backup/hot-backup.py" ;;
"tools/hook-scripts/commit-access-control.pl") CONFIG_FILES="$CONFIG_FILES tools/hook-scripts/commit-access-control.pl" ;;
"subversion/bindings/swig/perl/native/Makefile.PL") CONFIG_FILES="$CONFIG_FILES subversion/bindings/swig/perl/native/Makefile.PL" ;;
"packages/solaris/pkginfo") CONFIG_FILES="$CONFIG_FILES packages/solaris/pkginfo" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
done
# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used. Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi
# Have a temporary directory for convenience. Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
tmp= ac_tmp=
trap 'exit_status=$?
: "${ac_tmp:=$tmp}"
{ test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
test -d "$tmp"
} ||
{
tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then
ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
ac_cs_awk_cr='\\r'
else
ac_cs_awk_cr=$ac_cr
fi
echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF
{
echo "cat >conf$$subs.awk <<_ACEOF" &&
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
echo "_ACEOF"
} >conf$$subs.sh ||
as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
. ./conf$$subs.sh ||
as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
if test $ac_delim_n = $ac_delim_num; then
break
elif $ac_last_try; then
as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
done
rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\)..*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\)..*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' <conf$$subs.awk | sed '
/^[^""]/{
N
s/\n//
}
' >>$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1
FS = ""
}
{
line = $ 0
nfields = split(line, field, "@")
substed = 0
len = length(field[1])
for (i = 2; i < nfields; i++) {
key = field[i]
keylen = length(key)
if (S_is_set[key]) {
value = S[key]
line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
len += length(value) + length(field[++i])
substed = 1
} else
len += 1 + keylen
}
print line
}
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
cat
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF
# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
h
s///
s/^/:/
s/[ ]*$/:/
s/:\$(srcdir):/:/g
s/:\${srcdir}:/:/g
s/:@srcdir@:/:/g
s/^:*//
s/:*$//
x
s/\(=[ ]*\).*/\1/
G
s/\n//
s/^[^=]*=[ ]*$//
}'
fi
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"
# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF
# Transform confdefs.h into an awk script `defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.
# Create a delimiter string that does not exist in confdefs.h, to ease
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
if test -z "$ac_tt"; then
break
elif $ac_last_try; then
as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
done
# For the awk script, D is an array of macro values keyed by name,
# likewise P contains macro parameters if any. Preserve backslash
# newline sequences.
ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
sed -n '
s/.\{148\}/&'"$ac_delim"'/g
t rset
:rset
s/^[ ]*#[ ]*define[ ][ ]*/ /
t def
d
:def
s/\\$//
t bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3"/p
s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
d
:bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3\\\\\\n"\\/p
t cont
s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
t cont
d
:cont
n
s/.\{148\}/&'"$ac_delim"'/g
t clear
:clear
s/\\$//
t bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/"/p
d
:bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
b cont
' <confdefs.h | sed '
s/'"$ac_delim"'/"\\\
"/g' >>$CONFIG_STATUS || ac_write_fail=1
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
for (key in D) D_is_set[key] = 1
FS = ""
}
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
line = \$ 0
split(line, arg, " ")
if (arg[1] == "#") {
defundef = arg[2]
mac1 = arg[3]
} else {
defundef = substr(arg[1], 2)
mac1 = arg[2]
}
split(mac1, mac2, "(") #)
macro = mac2[1]
prefix = substr(line, 1, index(line, defundef) - 1)
if (D_is_set[macro]) {
# Preserve the white space surrounding the "#".
print prefix "define", macro P[macro] D[macro]
next
} else {
# Replace #undef with comments. This is necessary, for example,
# in the case of _POSIX_SOURCE, which is predefined and required
# on some systems where configure will not decide to define it.
if (defundef == "undef") {
print "/*", prefix defundef, macro, "*/"
next
}
}
}
{ print }
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"
eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
shift
for ac_tag
do
case $ac_tag in
:[FHLC]) ac_mode=$ac_tag; continue;;
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
:L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
ac_save_IFS=$IFS
IFS=:
set x $ac_tag
IFS=$ac_save_IFS
shift
ac_file=$1
shift
case $ac_mode in
:L) ac_source=$1;;
:[FH])
ac_file_inputs=
for ac_f
do
case $ac_f in
-) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
test -f "$ac_f" ||
case $ac_f in
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
$as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
$as_echo "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
ac_sed_conf_input=`$as_echo "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
case $ac_tag in
*:-:* | *:-) cat >"$ac_tmp/stdin" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac
;;
esac
ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
as_dir="$ac_dir"; as_fn_mkdir_p
ac_builddir=.
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix
case $srcdir in
.) # We are building in place.
ac_srcdir=.
ac_top_srcdir=$ac_top_builddir_sub
ac_abs_top_srcdir=$ac_pwd ;;
[\\/]* | ?:[\\/]* ) # Absolute name.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir
ac_abs_top_srcdir=$srcdir ;;
*) # Relative name.
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_build_prefix$srcdir
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
case $ac_mode in
:F)
#
# CONFIG_FILE
#
case $INSTALL in
[\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
*) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
esac
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
p
q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
s&@datadir@&$datadir&g
s&@docdir@&$docdir&g
s&@infodir@&$infodir&g
s&@localedir@&$localedir&g
s&@mandir@&$mandir&g
s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF
# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
>$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
case $ac_file in
-) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
*) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
esac \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
;;
:H)
#
# CONFIG_HEADER
#
if test x"$ac_file" != x-; then
{
$as_echo "/* $configure_input */" \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
} >"$ac_tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
mv "$ac_tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
$as_echo "/* $configure_input */" \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5
fi
;;
:C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
$as_echo "$as_me: executing $ac_file commands" >&6;}
;;
esac
case $ac_file$ac_mode in
"libtool":C)
# See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes.
if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
cfgfile=${ofile}T
trap "$RM \"$cfgfile\"; exit 1" 1 2 15
$RM "$cfgfile"
cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
# Generated automatically by $as_me ($PACKAGE) $VERSION
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
# Provide generalized library-building support services.
# Written by Gordon Matzigkeit, 1996
# Copyright (C) 2014 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# GNU Libtool is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program or library that is built
# using GNU Libtool, you may include this file under the same
# distribution terms that you use for the rest of that program.
#
# GNU Libtool is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# The names of the tagged configurations supported by this script.
available_tags='CXX '
# Configured defaults for sys_lib_dlsearch_path munging.
: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
# ### BEGIN LIBTOOL CONFIG
# Which release of libtool.m4 was used?
macro_version=$macro_version
macro_revision=$macro_revision
# Whether or not to build shared libraries.
build_libtool_libs=$enable_shared
# Whether or not to build static libraries.
build_old_libs=$enable_static
# What type of objects to build.
pic_mode=$pic_mode
# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install
# Shared archive member basename,for filename based shared library versioning on AIX.
shared_archive_member_spec=$shared_archive_member_spec
# Shell to use when invoking shell scripts.
SHELL=$lt_SHELL
# An echo program that protects backslashes.
ECHO=$lt_ECHO
# The PATH separator for the build system.
PATH_SEPARATOR=$lt_PATH_SEPARATOR
# The host system.
host_alias=$host_alias
host=$host
host_os=$host_os
# The build system.
build_alias=$build_alias
build=$build
build_os=$build_os
# A sed program that does not truncate output.
SED=$lt_SED
# Sed that helps us avoid accidentally triggering echo(1) options like -n.
Xsed="\$SED -e 1s/^X//"
# A grep program that handles long lines.
GREP=$lt_GREP
# An ERE matcher.
EGREP=$lt_EGREP
# A literal string matcher.
FGREP=$lt_FGREP
# A BSD- or MS-compatible name lister.
NM=$lt_NM
# Whether we need soft or hard links.
LN_S=$lt_LN_S
# What is the maximum length of a command?
max_cmd_len=$max_cmd_len
# Object file suffix (normally "o").
objext=$ac_objext
# Executable file suffix (normally "").
exeext=$exeext
# whether the shell understands "unset".
lt_unset=$lt_unset
# turn spaces into newlines.
SP2NL=$lt_lt_SP2NL
# turn newlines into spaces.
NL2SP=$lt_lt_NL2SP
# convert \$build file names to \$host format.
to_host_file_cmd=$lt_cv_to_host_file_cmd
# convert \$build files to toolchain format.
to_tool_file_cmd=$lt_cv_to_tool_file_cmd
# An object symbol dumper.
OBJDUMP=$lt_OBJDUMP
# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method
# Command to use when deplibs_check_method = "file_magic".
file_magic_cmd=$lt_file_magic_cmd
# How to find potential files when deplibs_check_method = "file_magic".
file_magic_glob=$lt_file_magic_glob
# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
want_nocaseglob=$lt_want_nocaseglob
# DLL creation program.
DLLTOOL=$lt_DLLTOOL
# Command to associate shared and link libraries.
sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
# The archiver.
AR=$lt_AR
# Flags to create an archive.
AR_FLAGS=$lt_AR_FLAGS
# How to feed a file listing to the archiver.
archiver_list_spec=$lt_archiver_list_spec
# A symbol stripping program.
STRIP=$lt_STRIP
# Commands used to install an old-style archive.
RANLIB=$lt_RANLIB
old_postinstall_cmds=$lt_old_postinstall_cmds
old_postuninstall_cmds=$lt_old_postuninstall_cmds
# Whether to use a lock for old archive extraction.
lock_old_archive_extraction=$lock_old_archive_extraction
# A C compiler.
LTCC=$lt_CC
# LTCC compiler flags.
LTCFLAGS=$lt_CFLAGS
# Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
# Transform the output of nm in a proper C declaration.
global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
# Transform the output of nm into a list of symbols to manually relocate.
global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
# Transform the output of nm in a C name address pair.
global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
# Transform the output of nm in a C name address pair when lib prefix is needed.
global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
# The name lister interface.
nm_interface=$lt_lt_cv_nm_interface
# Specify filename containing input files for \$NM.
nm_file_list_spec=$lt_nm_file_list_spec
# The root where to search for dependent libraries,and where our libraries should be installed.
lt_sysroot=$lt_sysroot
# Command to truncate a binary pipe.
lt_truncate_bin=$lt_lt_cv_truncate_bin
# The name of the directory that contains temporary libtool files.
objdir=$objdir
# Used to examine libraries when file_magic_cmd begins with "file".
MAGIC_CMD=$MAGIC_CMD
# Must we lock files when doing compilation?
need_locks=$lt_need_locks
# Manifest tool.
MANIFEST_TOOL=$lt_MANIFEST_TOOL
# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
DSYMUTIL=$lt_DSYMUTIL
# Tool to change global to local symbols on Mac OS X.
NMEDIT=$lt_NMEDIT
# Tool to manipulate fat objects and archives on Mac OS X.
LIPO=$lt_LIPO
# ldd/readelf like tool for Mach-O binaries on Mac OS X.
OTOOL=$lt_OTOOL
# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
OTOOL64=$lt_OTOOL64
# Old archive suffix (normally "a").
libext=$libext
# Shared library suffix (normally ".so").
shrext_cmds=$lt_shrext_cmds
# The commands to extract the exported symbol list from a shared archive.
extract_expsyms_cmds=$lt_extract_expsyms_cmds
# Variables whose values should be saved in libtool wrapper scripts and
# restored at link time.
variables_saved_for_relink=$lt_variables_saved_for_relink
# Do we need the "lib" prefix for modules?
need_lib_prefix=$need_lib_prefix
# Do we need a version for libraries?
need_version=$need_version
# Library versioning type.
version_type=$version_type
# Shared library runtime path variable.
runpath_var=$runpath_var
# Shared library path variable.
shlibpath_var=$shlibpath_var
# Is shlibpath searched before the hard-coded library search path?
shlibpath_overrides_runpath=$shlibpath_overrides_runpath
# Format of library name prefix.
libname_spec=$lt_libname_spec
# List of archive names. First name is the real one, the rest are links.
# The last name is the one that the linker finds with -lNAME
library_names_spec=$lt_library_names_spec
# The coded name of the library, if different from the real name.
soname_spec=$lt_soname_spec
# Permission mode override for installation of shared libraries.
install_override_mode=$lt_install_override_mode
# Command to use after installation of a shared archive.
postinstall_cmds=$lt_postinstall_cmds
# Command to use after uninstallation of a shared archive.
postuninstall_cmds=$lt_postuninstall_cmds
# Commands used to finish a libtool library installation in a directory.
finish_cmds=$lt_finish_cmds
# As "finish_cmds", except a single script fragment to be evaled but
# not shown.
finish_eval=$lt_finish_eval
# Whether we should hardcode library paths into libraries.
hardcode_into_libs=$hardcode_into_libs
# Compile-time system search path for libraries.
sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
# Detected run-time system search path for libraries.
sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
# Whether dlopen is supported.
dlopen_support=$enable_dlopen
# Whether dlopen of programs is supported.
dlopen_self=$enable_dlopen_self
# Whether dlopen of statically linked programs is supported.
dlopen_self_static=$enable_dlopen_self_static
# Commands to strip libraries.
old_striplib=$lt_old_striplib
striplib=$lt_striplib
# The linker used to build libraries.
LD=$lt_LD
# How to create reloadable object files.
reload_flag=$lt_reload_flag
reload_cmds=$lt_reload_cmds
# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds
# A language specific compiler.
CC=$lt_compiler
# Is the compiler the GNU compiler?
with_gcc=$GCC
# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic
# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl
# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static
# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o
# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc
# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec
# Whether the compiler copes with passing no objects directly.
compiler_needs_object=$lt_compiler_needs_object
# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
# Commands used to build a shared archive.
archive_cmds=$lt_archive_cmds
archive_expsym_cmds=$lt_archive_expsym_cmds
# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=$lt_module_cmds
module_expsym_cmds=$lt_module_expsym_cmds
# Whether we are building with GNU ld or not.
with_gnu_ld=$lt_with_gnu_ld
# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag
# Flag that enforces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag
# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator
# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct
# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute
# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=$hardcode_minus_L
# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var
# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=$hardcode_automatic
# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=$inherit_rpath
# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs
# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols
# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds
# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms
# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms
# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds
# Commands necessary for finishing linking programs.
postlink_cmds=$lt_postlink_cmds
# Specify filename containing input files.
file_list_spec=$lt_file_list_spec
# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action
# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects=$lt_predep_objects
postdep_objects=$lt_postdep_objects
predeps=$lt_predeps
postdeps=$lt_postdeps
# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=$lt_compiler_lib_search_path
# ### END LIBTOOL CONFIG
_LT_EOF
cat <<'_LT_EOF' >> "$cfgfile"
# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
# func_munge_path_list VARIABLE PATH
# -----------------------------------
# VARIABLE is name of variable containing _space_ separated list of
# directories to be munged by the contents of PATH, which is string
# having a format:
# "DIR[:DIR]:"
# string "DIR[ DIR]" will be prepended to VARIABLE
# ":DIR[:DIR]"
# string "DIR[ DIR]" will be appended to VARIABLE
# "DIRP[:DIRP]::[DIRA:]DIRA"
# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
# "DIRA[ DIRA]" will be appended to VARIABLE
# "DIR[:DIR]"
# VARIABLE will be replaced by "DIR[ DIR]"
func_munge_path_list ()
{
case x$2 in
x)
;;
*:)
eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
;;
x:*)
eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
;;
*::*)
eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
;;
*)
eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
;;
esac
}
# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
func_cc_basename ()
{
for cc_temp in $*""; do
case $cc_temp in
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
\-*) ;;
*) break;;
esac
done
func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
}
# ### END FUNCTIONS SHARED WITH CONFIGURE
_LT_EOF
case $host_os in
aix3*)
cat <<\_LT_EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test set != "${COLLECT_NAMES+set}"; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
_LT_EOF
;;
esac
ltmain=$ac_aux_dir/ltmain.sh
# We use sed instead of cat because bash on DJGPP gets confused if
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
sed '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" ||
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
cat <<_LT_EOF >> "$ofile"
# ### BEGIN LIBTOOL TAG CONFIG: CXX
# The linker used to build libraries.
LD=$lt_LD_CXX
# How to create reloadable object files.
reload_flag=$lt_reload_flag_CXX
reload_cmds=$lt_reload_cmds_CXX
# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds_CXX
# A language specific compiler.
CC=$lt_compiler_CXX
# Is the compiler the GNU compiler?
with_gcc=$GCC_CXX
# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic_CXX
# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl_CXX
# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static_CXX
# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc_CXX
# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
# Whether the compiler copes with passing no objects directly.
compiler_needs_object=$lt_compiler_needs_object_CXX
# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
# Commands used to build a shared archive.
archive_cmds=$lt_archive_cmds_CXX
archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=$lt_module_cmds_CXX
module_expsym_cmds=$lt_module_expsym_cmds_CXX
# Whether we are building with GNU ld or not.
with_gnu_ld=$lt_with_gnu_ld_CXX
# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag_CXX
# Flag that enforces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag_CXX
# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct_CXX
# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute_CXX
# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=$hardcode_minus_L_CXX
# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=$hardcode_automatic_CXX
# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=$inherit_rpath_CXX
# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs_CXX
# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols_CXX
# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds_CXX
# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms_CXX
# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms_CXX
# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds_CXX
# Commands necessary for finishing linking programs.
postlink_cmds=$lt_postlink_cmds_CXX
# Specify filename containing input files.
file_list_spec=$lt_file_list_spec_CXX
# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action_CXX
# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects=$lt_predep_objects_CXX
postdep_objects=$lt_postdep_objects_CXX
predeps=$lt_predeps_CXX
postdeps=$lt_postdeps_CXX
# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
# ### END LIBTOOL TAG CONFIG: CXX
_LT_EOF
;;
"svn_private_config.h.tmp":C) svn_cf=subversion/svn_private_config.h;
$SED -e "s/@SVN_DB_HEADER@/$SVN_DB_HEADER/" $svn_cf.tmp > $svn_cf.tmp.new
cmp -s $svn_cf.tmp.new $svn_cf || mv -f $svn_cf.tmp.new $svn_cf
rm -f $svn_cf.tmp.new $svn_cf.tmp ;;
"tools/backup/hot-backup.py":F) chmod +x tools/backup/hot-backup.py ;;
"tools/hook-scripts/commit-access-control.pl":F) chmod +x tools/hook-scripts/commit-access-control.pl ;;
"subversion/bindings/swig/perl/native/Makefile.PL":F) chmod +x subversion/bindings/swig/perl/native/Makefile.PL ;;
"packages/solaris/pkginfo":F) chmod +x packages/solaris/pkginfo ;;
esac
done # for ac_tag
as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save
test $ac_write_fail = 0 ||
as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded. So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status. When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
ac_cs_success=:
ac_config_status_args=
test "$silent" = yes &&
ac_config_status_args="$ac_config_status_args --quiet"
exec 5>/dev/null
$SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
exec 5>>config.log
# Use ||, not &&, to avoid exiting from the if with $? = 1, which
# would make configure fail if this is the last instruction.
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
# ==== Print final messages to user ==========================================
if test "$svn_have_berkeley_db" = "no6" && test "$enable_bdb6" != "no"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: We have configured without BDB filesystem support
Berkeley DB 6 was found, but not used. Please re-run configure (see
./config.nice) with the '--enable-bdb6' flag to use it,
or explicitly specify '--disable-bdb6' or '--without-berkeley-db'
to silence this warning.
Please note that some versions of Berkeley DB 6+ are under the GNU Affero
General Public License, version 3:
https://oss.oracle.com/pipermail/bdb/2013-June/000056.html
The AGPL-3.0 licence may impose special requirements for making available
source code of server-side software. The text of the licence is:
https://www.gnu.org/licenses/agpl-3.0.html
http://opensource.org/licenses/AGPL-3.0
The Berkeley DB backend to Subversion is deprecated; see
http://subversion.apache.org/docs/release-notes/1.8#bdb-deprecated
The Subversion developers have not tested Subversion with Berkeley DB 6 for
technical problems or bugs.
" >&5
$as_echo "$as_me: WARNING: We have configured without BDB filesystem support
Berkeley DB 6 was found, but not used. Please re-run configure (see
./config.nice) with the '--enable-bdb6' flag to use it,
or explicitly specify '--disable-bdb6' or '--without-berkeley-db'
to silence this warning.
Please note that some versions of Berkeley DB 6+ are under the GNU Affero
General Public License, version 3:
https://oss.oracle.com/pipermail/bdb/2013-June/000056.html
The AGPL-3.0 licence may impose special requirements for making available
source code of server-side software. The text of the licence is:
https://www.gnu.org/licenses/agpl-3.0.html
http://opensource.org/licenses/AGPL-3.0
The Berkeley DB backend to Subversion is deprecated; see
http://subversion.apache.org/docs/release-notes/1.8#bdb-deprecated
The Subversion developers have not tested Subversion with Berkeley DB 6 for
technical problems or bugs.
" >&2;}
fi
Index: stable/11/contrib/subversion/configure.ac
===================================================================
--- stable/11/contrib/subversion/configure.ac (revision 309510)
+++ stable/11/contrib/subversion/configure.ac (revision 309511)
@@ -1,1607 +1,1611 @@
dnl Licensed to the Apache Software Foundation (ASF) under one
dnl or more contributor license agreements. See the NOTICE file
dnl distributed with this work for additional information
dnl regarding copyright ownership. The ASF licenses this file
dnl to you under the Apache License, Version 2.0 (the
dnl "License"); you may not use this file except in compliance
dnl with the License. You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing,
dnl software distributed under the License is distributed on an
dnl "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
dnl KIND, either express or implied. See the License for the
dnl specific language governing permissions and limitations
dnl under the License.
dnl configure.ac: Autoconfiscation for Subversion
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
dnl Get the version of Subversion, using m4's esyscmd() command to do this
dnl at m4-time, since AC_INIT() requires it then.
AC_INIT([subversion],
[esyscmd(python build/getversion.py SVN subversion/include/svn_version.h)],
[http://subversion.apache.org/])
AC_CONFIG_SRCDIR(subversion/include/svn_types.h)
AC_CONFIG_AUX_DIR([build])
AC_MSG_NOTICE([Configuring Subversion ]AC_PACKAGE_VERSION)
AC_SUBST([abs_srcdir], ["`cd $srcdir && pwd`"])
AC_SUBST([abs_builddir], ["`pwd`"])
if test "$abs_srcdir" = "$abs_builddir"; then
canonicalized_srcdir=""
else
canonicalized_srcdir="$srcdir/"
fi
AC_SUBST([canonicalized_srcdir])
SWIG_LDFLAGS="$LDFLAGS"
AC_SUBST([SWIG_LDFLAGS])
# Generate config.nice early (before the arguments are munged)
SVN_CONFIG_NICE(config.nice)
# ==== Check for programs ====================================================
# Look for a C compiler (before anything can set CFLAGS)
CUSERFLAGS="$CFLAGS"
AC_PROG_CC
SVN_CC_MODE_SETUP
# Look for a C++ compiler (before anything can set CXXFLAGS)
CXXUSERFLAGS="$CXXFLAGS"
AC_PROG_CXX
SVN_CXX_MODE_SETUP
# Look for a C pre-processor
AC_PROG_CPP
# Look for a good sed
# AC_PROG_SED was introduced in Autoconf 2.59b
m4_ifdef([AC_PROG_SED], [AC_PROG_SED], [SED="${SED:-sed}"])
# Grab target_cpu, so we can use it in the Solaris pkginfo file
AC_CANONICAL_TARGET
# Look for an extended grep
AC_PROG_EGREP
AC_PROG_LN_S
AC_PROG_INSTALL
# If $INSTALL is relative path to our fallback install-sh, then convert
# to an absolute path, as in some cases (e.g. Solaris VPATH build), libtool
# may try to use it from a changed working directory.
if test "$INSTALL" = "build/install-sh -c"; then
INSTALL="$abs_srcdir/$INSTALL"
fi
if test -z "$MKDIR"; then
MKDIR="$INSTALL -d"
fi
AC_SUBST([MKDIR])
# ==== Libraries, for which we may have source to build ======================
dnl verify apr version and set apr flags
dnl These regular expressions should not contain "\(" and "\)".
APR_VER_REGEXES=["1\.[3-9]\. 2\."]
SVN_LIB_APR($APR_VER_REGEXES)
if test `expr $apr_version : 2` -ne 0; then
dnl Bump the library so-version to 2 if using APR-2
dnl (Debian uses so-version 1 for APR-1-with-largefile)
svn_lib_ver=2
dnl APR-2 provides APRUTIL
apu_config=$apr_config
AC_SUBST(SVN_APRUTIL_INCLUDES)
AC_SUBST(SVN_APRUTIL_CONFIG, ["$apu_config"])
AC_SUBST(SVN_APRUTIL_LIBS)
SVN_APR_MAJOR_VERSION=2
else
svn_lib_ver=0
APU_VER_REGEXES=["1\.[3-9]\."]
SVN_LIB_APRUTIL($APU_VER_REGEXES)
SVN_APR_MAJOR_VERSION=1
fi
AC_SUBST(SVN_APR_MAJOR_VERSION)
SVN_LT_SOVERSION="-version-info $svn_lib_ver"
AC_SUBST(SVN_LT_SOVERSION)
AC_DEFINE_UNQUOTED(SVN_SOVERSION, $svn_lib_ver,
[Subversion library major verson])
dnl Search for pkg-config
AC_PATH_PROG(PKG_CONFIG, pkg-config)
dnl Search for serf
SVN_LIB_SERF(1,3,4)
if test "$svn_lib_serf" = "yes"; then
AC_DEFINE([SVN_HAVE_SERF], 1,
[Defined if support for Serf is enabled])
fi
dnl Search for apr_memcache (only affects fs_fs)
SVN_LIB_APR_MEMCACHE
if test "$svn_lib_apr_memcache" = "yes"; then
AC_DEFINE(SVN_HAVE_MEMCACHE, 1,
[Defined if apr_memcache (standalone or in apr-util) is present])
fi
dnl Find Apache with a recent-enough magic module number
SVN_FIND_APACHE(20051115)
dnl Search for SQLite. If you change SQLITE_URL from a .zip to
dnl something else also update build/ac-macros/sqlite.m4 to reflect
dnl the correct command to unpack the downloaded file.
SQLITE_MINIMUM_VER="3.7.12"
SQLITE_RECOMMENDED_VER="3.7.15.1"
SQLITE_URL="http://www.sqlite.org/sqlite-amalgamation-$(printf %d%02d%02d%02d $(echo ${SQLITE_RECOMMENDED_VER} | sed -e 's/\./ /g')).zip"
SVN_LIB_SQLITE(${SQLITE_MINIMUM_VER}, ${SQLITE_RECOMMENDED_VER},
${SQLITE_URL})
AC_ARG_ENABLE(sqlite-compatibility-version,
AS_HELP_STRING([--enable-sqlite-compatibility-version=X.Y.Z],
[Allow binary to run against SQLite as old as ARG]),
[sqlite_compat_ver=$enableval],[sqlite_compat_ver=no])
if test -n "$sqlite_compat_ver" && test "$sqlite_compat_ver" != no; then
SVN_SQLITE_VERNUM_PARSE([$sqlite_compat_ver],
[sqlite_compat_ver_num])
CFLAGS="-DSVN_SQLITE_MIN_VERSION='\"$sqlite_compat_ver\"' $CFLAGS"
CFLAGS="-DSVN_SQLITE_MIN_VERSION_NUMBER=$sqlite_compat_ver_num $CFLAGS"
fi
SVN_CHECK_FOR_ATOMIC_BUILTINS
if test "$svn_cv_atomic_builtins" = "yes"; then
AC_DEFINE(SVN_HAS_ATOMIC_BUILTINS, 1, [Define if compiler provides atomic builtins])
fi
dnl Set up a number of directories ---------------------
dnl Create SVN_BINDIR for proper substitution
if test "${bindir}" = '${exec_prefix}/bin'; then
if test "${exec_prefix}" = "NONE"; then
if test "${prefix}" = "NONE"; then
SVN_BINDIR="${ac_default_prefix}/bin"
else
SVN_BINDIR="${prefix}/bin"
fi
else
SVN_BINDIR="${exec_prefix}/bin"
fi
else
SVN_BINDIR="${bindir}"
fi
dnl fully evaluate this value. when we substitute it into our tool scripts,
dnl they will not have things such as ${bindir} available
SVN_BINDIR="`eval echo ${SVN_BINDIR}`"
AC_SUBST(SVN_BINDIR)
dnl provide ${bindir} in svn_private_config.h for use in compiled code
AC_DEFINE_UNQUOTED(SVN_BINDIR, "${SVN_BINDIR}",
[Defined to be the path to the installed binaries])
dnl This purposely does *not* allow for multiple parallel installs.
dnl However, it is compatible with most gettext usages.
localedir='${datadir}/locale'
AC_SUBST(localedir)
dnl For SVN_LOCALE_DIR, we have to expand it to something. See SVN_BINDIR.
-if test "${datadir}" = '${prefix}/share' && test "${prefix}" = "NONE"; then
+if test "${prefix}" = "NONE" \
+ && ( test "${datadir}" = '${prefix}/share' \
+ || ( test "${datadir}" = '${datarootdir}' \
+ && test "${datarootdir}" = '${prefix}/share' ) ); then
exp_localedir='${ac_default_prefix}/share/locale'
else
exp_localedir=$localedir
fi
SVN_EXPAND_VAR(svn_localedir, "${exp_localedir}")
AC_DEFINE_UNQUOTED(SVN_LOCALE_DIR, "${svn_localedir}",
[Defined to be the path to the installed locale dirs])
dnl Check for libtool -- we'll definitely need it for all our shared libs!
AC_MSG_NOTICE([configuring libtool now])
ifdef([LT_INIT], [LT_INIT], [AC_PROG_LIBTOOL])
AC_ARG_ENABLE(experimental-libtool,
AS_HELP_STRING([--enable-experimental-libtool],[Use APR's libtool]),
[experimental_libtool=$enableval],[experimental_libtool=no])
if test "$experimental_libtool" = "yes"; then
echo "using APR's libtool"
sh_libtool="`$apr_config --apr-libtool`"
LIBTOOL="$sh_libtool"
SVN_LIBTOOL="$sh_libtool"
else
sh_libtool="$abs_builddir/libtool"
SVN_LIBTOOL="\$(SHELL) \"$sh_libtool\""
fi
AC_SUBST(SVN_LIBTOOL)
dnl Determine the libtool version
changequote(, )dnl
lt_pversion=`$LIBTOOL --version 2>/dev/null|$SED -e 's/([^)]*)//g;s/^[^0-9]*//;s/[- ].*//g;q'`
lt_version=`echo $lt_pversion|$SED -e 's/\([a-z]*\)$/.\1/'`
lt_major_version=`echo $lt_version | cut -d'.' -f 1`
changequote([, ])dnl
dnl set the default parameters
svn_enable_static=yes
svn_enable_shared=yes
dnl check for --enable-static option
AC_ARG_ENABLE(static,
AS_HELP_STRING([--enable-static],
[Build static libraries]),
[svn_enable_static="$enableval"], [svn_enable_static="yes"])
dnl check for --enable-shared option
AC_ARG_ENABLE(shared,
AS_HELP_STRING([--enable-shared],
[Build shared libraries]),
[svn_enable_shared="$enableval"], [svn_enable_shared="yes"])
if test "$svn_enable_static" = "yes" && test "$svn_enable_shared" = "yes" ; then
AC_MSG_NOTICE([building both shared and static libraries])
elif test "$svn_enable_static" = "yes" ; then
AC_MSG_NOTICE([building static libraries only])
LT_CFLAGS="-static $LT_CFLAGS"
LT_LDFLAGS="-static $LT_LDFLAGS"
elif test "$svn_enable_shared" = "yes" ; then
AC_MSG_NOTICE([building shared libraries only])
if test "$lt_major_version" = "1" ; then
LT_CFLAGS="-prefer-pic $LT_CFLAGS"
elif test "$lt_major_version" = "2" ; then
LT_CFLAGS="-shared $LT_CFLAGS"
fi
LT_LDFLAGS="-shared $LT_LDFLAGS"
else
AC_MSG_ERROR([cannot disable both shared and static libraries])
fi
dnl Check for --enable-all-static option
AC_ARG_ENABLE(all-static,
AS_HELP_STRING([--enable-all-static],
[Build completely static (standalone) binaries.]),
[
if test "$enableval" = "yes" ; then
LT_LDFLAGS="-all-static $LT_LDFLAGS"
elif test "$enableval" != "no" ; then
AC_MSG_ERROR([--enable-all-static doesn't accept argument])
fi
])
AC_SUBST(LT_CFLAGS)
AC_SUBST(LT_LDFLAGS)
AC_ARG_ENABLE(local-library-preloading,
AS_HELP_STRING([--enable-local-library-preloading],
[Enable preloading of locally built libraries in locally
built executables. This may be necessary for testing
prior to installation on some platforms. It does not
work on some platforms (Darwin, OpenBSD, ...).]),
[
if test "$enableval" != "no"; then
if test "$svn_enable_shared" = "yes"; then
TRANSFORM_LIBTOOL_SCRIPTS="transform-libtool-scripts"
else
AC_MSG_ERROR([--enable-local-library-preloading conflicts with --disable-shared])
fi
else
TRANSFORM_LIBTOOL_SCRIPTS=""
fi
], [
TRANSFORM_LIBTOOL_SCRIPTS=""
])
AC_SUBST(TRANSFORM_LIBTOOL_SCRIPTS)
dnl Check if -no-undefined is needed for the platform.
dnl It should always work but with libtool 1.4.3 on OS X it breaks the build.
dnl So we only turn it on for platforms where we know we really need it.
AC_MSG_CHECKING([whether libtool needs -no-undefined])
case $host in
*-*-cygwin*)
AC_MSG_RESULT([yes])
LT_NO_UNDEFINED="-no-undefined"
;;
*)
AC_MSG_RESULT([no])
LT_NO_UNDEFINED=""
;;
esac
AC_SUBST(LT_NO_UNDEFINED)
dnl Check for trang.
trang=yes
AC_ARG_WITH(trang,
AS_HELP_STRING([--with-trang=PATH],
[Specify the command to run the trang schema converter]),
[
trang="$withval"
])
if test "$trang" = "yes"; then
AC_PATH_PROG(TRANG, trang, none)
else
TRANG="$trang"
AC_SUBST(TRANG)
fi
dnl Check for doxygen
doxygen=yes
AC_ARG_WITH(doxygen,
AC_HELP_STRING([--with-doxygen=PATH],
[Specify the command to run doxygen]),
[
doxygen="$withval"
])
if test "$doxygen" = "yes"; then
AC_PATH_PROG(DOXYGEN, doxygen, none)
else
DOXYGEN="$doxygen"
AC_SUBST(DOXYGEN)
fi
dnl Check for libraries --------------------
dnl Expat -------------------
AC_ARG_WITH(expat,
AS_HELP_STRING([--with-expat=INCLUDES:LIB_SEARCH_DIRS:LIBS],
[Specify location of Expat]),
[svn_lib_expat="$withval"],
[svn_lib_expat="::expat"])
# APR-util accepts "builtin" as an argument to this option so if the user
# passed "builtin" pretend the user didn't specify the --with-expat option
# at all. Expat will (hopefully) be found in apr-util.
test "_$svn_lib_expat" = "_builtin" && svn_lib_expat="::expat"
AC_MSG_CHECKING([for Expat])
if test -n "`echo "$svn_lib_expat" | $EGREP ":.*:"`"; then
SVN_XML_INCLUDES=""
for i in [`echo "$svn_lib_expat" | $SED -e "s/\([^:]*\):.*/\1/"`]; do
SVN_XML_INCLUDES="$SVN_XML_INCLUDES -I$i"
done
SVN_XML_INCLUDES="${SVN_XML_INCLUDES## }"
for l in [`echo "$svn_lib_expat" | $SED -e "s/.*:\([^:]*\):.*/\1/"`]; do
LDFLAGS="$LDFLAGS -L$l"
done
for l in [`echo "$svn_lib_expat" | $SED -e "s/.*:\([^:]*\)/\1/"`]; do
SVN_XML_LIBS="$SVN_XML_LIBS -l$l"
done
SVN_XML_LIBS="${SVN_XML_LIBS## }"
old_CPPFLAGS="$CPPFLAGS"
old_LIBS="$LIBS"
CPPFLAGS="$CPPFLAGS $SVN_XML_INCLUDES"
LIBS="$LIBS $SVN_XML_LIBS"
AC_LINK_IFELSE([AC_LANG_SOURCE([[
#include <expat.h>
int main()
{XML_ParserCreate(NULL);}]])], svn_lib_expat="yes", svn_lib_expat="no")
LIBS="$old_LIBS"
if test "$svn_lib_expat" = "yes"; then
AC_MSG_RESULT([yes])
else
SVN_XML_INCLUDES=""
SVN_XML_LIBS=""
CPPFLAGS="$CPPFLAGS $SVN_APRUTIL_INCLUDES"
if test "$enable_all_static" != "yes"; then
SVN_APRUTIL_LIBS="$SVN_APRUTIL_LIBS `$apu_config --libs`"
fi
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include <expat.h>
int main()
{XML_ParserCreate(NULL);}]])], svn_lib_expat="yes", svn_lib_expat="no")
if test "$svn_lib_expat" = "yes"; then
AC_MSG_RESULT([yes])
AC_MSG_WARN([Expat found amongst libraries used by APR-Util, but Subversion libraries might be needlessly linked against additional unused libraries. It can be avoided by specifying exact location of Expat in argument of --with-expat option.])
else
AC_MSG_RESULT([no])
AC_MSG_ERROR([Expat not found])
fi
fi
CPPFLAGS="$old_CPPFLAGS"
else
AC_MSG_RESULT([no])
if test "$svn_lib_expat" = "yes"; then
AC_MSG_ERROR([--with-expat option requires argument])
elif test "$svn_lib_expat" = "no"; then
AC_MSG_ERROR([Expat is required])
else
AC_MSG_ERROR([Invalid syntax of argument of --with-expat option])
fi
fi
AC_SUBST(SVN_XML_INCLUDES)
AC_SUBST(SVN_XML_LIBS)
dnl Berkeley DB -------------------
# Berkeley DB on SCO OpenServer needs -lsocket
AC_CHECK_LIB(socket, socket)
# Build the BDB filesystem library only if we have an appropriate
# version of Berkeley DB.
case "$host" in
powerpc-apple-darwin*)
# Berkeley DB 4.0 does not work on OS X.
SVN_FS_WANT_DB_MAJOR=4
SVN_FS_WANT_DB_MINOR=1
SVN_FS_WANT_DB_PATCH=25
;;
*)
SVN_FS_WANT_DB_MAJOR=4
SVN_FS_WANT_DB_MINOR=0
SVN_FS_WANT_DB_PATCH=14
;;
esac
db_alt_version="5.x"
# Look for libdb4.so first:
SVN_LIB_BERKELEY_DB($SVN_FS_WANT_DB_MAJOR, $SVN_FS_WANT_DB_MINOR,
$SVN_FS_WANT_DB_PATCH, [db4 db])
AC_DEFINE_UNQUOTED(SVN_FS_WANT_DB_MAJOR, $SVN_FS_WANT_DB_MAJOR,
[The desired major version for the Berkeley DB])
AC_DEFINE_UNQUOTED(SVN_FS_WANT_DB_MINOR, $SVN_FS_WANT_DB_MINOR,
[The desired minor version for the Berkeley DB])
AC_DEFINE_UNQUOTED(SVN_FS_WANT_DB_PATCH, $SVN_FS_WANT_DB_PATCH,
[The desired patch version for the Berkeley DB])
AC_SUBST(SVN_DB_INCLUDES)
AC_SUBST(SVN_DB_LIBS)
SVN_LIB_SASL
if test "$svn_lib_sasl" = "yes"; then
AC_DEFINE(SVN_HAVE_SASL, 1,
[Defined if Cyrus SASL v2 is present on the system])
fi
dnl Mac OS specific features -------------------
SVN_LIB_MACHO_ITERATE
SVN_LIB_MACOS_PLIST
SVN_LIB_MACOS_KEYCHAIN
dnl APR_HAS_DSO -------------------
AC_MSG_CHECKING([whether APR has support for DSOs])
old_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES"
AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
#include <apr.h>
#if !APR_HAS_DSO
#error
#endif]])],
APR_HAS_DSO="yes"
AC_MSG_RESULT([yes]),
APR_HAS_DSO="no"
AC_MSG_RESULT([no]))
CPPFLAGS="$old_CPPFLAGS"
dnl D-Bus (required for support for KWallet) -------------------
if test -n "$PKG_CONFIG"; then
AC_MSG_CHECKING([for D-Bus .pc file])
if $PKG_CONFIG --exists dbus-1; then
AC_MSG_RESULT([yes])
old_CPPFLAGS="$CPPFLAGS"
old_LIBS="$LIBS"
DBUS_CPPFLAGS="`$PKG_CONFIG --cflags dbus-1`"
AC_MSG_CHECKING([D-Bus version])
DBUS_VERSION="`$PKG_CONFIG --modversion dbus-1`"
AC_MSG_RESULT([$DBUS_VERSION])
# D-Bus 0.* requires DBUS_API_SUBJECT_TO_CHANGE
if test -n ["`echo "$DBUS_VERSION" | $EGREP '^0\.[[:digit:]]+'`"]; then
DBUS_CPPFLAGS="$DBUS_CPPFLAGS -DDBUS_API_SUBJECT_TO_CHANGE"
fi
DBUS_LIBS="`$PKG_CONFIG --libs dbus-1`"
CPPFLAGS="$CPPFLAGS $DBUS_CPPFLAGS"
LIBS="$LIBS $DBUS_LIBS"
AC_MSG_CHECKING([for D-Bus])
AC_LINK_IFELSE([AC_LANG_SOURCE([[
#include <dbus/dbus.h>
int main()
{dbus_bus_get(DBUS_BUS_SESSION, NULL);}]])], HAVE_DBUS="yes", HAVE_DBUS="no")
if test "$HAVE_DBUS" = "yes"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
CPPFLAGS="$old_CPPFLAGS"
LIBS="$old_LIBS"
else
AC_MSG_RESULT([no])
fi
fi
dnl GPG Agent -------------------
AC_ARG_WITH(gpg_agent,
AS_HELP_STRING([--without-gpg-agent],
[Disable support for GPG-Agent]),
[], [with_gpg_agent=yes])
AC_MSG_CHECKING([whether to support GPG-Agent])
if test "$with_gpg_agent" = "yes"; then
AC_MSG_RESULT([yes])
AC_DEFINE([SVN_HAVE_GPG_AGENT], [1],
[Is GPG Agent support enabled?])
else
AC_MSG_RESULT([no])
fi
AC_SUBST(SVN_HAVE_GPG_AGENT)
dnl GNOME Keyring -------------------
AC_ARG_WITH(gnome_keyring,
AS_HELP_STRING([--with-gnome-keyring],
[Enable use of GNOME Keyring for auth credentials (enabled by default if found)]),
[with_gnome_keyring="$withval"],
[with_gnome_keyring=auto])
found_gnome_keyring=no
AC_MSG_CHECKING([whether to look for GNOME Keyring])
if test "$with_gnome_keyring" != "no"; then
AC_MSG_RESULT([yes])
case "$host" in
*-*-darwin*)
if test "$with_gnome_keyring" = "yes"; then
AC_MSG_ERROR([--with-gnome-keyring is not supported on Mac OS X.])
else
with_gnome_keyring=no
fi
;;
*)
if test "$svn_enable_shared" = "yes"; then
if test "$APR_HAS_DSO" = "yes"; then
if test -n "$PKG_CONFIG"; then
AC_MSG_CHECKING([for GLib and GNOME Keyring .pc files])
if $PKG_CONFIG --exists glib-2.0 gnome-keyring-1; then
AC_MSG_RESULT([yes])
old_CPPFLAGS="$CPPFLAGS"
SVN_GNOME_KEYRING_INCLUDES="`$PKG_CONFIG --cflags glib-2.0 gnome-keyring-1`"
CPPFLAGS="$CPPFLAGS $SVN_GNOME_KEYRING_INCLUDES"
AC_CHECK_HEADER(gnome-keyring.h, found_gnome_keyring=yes, found_gnome_keyring=no)
AC_MSG_CHECKING([for GNOME Keyring])
if test "$found_gnome_keyring" = "yes"; then
AC_MSG_RESULT([yes])
AC_DEFINE([SVN_HAVE_GNOME_KEYRING], [1],
[Is GNOME Keyring support enabled?])
CPPFLAGS="$old_CPPFLAGS"
SVN_GNOME_KEYRING_LIBS="`$PKG_CONFIG --libs glib-2.0 gnome-keyring-1`"
else
AC_MSG_RESULT([no])
if test "$with_gnome_keyring" = "yes"; then
AC_MSG_ERROR([cannot find GNOME Keyring])
fi
fi
else
AC_MSG_RESULT([no])
if test "$with_gnome_keyring" = "yes"; then
AC_MSG_ERROR([cannot find GLib and GNOME Keyring .pc files.])
else
with_gnome_keyring=no
fi
fi
else
if test "$with_gnome_keyring" = "yes"; then
AC_MSG_ERROR([cannot find pkg-config. GNOME Keyring requires this.])
else
with_gnome_keyring=no
fi
fi
else
if test "$with_gnome_keyring" = "yes"; then
AC_MSG_ERROR([APR does not have support for DSOs. GNOME Keyring requires this.])
else
with_gnome_keyring=no
fi
fi
else
if test "$with_gnome_keyring" = "yes"; then
AC_MSG_ERROR([--with-gnome-keyring conflicts with --disable-shared])
else
with_gnome_keyring=no
fi
fi
;;
esac
else
AC_MSG_RESULT([no])
fi
AC_SUBST(SVN_GNOME_KEYRING_INCLUDES)
AC_SUBST(SVN_GNOME_KEYRING_LIBS)
dnl Googlemock -----------------
AC_ARG_ENABLE([gmock],
AS_HELP_STRING([--disable-gmock],
[Do not use the Googlemock testing framework]),
[],
[enable_gmock=yes])
AC_SUBST([GMOCK_SRCDIR], [$abs_srcdir/gmock-fused])
AC_MSG_CHECKING([whether use Googlemock])
if test "$enable_gmock" != "no"; then
if test -d "$GMOCK_SRCDIR"; then
AC_MSG_RESULT([yes])
SVN_USE_GMOCK=true
else
AC_MSG_RESULT([no])
SVN_USE_GMOCK=false
fi
else
AC_MSG_RESULT([no])
SVN_USE_GMOCK_SOURCES=false
fi
AC_SUBST([SVN_USE_GMOCK])
dnl Ev2 experimental features ----------------------
dnl Note: The Ev2 implementations will be built unconditionally, but by
dnl providing this flag, users can choose to use the currently-shimmed Ev2
dnl editor implementations for various operations. This will probably
dnl negatively impact performance, but is useful for testing.
AC_ARG_ENABLE(ev2-impl,
AS_HELP_STRING([--enable-ev2-impl],
[Use Ev2 implementations, where available [EXPERIMENTAL]]),
[enable_ev2_impl=$enableval],[enable_ev2_impl=no])
if test "$enable_ev2_impl" = "yes"; then
AC_DEFINE(ENABLE_EV2_IMPL, 1,
[Define to 1 if Ev2 implementations should be used.])
fi
dnl I18n -------------------
AC_ARG_ENABLE(nls,
AS_HELP_STRING([--disable-nls],[Disable gettext functionality]),
[enable_nls=$enableval],[enable_nls=yes])
USE_NLS="no"
SVN_INTL_LIBS=""
if test "$enable_nls" = "yes"; then
dnl First, check to see if there is a working msgfmt.
AC_PATH_PROG(MSGFMT, msgfmt, none)
AC_PATH_PROG(MSGMERGE, msgmerge, none)
AC_PATH_PROG(XGETTEXT, xgettext, none)
if test "$MSGFMT" != "none"; then
AC_SEARCH_LIBS(bindtextdomain, [intl],
[
# in case libintl needs to be linked explicitly,
# $ac_cv_search_bindtextdomain contains -l linker flags
if echo "$ac_cv_search_bindtextdomain" | grep '^-l' >/dev/null
then
SVN_INTL_LIBS="$ac_cv_search_bindtextdomain"
fi
],
[
enable_nls="no"
])
if test "$enable_nls" = "no"; then
# Destroy the cached result so we can test again
unset ac_cv_search_bindtextdomain
# On some systems, libintl needs libiconv to link properly,
# so try again with -liconv.
AC_SEARCH_LIBS(bindtextdomain, [intl],
[
enable_nls="yes"
if echo "$ac_cv_search_bindtextdomain" | grep '^-l' >/dev/null
then
SVN_INTL_LIBS="$ac_cv_search_bindtextdomain"
fi
# This is here so that -liconv ends up in LIBS
# if it worked with -liconv.
AC_CHECK_LIB(iconv, libiconv_open)
],
[
AC_MSG_WARN([bindtextdomain() not found. Disabling NLS.])
enable_nls="no"
], -liconv)
fi
if test "$enable_nls" = "yes"; then
AC_DEFINE(ENABLE_NLS, 1,
[Define to 1 if translation of program messages to the user's
native language is requested.])
USE_NLS="yes"
fi
fi
fi
AC_SUBST(SVN_INTL_LIBS)
AH_BOTTOM([
/* Indicate to translators that string X should be translated. Do not look
up the translation at run time; just expand to X. This macro is suitable
for use where a constant string is required at compile time. */
#define N_(x) x
/* Indicate to translators that we have decided the string X should not be
translated. Expand to X. */
#define U_(x) x
#ifdef ENABLE_NLS
#include <locale.h>
#include <libintl.h>
/* Indicate to translators that string X should be translated. At run time,
look up and return the translation of X. */
#define _(x) dgettext(PACKAGE_NAME, x)
/* Indicate to translators that strings X1 and X2 are singular and plural
forms of the same message, and should be translated. At run time, return
an appropriate translation depending on the number N. */
#define Q_(x1, x2, n) dngettext(PACKAGE_NAME, x1, x2, n)
#else
#define _(x) (x)
#define Q_(x1, x2, n) (((n) == 1) ? x1 : x2)
#define gettext(x) (x)
#define dgettext(domain, x) (x)
#endif
/* compiler hints */
#if defined(__GNUC__) && (__GNUC__ >= 3)
# define SVN__PREDICT_FALSE(x) (__builtin_expect(x, 0))
# define SVN__PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
#else
# define SVN__PREDICT_FALSE(x) (x)
# define SVN__PREDICT_TRUE(x) (x)
#endif
#if defined(SVN_DEBUG)
# define SVN__FORCE_INLINE
# define SVN__PREVENT_INLINE
#elif defined(__GNUC__)
# define SVN__FORCE_INLINE APR_INLINE __attribute__ ((always_inline))
# define SVN__PREVENT_INLINE __attribute__ ((noinline))
#else
# define SVN__FORCE_INLINE APR_INLINE
# define SVN__PREVENT_INLINE
#endif
/* Macro used to specify that a variable is intentionally left unused.
Supresses compiler warnings about the variable being unused. */
#define SVN_UNUSED(v) ( (void)(v) )
])
dnl Used to simulate makefile conditionals.
GETTEXT_CODESET=\#
NO_GETTEXT_CODESET=\#
if test $USE_NLS = "yes"; then
AC_CHECK_FUNCS(bind_textdomain_codeset,
[ GETTEXT_CODESET="" ],
[ NO_GETTEXT_CODESET="" ])
fi
AC_SUBST(GETTEXT_CODESET)
AC_SUBST(NO_GETTEXT_CODESET)
# Check if we are using GNU gettext.
GNU_GETTEXT=no
MSGFMTFLAGS=''
if test $USE_NLS = "yes"; then
AC_MSG_CHECKING(if we are using GNU gettext)
if $MSGFMT --version 2>&1 | $EGREP GNU > /dev/null; then
GNU_GETTEXT=yes
MSGFMTFLAGS='-c'
fi
AC_MSG_RESULT($GNU_GETTEXT)
fi
AC_SUBST(MSGFMTFLAGS)
dnl libmagic -------------------
libmagic_found=no
AC_ARG_WITH(libmagic,AS_HELP_STRING([--with-libmagic=PREFIX],
[libmagic filetype detection library]),
[
if test "$withval" = "yes" ; then
AC_CHECK_HEADER(magic.h, [
AC_CHECK_LIB(magic, magic_open, [libmagic_found="builtin"])
])
libmagic_prefix="the default locations"
elif test "$withval" != "no"; then
libmagic_prefix=$withval
save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -I$libmagic_prefix/include"
AC_CHECK_HEADERS(magic.h,[
save_ldflags="$LDFLAGS"
LDFLAGS="-L$libmagic_prefix/lib $LDFLAGS"
AC_CHECK_LIB(magic, magic_open, [libmagic_found="yes"])
LDFLAGS="$save_ldflags"
])
CPPFLAGS="$save_cppflags"
fi
if test "$withval" != "no" && test "$libmagic_found" = "no"; then
AC_MSG_ERROR([[--with-libmagic requested, but libmagic not found at $libmagic_prefix]])
fi
],
[
AC_CHECK_HEADER(magic.h, [
AC_CHECK_LIB(magic, magic_open, [libmagic_found="builtin"])
])
])
if test "$libmagic_found" != "no"; then
AC_DEFINE([SVN_HAVE_LIBMAGIC], [1], [Defined if libmagic support is enabled])
SVN_MAGIC_LIBS="-lmagic"
fi
if test "$libmagic_found" = "yes"; then
SVN_MAGIC_INCLUDES="-I$libmagic_prefix/include"
LDFLAGS="$LDFLAGS `SVN_REMOVE_STANDARD_LIB_DIRS(-L$libmagic_prefix/lib)`"
fi
AC_SUBST(SVN_MAGIC_INCLUDES)
AC_SUBST(SVN_MAGIC_LIBS)
dnl KWallet -------------------
SVN_LIB_KWALLET
if test "$svn_lib_kwallet" = "yes"; then
AC_DEFINE([SVN_HAVE_KWALLET], 1,
[Defined if KWallet support is enabled])
fi
dnl plaintext passwords -------------------
AC_ARG_ENABLE(plaintext-password-storage,
AS_HELP_STRING([--disable-plaintext-password-storage],
[Disable on-disk caching of plaintext passwords and passphrases.
(Leaving this functionality enabled will not force Subversion
to store passwords in plaintext, but does permit users to
explicitly allow that behavior via runtime configuration.)]),
[
if test "$enableval" = "no"; then
AC_MSG_NOTICE([Disabling plaintext password/passphrase storage])
AC_DEFINE(SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE, 1,
[Defined if plaintext password/passphrase storage is disabled])
fi
])
dnl Build and install rules -------------------
INSTALL_STATIC_RULES="install-bin install-docs"
INSTALL_RULES="install-fsmod-lib install-ramod-lib install-lib install-include install-static"
INSTALL_RULES="$INSTALL_RULES $INSTALL_APACHE_RULE"
BUILD_RULES="fsmod-lib ramod-lib lib bin test sub-test $BUILD_APACHE_RULE tools"
if test "$svn_lib_berkeley_db" = "yes"; then
BUILD_RULES="$BUILD_RULES bdb-lib bdb-test"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-fsmod-lib/install-fsmod-lib install-bdb-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-bdb-lib"
BDB_TEST_DEPS="\$(BDB_TEST_DEPS)"
BDB_TEST_PROGRAMS="\$(BDB_TEST_PROGRAMS)"
fi
if test "$svn_lib_serf" = "yes"; then
BUILD_RULES="$BUILD_RULES serf-lib"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-ramod-lib/install-ramod-lib install-serf-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-serf-lib"
fi
if test "$svn_lib_kwallet" = "yes"; then
BUILD_RULES="$BUILD_RULES kwallet-lib"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-lib/install-lib install-kwallet-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-kwallet-lib"
fi
if test "$found_gnome_keyring" = "yes"; then
BUILD_RULES="$BUILD_RULES gnome-keyring-lib"
INSTALL_RULES="`echo $INSTALL_RULES | $SED 's/install-lib/install-lib install-gnome-keyring-lib/'`"
INSTALL_STATIC_RULES="$INSTALL_STATIC_RULES install-gnome-keyring-lib"
fi
if test "$USE_NLS" = "yes"; then
BUILD_RULES="$BUILD_RULES locale"
INSTALL_RULES="$INSTALL_RULES install-locale"
fi
AC_SUBST(BUILD_RULES)
AC_SUBST(INSTALL_STATIC_RULES)
AC_SUBST(INSTALL_RULES)
AC_SUBST(BDB_TEST_DEPS)
AC_SUBST(BDB_TEST_PROGRAMS)
dnl Check for header files ----------------
dnl Standard C headers
AC_HEADER_STDC
dnl Check for typedefs, structures, and compiler characteristics ----------
dnl if compiler doesn't understand `const', then define it empty
AC_C_CONST
dnl if non-existent, define size_t to be `unsigned'
AC_TYPE_SIZE_T
dnl Check for library functions ----------
AC_FUNC_MEMCMP
dnl svn_error's default warning handler uses vfprintf()
AC_FUNC_VPRINTF
dnl check for functions needed in special file handling
AC_CHECK_FUNCS(symlink readlink)
dnl check for uname
AC_CHECK_HEADERS(sys/utsname.h, [AC_CHECK_FUNCS(uname)], [])
dnl check for termios
AC_CHECK_HEADER(termios.h,[
AC_CHECK_FUNCS(tcgetattr tcsetattr,[
AC_DEFINE(HAVE_TERMIOS_H,1,[Defined if we have a usable termios library.])
])
])
dnl Process some configuration options ----------
AC_ARG_ENABLE(debug,
AS_HELP_STRING([--enable-debug],
[Turn on debugging]),
[
if test "$enableval" = "yes" ; then
enable_debugging="yes"
else
enable_debugging="no"
fi
],
[
# Neither --enable-debug nor --disable-debug was passed.
enable_debugging="maybe"
])
AC_ARG_ENABLE(optimize,
AS_HELP_STRING([--enable-optimize],
[Turn on optimizations]),
[
if test "$enableval" = "yes" ; then
enable_optimization="yes"
else
enable_optimization="no"
fi
],
[
# Neither --enable-optimize nor --disable-optimize was passed.
enable_optimization="maybe"
])
dnl Use -Wl,--no-undefined during linking of some libraries
AC_ARG_ENABLE(disallowing-of-undefined-references,
[AS_HELP_STRING([--enable-disallowing-of-undefined-references],
[Use -Wl,--no-undefined flag during linking of some libraries to disallow undefined references])])
if test "$enable_disallowing_of_undefined_references" != "yes" && test "`uname`" != "Linux"; then
enable_disallowing_of_undefined_references="no"
fi
if test "$enable_disallowing_of_undefined_references" != "no"; then
AC_MSG_CHECKING([for -Wl,--no-undefined])
old_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -Wl,--no-undefined"
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(){;}]])], [svn_wl_no_undefined="yes"], [svn_wl_no_undefined="no"])
LDFLAGS="$old_LDFLAGS"
if test "$svn_wl_no_undefined" = "yes"; then
AC_MSG_RESULT([yes])
for library_dir in "$abs_srcdir/subversion/libsvn_"*; do
eval "`basename $library_dir`_LDFLAGS=-Wl,--no-undefined"
done
else
AC_MSG_RESULT([no])
if test "$enable_disallowing_of_undefined_references" = "yes"; then
AC_MSG_ERROR([--enable-disallowing-of-undefined-references explicitly requested, but -Wl,--no-undefined not supported])
fi
fi
fi
AC_SUBST([libsvn_auth_gnome_keyring_LDFLAGS])
AC_SUBST([libsvn_auth_kwallet_LDFLAGS])
AC_SUBST([libsvn_client_LDFLAGS])
AC_SUBST([libsvn_delta_LDFLAGS])
AC_SUBST([libsvn_diff_LDFLAGS])
AC_SUBST([libsvn_fs_LDFLAGS])
AC_SUBST([libsvn_fs_base_LDFLAGS])
AC_SUBST([libsvn_fs_fs_LDFLAGS])
AC_SUBST([libsvn_fs_util_LDFLAGS])
AC_SUBST([libsvn_ra_LDFLAGS])
AC_SUBST([libsvn_ra_local_LDFLAGS])
AC_SUBST([libsvn_ra_serf_LDFLAGS])
AC_SUBST([libsvn_ra_svn_LDFLAGS])
AC_SUBST([libsvn_repos_LDFLAGS])
AC_SUBST([libsvn_subr_LDFLAGS])
AC_SUBST([libsvn_wc_LDFLAGS])
AC_ARG_ENABLE(maintainer-mode,
AS_HELP_STRING([--enable-maintainer-mode],
[Turn on debugging and very strict compile-time warnings]),
[
if test "$enableval" = "yes" ; then
if test "$enable_debugging" = "no" ; then
AC_MSG_ERROR([Can't have --disable-debug and --enable-maintainer-mode])
fi
enable_debugging=yes
dnl Enable some extra warnings. Put these before the user's flags
dnl so the user can specify flags that override these.
if test "$GCC" = "yes"; then
AC_MSG_NOTICE([maintainer-mode: adding GCC warning flags])
dnl some additional flags that can be handy for an occasional review,
dnl but throw too many warnings in svn code, of too little importance,
dnl to keep these enabled. Remove the "dnl" to do a run with these
dnl switches enabled.
dnl ./configure CFLAGS="-Wswitch-enum -Wswitch-default"
dnl Add each of the following flags only if the C compiler accepts it.
CFLAGS_KEEP="$CFLAGS"
CFLAGS=""
SVN_CFLAGS_ADD_IFELSE([-Werror=implicit-function-declaration])
SVN_CFLAGS_ADD_IFELSE([-Werror=declaration-after-statement])
SVN_CFLAGS_ADD_IFELSE([-Wextra-tokens])
SVN_CFLAGS_ADD_IFELSE([-Wnewline-eof])
SVN_CFLAGS_ADD_IFELSE([-Wshorten-64-to-32])
SVN_CFLAGS_ADD_IFELSE([-Wold-style-definition])
SVN_CFLAGS_ADD_IFELSE([-Wno-system-headers])
SVN_CFLAGS_ADD_IFELSE([-Wno-format-nonliteral])
SVN_CFLAGS_ADD_IFELSE([-Wmissing-variable-declarations])
CMAINTAINERFLAGS="$CFLAGS"
CFLAGS="$CFLAGS_KEEP"
dnl Add flags that all versions of GCC (should) support
CMAINTAINERFLAGS="-Wall -Wpointer-arith -Wwrite-strings -Wshadow -Wformat=2 -Wunused -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wno-multichar -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wbad-function-cast $CMAINTAINERFLAGS"
fi
if test "$GXX" = "yes"; then
AC_MSG_NOTICE([maintainer-mode: adding G++ warning flags])
dnl Add each of the following flags only if the C++ compiler accepts it.
CXXFLAGS_KEEP="$CXXFLAGS"
CXXFLAGS=""
SVN_CXXFLAGS_ADD_IFELSE([-Wextra-tokens])
SVN_CXXFLAGS_ADD_IFELSE([-Wnewline-eof])
SVN_CXXFLAGS_ADD_IFELSE([-Wshorten-64-to-32])
SVN_CXXFLAGS_ADD_IFELSE([-Wno-system-headers])
CXXMAINTAINERFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS_KEEP"
dnl Add flags that all versions of G++ (should) support
CXXMAINTAINERFLAGS="-Wall -Wpointer-arith -Wwrite-strings -Wshadow -Wunused -Wunreachable-code $CXXMAINTAINERFLAGS"
fi
fi
])
if test "$enable_debugging" = "yes" ; then
dnl At the moment, we don't want optimization, because we're
dnl debugging. Unless optiization was explicitly enabled.
if test "$enable_optimization" != "yes"; then
AC_MSG_NOTICE([Disabling optimizations for debugging])
CFLAGS=["`echo $CFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"]
CXXFLAGS=["`echo $CXXFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"]
fi
dnl Add debugging flags, unless they were set by the user
if test -z ["`echo $CUSERFLAGS' ' | $EGREP -- '-g[0-9]? '`"]; then
AC_MSG_NOTICE([Enabling debugging for C])
CFLAGS=["`echo $CFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"]
SVN_CFLAGS_ADD_IFELSE([-fno-inline])
SVN_CFLAGS_ADD_IFELSE([-fno-omit-frame-pointer])
SVN_CFLAGS_ADD_IFELSE([-g3],[],[
SVN_CFLAGS_ADD_IFELSE([-g2],[],[
SVN_CFLAGS_ADD_IFELSE([-g])])])
fi
if test -z ["`echo $CXXUSERFLAGS' ' | $EGREP -- '-g[0-9]? '`"]; then
AC_MSG_NOTICE([Enabling debugging for C++])
CXXFLAGS=["`echo $CXXFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"]
SVN_CXXFLAGS_ADD_IFELSE([-fno-inline])
SVN_CXXFLAGS_ADD_IFELSE([-fno-omit-frame-pointer])
SVN_CXXFLAGS_ADD_IFELSE([-g3],[],[
SVN_CXXFLAGS_ADD_IFELSE([-g2],[],[
SVN_CXXFLAGS_ADD_IFELSE([-g])])])
fi
dnl SVN_DEBUG enables specific features for developer builds
dnl AP_DEBUG enables specific (Apache) features for developer builds
CFLAGS="$CFLAGS -DSVN_DEBUG -DAP_DEBUG"
CXXFLAGS="$CXXFLAGS -DSVN_DEBUG -DAP_DEBUG"
elif test "$enable_debugging" = "no" ; then
AC_MSG_NOTICE([Disabling debugging])
CFLAGS=["`echo $CFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"]
CXXFLAGS=["`echo $CXXFLAGS' ' | $SED -e 's/-g[0-9] //g' -e 's/-g //g'`"]
dnl Compile with NDEBUG to get rid of assertions
CFLAGS="$CFLAGS -DNDEBUG"
CXXFLAGS="$CXXFLAGS -DNDEBUG"
# elif test "$enable_debugging" = "maybe" ; then
# # do nothing
fi
if test "$enable_optimization" = "yes"; then
dnl Add optimization flags, unless they were set by the user
if test -z ["`echo $CUSERFLAGS' ' | $EGREP -- '-O[^ ]* '`"]; then
CFLAGS=["`echo $CFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"]
if test "$enable_debugging" = "yes"; then
AC_MSG_NOTICE([Enabling optimizations for C (with debugging enabled)])
SVN_CFLAGS_ADD_IFELSE([-O1],[],[
SVN_CFLAGS_ADD_IFELSE([-O])])
else
AC_MSG_NOTICE([Enabling optimizations for C])
SVN_CFLAGS_ADD_IFELSE([-O3],[],[
SVN_CFLAGS_ADD_IFELSE([-O2],[],[
SVN_CFLAGS_ADD_IFELSE([-O1],[],[
SVN_CFLAGS_ADD_IFELSE([-O])])])])
SVN_CFLAGS_ADD_IFELSE([-Wno-clobbered])
SVN_CFLAGS_ADD_IFELSE([-flto])
fi
fi
if test -z ["`echo $CXXUSERFLAGS' ' | $EGREP -- '-O[^ ]* '`"]; then
CXXFLAGS=["`echo $CXXFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"]
if test "$enable_debugging" = "yes"; then
AC_MSG_NOTICE([Enabling optimizations for C++ (with debugging enabled)])
SVN_CXXFLAGS_ADD_IFELSE([-O1],[],[
SVN_CXXFLAGS_ADD_IFELSE([-O])])
else
AC_MSG_NOTICE([Enabling optimizations for C++])
SVN_CXXFLAGS_ADD_IFELSE([-O3],[],[
SVN_CXXFLAGS_ADD_IFELSE([-O2],[],[
SVN_CXXFLAGS_ADD_IFELSE([-O1],[],[
SVN_CXXFLAGS_ADD_IFELSE([-O])])])])
SVN_CXXFLAGS_ADD_IFELSE([-Wno-clobbered])
SVN_CXXFLAGS_ADD_IFELSE([-flto])
fi
fi
elif test "$enable_optimization" = "no"; then
dnl Remove all optimization flags
AC_MSG_NOTICE([Disabling optimizations])
CFLAGS=["`echo $CFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"]
CXXFLAGS=["`echo $CXXFLAGS' ' | $SED -e 's/-O[^ ]* //g'`"]
# elif test "$enable_optimization" = "maybe" ; then
# # do nothing
fi
dnl Dump the current compiler options
AC_MSG_NOTICE([C compiler flags: $CFLAGS])
AC_MSG_NOTICE([ user-defined: $CUSERFLAGS])
AC_MSG_NOTICE([ maintainer-mode: $CMAINTAINERFLAGS])
AC_MSG_NOTICE([C++ compiler flags: $CXXFLAGS])
AC_MSG_NOTICE([ user-defined: $CXXUSERFLAGS])
AC_MSG_NOTICE([ maintainer-mode: $CXXMAINTAINERFLAGS])
AC_ARG_ENABLE(full-version-match,
AS_HELP_STRING([--disable-full-version-match],
[Disable the full version match rules when checking
Subversion library compatibility.]),
[
if test "$enableval" = "no" ; then
AC_MSG_NOTICE([Disabling svn full version matching])
AC_DEFINE(SVN_DISABLE_FULL_VERSION_MATCH, 1,
[Defined if the full version matching rules are disabled])
fi
])
AC_ARG_WITH(editor,
AS_HELP_STRING([--with-editor=PATH],
[Specify a default editor for the subversion client.]),
[
if test "$withval" = "yes" ; then
AC_MSG_ERROR([--with-editor requires an argument.])
else
SVN_CLIENT_EDITOR=$withval
AC_DEFINE_UNQUOTED(SVN_CLIENT_EDITOR, "$SVN_CLIENT_EDITOR",
[The path of a default editor for the client.])
fi
])
SVN_LIB_Z
MOD_ACTIVATION=""
AC_ARG_ENABLE(mod-activation,
AS_HELP_STRING([--enable-mod-activation],
[Enable mod_dav_svn in httpd.conf]),
[
if test "$enableval" = "yes" ; then
MOD_ACTIVATION="-a"
AC_MSG_NOTICE([Enabling apache module activation])
else
AC_MSG_NOTICE([Disabling apache module activation])
fi
])
AC_SUBST(MOD_ACTIVATION)
AC_ARG_ENABLE(gcov,
AC_HELP_STRING([--enable-gcov],
[Turn on gcov coverage testing (GCC only).]),
[
if test "$enableval" = "yes" ; then
dnl Probably other compilers support something similar;
dnl feel free to extend this to include them.
if test "$GCC" = "yes"; then
if test "$svn_enable_shared" = "yes" ; then
AC_MSG_ERROR([Can't have --enable-gcov without --disable-shared (we
recommend also using --enable-all-static).])
fi
if test ! "$enable_all_static" = "yes" ; then
AC_MSG_WARN(We recommend --enable-all-static with --enable-gcov.)
fi
AC_MSG_NOTICE([Enabling gcov coverage testing.])
CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
else
AC_MSG_ERROR([We only support --enable-gcov with GCC right now.])
fi
fi
])
AC_ARG_ENABLE(gprof,
AS_HELP_STRING([--enable-gprof],
[Produce gprof profiling data in 'gmon.out' (GCC only).]),
[
if test "$enableval" = "yes" ; then
dnl Probably other compilers support -pg or something similar;
dnl feel free to extend this to include them.
if test "$GCC" = "yes"; then
if test "$svn_enable_shared" = "yes" ; then
AC_MSG_ERROR([Can't have --enable-gprof without --disable-shared (we
recommend also using --enable-all-static).])
fi
if test ! "$enable_all_static" = "yes" ; then
AC_MSG_WARN(We recommend --enable-all-static with --enable-gprof.)
fi
AC_MSG_NOTICE([Enabling gprof profiling data (to gmon.out).])
CFLAGS="$CFLAGS -pg"
CXXFLAGS="$CXXFLAGS -pg"
LT_LDFLAGS="$LT_LDFLAGS -pg"
else
AC_MSG_ERROR([We only support --enable-gprof with GCC right now.])
fi
fi
])
# Scripting and Bindings languages
# Python: Used for testsuite, and bindings
PYTHON="`$abs_srcdir/build/find_python.sh`"
if test -z "$PYTHON"; then
AC_MSG_WARN([Python 2.7 or later is required to run the testsuite])
AC_MSG_WARN([or to use the Subversion Python bindings])
AC_MSG_WARN([])
AC_MSG_WARN([If you have a suitable Python installed, but not on the])
AC_MSG_WARN([PATH, set the environment variable PYTHON to the full path])
AC_MSG_WARN([to the Python executable, and re-run configure])
fi
AC_PATH_PROGS(PYTHON, "$PYTHON", none)
# The minimum version for the JVM runtime for our Java bytecode.
JAVA_OLDEST_WORKING_VER='1.6'
# SVN_CHECK_JDK sets $JAVA_CLASSPATH
SVN_CHECK_JDK($JAVA_OLDEST_WORKING_VER)
AC_PATH_PROG(PERL, perl, none)
if test -n "$RUBY"; then
AC_PATH_PROG(RUBY, "$RUBY", none)
else
AC_PATH_PROGS(RUBY, ruby ruby1.8 ruby18 ruby1.9 ruby1 ruby1.9.3 ruby193 ruby2.0 ruby2.1, none)
fi
if test "$RUBY" != "none"; then
AC_MSG_CHECKING([rb_hash_foreach])
if "$RUBY" -r mkmf -e 'exit(have_func("rb_hash_foreach") ? 0 : 1)' >/dev/null; then
AC_MSG_RESULT([yes])
if test -n "$RDOC"; then
AC_PATH_PROG(RDOC, "$RDOC", none)
else
AC_PATH_PROGS(RDOC, rdoc rdoc1.8 rdoc18 rdoc1.9 rdoc19 rdoc1.9.3 rdoc193 rdoc2.0 rdoc2.1, none)
fi
AC_CACHE_CHECK([for Ruby major version], [svn_cv_ruby_major],[
svn_cv_ruby_major="`$RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MAJOR))'`"
])
RUBY_MAJOR="$svn_cv_ruby_major"
AC_CACHE_CHECK([for Ruby minor version], [svn_cv_ruby_minor],[
svn_cv_ruby_minor="`$RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MINOR))'`"
])
RUBY_MINOR="$svn_cv_ruby_minor"
AC_CACHE_CHECK([for Ruby teeny version], [svn_cv_ruby_teeny],[
svn_cv_ruby_teeny="`$RUBY -rrbconfig -e 'major, minor, teeny = RUBY_VERSION.split("."); print teeny;'`"
])
RUBY_TEENY="$svn_cv_ruby_teeny"
AC_SUBST(RUBY_MAJOR)
AC_SUBST(RUBY_MINOR)
AC_SUBST(RUBY_TEENY)
if test \( "$RUBY_MAJOR" -eq "1" -a "$RUBY_MINOR" -gt "8" -a "$RUBY_TEENY" -lt "3" \); then
# Disallow Ruby between 1.8.7 and 1.9.3
RUBY="none"
AC_MSG_WARN([The detected Ruby is between 1.9 and 1.9.3])
AC_MSG_WARN([Only 1.8.x and 1.9.3 releases are supported at this time])
fi
else
AC_MSG_RESULT([no])
RUBY="none"
AC_MSG_WARN([The detected Ruby is too old for Subversion to use])
AC_MSG_WARN([A Ruby which has rb_hash_foreach is required to use the])
AC_MSG_WARN([Subversion Ruby bindings])
AC_MSG_WARN([Upgrade to the official 1.8.2 release, or later])
fi
fi
SVN_CHECK_SWIG
SVN_CHECK_CTYPESGEN
dnl decide whether we want to link against the RA/FS libraries
AC_ARG_ENABLE(runtime-module-search,
AS_HELP_STRING([--enable-runtime-module-search],
[Turn on dynamic loading of RA/FS libraries including
third-party FS libraries]),
[
if test "$enableval" = "yes"; then
use_dso=yes
if test "$svn_enable_shared" = "no"; then
AC_MSG_ERROR([--enable-runtime-module-search conflicts with --disable-shared])
fi
AC_DEFINE(SVN_USE_DSO, 1,
[Defined if svn should try to load DSOs])
fi
])
if test "$svn_enable_shared" = "no" || test "$use_dso" != "yes"; then
AC_DEFINE(SVN_LIBSVN_CLIENT_LINKS_RA_LOCAL, 1,
[Defined if libsvn_client should link against libsvn_ra_local])
svn_ra_lib_deps="\$(RA_LOCAL_DEPS)"
svn_ra_lib_install_deps="install-ramod-lib"
svn_ra_lib_link="\$(RA_LOCAL_LINK)"
AC_DEFINE(SVN_LIBSVN_CLIENT_LINKS_RA_SVN, 1,
[Defined if libsvn_client should link against libsvn_ra_svn])
svn_ra_lib_deps="$svn_ra_lib_deps \$(RA_SVN_DEPS)"
svn_ra_lib_link="$svn_ra_lib_link \$(RA_SVN_LINK)"
if test "$svn_lib_serf" = "yes"; then
AC_DEFINE(SVN_LIBSVN_CLIENT_LINKS_RA_SERF, 1,
[Defined if libsvn_client should link against libsvn_ra_serf])
svn_ra_lib_deps="$svn_ra_lib_deps \$(RA_SERF_DEPS)"
svn_ra_lib_install_deps="$svn_ra_lib_install_deps install-serf-lib"
svn_ra_lib_link="$svn_ra_lib_link \$(RA_SERF_LINK)"
fi
SVN_RA_LIB_DEPS=$svn_ra_lib_deps
SVN_RA_LIB_INSTALL_DEPS=$svn_ra_lib_install_deps
SVN_RA_LIB_LINK=$svn_ra_lib_link
AC_DEFINE(SVN_LIBSVN_FS_LINKS_FS_FS, 1,
[Defined if libsvn_fs should link against libsvn_fs_fs])
svn_fs_lib_deps="\$(FS_FS_DEPS)"
svn_fs_lib_install_deps="install-fsmod-lib"
svn_fs_lib_link="\$(FS_FS_LINK)"
AC_DEFINE(SVN_LIBSVN_FS_LINKS_FS_X, 1,
[Defined if libsvn_fs should link against libsvn_fs_x])
svn_fs_lib_deps="$svn_fs_lib_deps \$(FS_X_DEPS)"
svn_fs_lib_link="$svn_fs_lib_link \$(FS_X_LINK)"
dnl FSFS already installs fsmod
dnl svn_fs_lib_install_deps="$svn_fs_lib_install_deps install-fsmod-lib"
if test "$svn_lib_berkeley_db" = "yes"; then
AC_DEFINE(SVN_LIBSVN_FS_LINKS_FS_BASE, 1,
[Defined if libsvn_fs should link against libsvn_fs_base])
svn_fs_lib_deps="$svn_fs_lib_deps \$(FS_BASE_DEPS)"
svn_fs_lib_install_deps="$svn_fs_lib_install_deps install-bdb-lib"
svn_fs_lib_link="$svn_fs_lib_link \$(FS_BASE_LINK)"
fi
SVN_FS_LIB_DEPS=$svn_fs_lib_deps
SVN_FS_LIB_INSTALL_DEPS=$svn_fs_lib_install_deps
SVN_FS_LIB_LINK=$svn_fs_lib_link
fi
AC_SUBST(SVN_RA_LIB_DEPS)
AC_SUBST(SVN_RA_LIB_INSTALL_DEPS)
AC_SUBST(SVN_RA_LIB_LINK)
AC_SUBST(SVN_FS_LIB_DEPS)
AC_SUBST(SVN_FS_LIB_INSTALL_DEPS)
AC_SUBST(SVN_FS_LIB_LINK)
# ==== JavaHL ================================================================
dnl Possibly compile JavaHL
do_javahl_build=no
AC_ARG_ENABLE(javahl,
AS_HELP_STRING([--enable-javahl],
[Enable compilation of Java high-level bindings (requires C++)]),
[ if test "$enableval" = "yes" ; then
do_javahl_build="yes"
fi
])
JAVAHL_OBJDIR=""
INSTALL_EXTRA_JAVAHL_LIB=""
FIX_JAVAHL_LIB=""
JAVAHL_TESTS_TARGET=""
JAVAHL_COMPAT_TESTS_TARGET=""
LT_CXX_LIBADD=""
if test "$do_javahl_build" = "yes"; then
dnl Check for suitable JDK
if test "$JDK_SUITABLE" = "no"; then
AC_MSG_ERROR([Cannot compile JavaHL without a suitable JDK.
Please specify a suitable JDK using the --with-jdk option.])
fi
dnl The temporary directory where libtool compiles libsvnjavahl.
JAVAHL_OBJDIR='$(libsvnjavahl_PATH)/.libs'
os_arch=`uname`
if test "$os_arch" = "Darwin"; then
dnl On Darwin, JNI libs must be installed as .jnilib
INSTALL_EXTRA_JAVAHL_LIB='ln -sf $(libdir)/libsvnjavahl-1.dylib $(libdir)/libsvnjavahl-1.jnilib'
FIX_JAVAHL_LIB="ln -sf libsvnjavahl-1.dylib $JAVAHL_OBJDIR/libsvnjavahl-1.jnilib"
fi
# This segment (and the rest of r10800) is very likely unnecessary
# with libtool 1.5, which automatically adds libstdc++ as a
# dependency to the C++ libraries it builds. So at some future time
# when autogen.sh requires libtool 1.5 or higher, we can get rid of
# it.
AC_MSG_CHECKING([for additional flags to link C++ libraries])
if test "x$ac_compiler_gnu" = "xyes"; then
case "$host" in
*freebsd10*)
AC_MSG_RESULT([none needed])
;;
*)
LT_CXX_LIBADD="-lstdc++"
AC_MSG_RESULT([$LT_CXX_LIBADD])
;;
esac
else
AC_MSG_RESULT([none needed])
fi
fi
AC_SUBST(INSTALL_EXTRA_JAVAHL_LIB)
AC_SUBST(JAVAHL_OBJDIR)
AC_SUBST(FIX_JAVAHL_LIB)
AC_SUBST(LT_CXX_LIBADD)
AC_ARG_WITH(junit,
AS_HELP_STRING([--with-junit=PATH],
[Specify a path to the junit JAR file.]),
[
if test "$withval" != "no"; then
if test -n "$JAVA_CLASSPATH"; then
JAVA_CLASSPATH="$withval:$JAVA_CLASSPATH"
else
JAVA_CLASSPATH="$withval"
fi
JAVAHL_TESTS_TARGET="javahl-tests"
JAVAHL_COMPAT_TESTS_TARGET="javahl-compat-tests"
fi
])
AC_SUBST(JAVA_CLASSPATH)
AC_SUBST(JAVAHL_TESTS_TARGET)
AC_SUBST(JAVAHL_COMPAT_TESTS_TARGET)
# ==== Miscellaneous bits ====================================================
AC_CHECK_HEADERS([stdbool.h inttypes.h])
# Strip '-no-cpp-precomp' from CPPFLAGS for the clang compiler
### I think we get this flag from APR, so the fix probably belongs there
if test "$CC" = "clang"; then
SVN_STRIP_FLAG(CPPFLAGS, [-no-cpp-precomp ])
fi
# Need to strip '-no-cpp-precomp' from CPPFLAGS for SWIG as well.
SWIG_CPPFLAGS="$CPPFLAGS"
SVN_STRIP_FLAG(SWIG_CPPFLAGS, [-no-cpp-precomp ])
+SVN_STRIP_FLAG(SWIG_CPPFLAGS, [-Wdate-time ])
AC_SUBST([SWIG_CPPFLAGS])
dnl Since this is used only on Unix-y systems, define the path separator as '/'
AC_DEFINE_UNQUOTED(SVN_PATH_LOCAL_SEPARATOR, '/',
[Defined to be the path separator used on your local filesystem])
AC_DEFINE_UNQUOTED(SVN_NULL_DEVICE_NAME, "/dev/null",
[Defined to be the null device for the system])
DEFAULT_FS_TYPE="fsfs"
AC_DEFINE_UNQUOTED(DEFAULT_FS_TYPE, "$DEFAULT_FS_TYPE",
[The fs type to use by default])
DEFAULT_HTTP_LIBRARY="serf"
AC_DEFINE_UNQUOTED(DEFAULT_HTTP_LIBRARY, "$DEFAULT_HTTP_LIBRARY",
[The http library to use by default])
# BSD/OS (BSDi) needs to use a different include syntax in Makefile
INCLUDE_OUTPUTS="include \$(top_srcdir)/build-outputs.mk"
case "$host" in
*bsdi*)
# Check whether they've installed GNU make
if ! make --version > /dev/null 2>&1; then
# BSDi make
INCLUDE_OUTPUTS=".include \"\$(top_srcdir)/build-outputs.mk\""
fi
;;
esac
AC_SUBST(INCLUDE_OUTPUTS)
# ==== Detection complete - output and run config.status =====================
AC_CONFIG_HEADERS(subversion/svn_private_config.h.tmp:subversion/svn_private_config.h.in)
AC_CONFIG_COMMANDS([svn_private_config.h.tmp],
[svn_cf=subversion/svn_private_config.h;
$SED -e "s/@SVN_DB_HEADER@/$SVN_DB_HEADER/" $svn_cf.tmp > $svn_cf.tmp.new
cmp -s $svn_cf.tmp.new $svn_cf || mv -f $svn_cf.tmp.new $svn_cf
rm -f $svn_cf.tmp.new $svn_cf.tmp],
[SED="$SED"
SVN_DB_HEADER="$SVN_DB_HEADER"])
AC_CONFIG_FILES([Makefile])
# Create pkg-config .pc files from .pc.in files
for pc_in_file in "${abs_srcdir}"/subversion/libsvn_*/*.pc.in; do
pc_file=${pc_in_file#${abs_srcdir}/}
pc_file=${pc_file%.in}
AC_CONFIG_FILES([${pc_file}])
done
SVN_CONFIG_SCRIPT(tools/backup/hot-backup.py)
SVN_CONFIG_SCRIPT(tools/hook-scripts/commit-access-control.pl)
SVN_CONFIG_SCRIPT(subversion/bindings/swig/perl/native/Makefile.PL)
if test -e packages/solaris/pkginfo.in; then
SVN_CONFIG_SCRIPT(packages/solaris/pkginfo)
fi
AC_SUBST(SVN_CONFIG_SCRIPT_FILES)
# Ensure that SWIG is checked after reconfiguration.
rm -f .swig_checked
dnl Provide ${host} for use in compiled code (for svn --version)
AC_DEFINE_UNQUOTED([SVN_BUILD_HOST], "${host}",
[Defined to the config.guess name of the build system])
dnl Provide ${target} for use in compiled code (for user-agent string)
AC_DEFINE_UNQUOTED([SVN_BUILD_TARGET], "${target}",
[Defined to the config.guess name of the build target])
AC_OUTPUT
# ==== Print final messages to user ==========================================
dnl Configure is long - users tend to miss warnings printed during it.
dnl Hence, print a warnings about what we did and didn't configure at the
dnl end, where people will actually see them.
if test "$svn_have_berkeley_db" = "no6" && test "$enable_bdb6" != "no"; then
AC_MSG_WARN([We have configured without BDB filesystem support
Berkeley DB 6 was found, but not used. Please re-run configure (see
./config.nice) with the '--enable-bdb6' flag to use it,
or explicitly specify '--disable-bdb6' or '--without-berkeley-db'
to silence this warning.
Please note that some versions of Berkeley DB 6+ are under the GNU Affero
General Public License, version 3:
https://oss.oracle.com/pipermail/bdb/2013-June/000056.html
The AGPL-3.0 licence may impose special requirements for making available
source code of server-side software. The text of the licence is:
https://www.gnu.org/licenses/agpl-3.0.html
http://opensource.org/licenses/AGPL-3.0
The Berkeley DB backend to Subversion is deprecated; see
http://subversion.apache.org/docs/release-notes/1.8#bdb-deprecated
The Subversion developers have not tested Subversion with Berkeley DB 6 for
technical problems or bugs.
])
fi
Index: stable/11/contrib/subversion/get-deps.sh
===================================================================
--- stable/11/contrib/subversion/get-deps.sh (revision 309510)
+++ stable/11/contrib/subversion/get-deps.sh (revision 309511)
@@ -1,174 +1,174 @@
#!/bin/sh
#
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#
#
# get-deps.sh -- download the dependencies useful for building Subversion
#
# If changing this file please take care to try to make your changes as
# portable as possible. That means at a minimum only use POSIX supported
# features and functions. However, it may be desirable to use an even
# more narrow set of features than POSIX, e.g. Solaris /bin/sh only has
# a subset of the POSIX shell features. If in doubt, limit yourself to
# features already used in the file. Reviewing the history of changes
# may be useful as well.
APR_VERSION=${APR_VERSION:-"1.4.6"}
APU_VERSION=${APU_VERSION:-"1.5.1"}
SERF_VERSION=${SERF_VERSION:-"1.3.8"}
ZLIB_VERSION=${ZLIB_VERSION:-"1.2.8"}
SQLITE_VERSION=${SQLITE_VERSION:-"3.7.15.1"}
GMOCK_VERSION=${GMOCK_VERSION:-"1.6.0"}
HTTPD_VERSION=${HTTPD_VERSION:-"2.4.10"}
APR_ICONV_VERSION=${APR_ICONV_VERSION:-"1.2.1"}
APR=apr-${APR_VERSION}
APR_UTIL=apr-util-${APU_VERSION}
SERF=serf-${SERF_VERSION}
ZLIB=zlib-${ZLIB_VERSION}
SQLITE_VERSION_LIST=`echo $SQLITE_VERSION | sed -e 's/\./ /g'`
SQLITE=sqlite-amalgamation-`printf %d%02d%02d%02d $SQLITE_VERSION_LIST`
GMOCK=gmock-${GMOCK_VERSION}
GMOCK_URL=https://googlemock.googlecode.com/files/
HTTPD=httpd-${HTTPD_VERSION}
APR_ICONV=apr-iconv-${APR_ICONV_VERSION}
BASEDIR=`pwd`
TEMPDIR=$BASEDIR/temp
HTTP_FETCH=
[ -z "$HTTP_FETCH" ] && type wget >/dev/null 2>&1 && HTTP_FETCH="wget -q -nc"
[ -z "$HTTP_FETCH" ] && type curl >/dev/null 2>&1 && HTTP_FETCH="curl -sOL"
[ -z "$HTTP_FETCH" ] && type fetch >/dev/null 2>&1 && HTTP_FETCH="fetch -q"
# Need this uncommented if any of the specific versions of the ASF tarballs to
# be downloaded are no longer available on the general mirrors.
APACHE_MIRROR=http://archive.apache.org/dist
# helpers
usage() {
echo "Usage: $0"
echo "Usage: $0 [ apr | serf | zlib | sqlite | gmock ] ..."
exit $1
}
# getters
get_apr() {
cd $TEMPDIR
test -d $BASEDIR/apr || $HTTP_FETCH $APACHE_MIRROR/apr/$APR.tar.bz2
test -d $BASEDIR/apr-util || $HTTP_FETCH $APACHE_MIRROR/apr/$APR_UTIL.tar.bz2
cd $BASEDIR
test -d $BASEDIR/apr || bzip2 -dc $TEMPDIR/$APR.tar.bz2 | tar -xf -
test -d $BASEDIR/apr-util || bzip2 -dc $TEMPDIR/$APR_UTIL.tar.bz2 | tar -xf -
test -d $BASEDIR/apr || mv $APR apr
test -d $BASEDIR/apr-util || mv $APR_UTIL apr-util
}
get_serf() {
test -d $BASEDIR/serf && return
cd $TEMPDIR
- $HTTP_FETCH http://serf.googlecode.com/svn/src_releases/$SERF.tar.bz2
+ $HTTP_FETCH https://archive.apache.org/dist/serf/$SERF.tar.bz2
cd $BASEDIR
bzip2 -dc $TEMPDIR/$SERF.tar.bz2 | tar -xf -
mv $SERF serf
}
get_zlib() {
test -d $BASEDIR/zlib && return
cd $TEMPDIR
$HTTP_FETCH http://sourceforge.net/projects/libpng/files/zlib/$ZLIB_VERSION/$ZLIB.tar.gz
cd $BASEDIR
gzip -dc $TEMPDIR/$ZLIB.tar.gz | tar -xf -
mv $ZLIB zlib
}
get_sqlite() {
test -d $BASEDIR/sqlite-amalgamation && return
cd $TEMPDIR
$HTTP_FETCH http://www.sqlite.org/$SQLITE.zip
cd $BASEDIR
unzip -q $TEMPDIR/$SQLITE.zip
mv $SQLITE sqlite-amalgamation
}
get_gmock() {
test -d $BASEDIR/gmock-fused && return
cd $TEMPDIR
$HTTP_FETCH ${GMOCK_URL}/${GMOCK}.zip
cd $BASEDIR
unzip -q $TEMPDIR/$GMOCK.zip
mv $GMOCK/fused-src gmock-fused
rm -fr $GMOCK
}
# main()
get_deps() {
mkdir -p $TEMPDIR
for i in zlib serf sqlite-amalgamation apr apr-util gmock-fused; do
if [ -d $i ]; then
echo "Local directory '$i' already exists; the downloaded copy won't be used" >&2
fi
done
if [ $# -gt 0 ]; then
for target in "$@"; do
if [ "$target" != "deps" ]; then
get_$target || usage
else
usage
fi
done
else
get_apr
get_serf
get_zlib
get_sqlite
echo
echo "If you require mod_dav_svn, the recommended version of httpd is:"
echo " $APACHE_MIRROR/httpd/$HTTPD.tar.bz2"
echo
echo "If you require apr-iconv, its recommended version is:"
echo " $APACHE_MIRROR/apr/$APR_ICONV.tar.bz2"
fi
rm -rf $TEMPDIR
}
get_deps "$@"
Index: stable/11/contrib/subversion/subversion/include/private/svn_sqlite.h
===================================================================
--- stable/11/contrib/subversion/subversion/include/private/svn_sqlite.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/include/private/svn_sqlite.h (revision 309511)
@@ -1,562 +1,565 @@
/* svn_sqlite.h
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#ifndef SVN_SQLITE_H
#define SVN_SQLITE_H
#include <apr_pools.h>
#include "svn_types.h"
#include "svn_checksum.h"
#include "svn_error.h"
#include "private/svn_token.h" /* for svn_token_map_t */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Because the SQLite code can be inlined into libsvn_subre/sqlite.c,
we define accessors to its compile-time and run-time version
numbers here. */
/* Return the value that SQLITE_VERSION had at compile time. */
const char *svn_sqlite__compiled_version(void);
/* Return the value of sqlite3_libversion() at run time. */
const char *svn_sqlite__runtime_version(void);
typedef struct svn_sqlite__db_t svn_sqlite__db_t;
typedef struct svn_sqlite__stmt_t svn_sqlite__stmt_t;
typedef struct svn_sqlite__context_t svn_sqlite__context_t;
typedef struct svn_sqlite__value_t svn_sqlite__value_t;
typedef enum svn_sqlite__mode_e {
svn_sqlite__mode_readonly, /* open the database read-only */
svn_sqlite__mode_readwrite, /* open the database read-write */
svn_sqlite__mode_rwcreate /* open/create the database read-write */
} svn_sqlite__mode_t;
/* The type used for callback functions. */
typedef svn_error_t *(*svn_sqlite__func_t)(svn_sqlite__context_t *sctx,
int argc,
svn_sqlite__value_t *values[],
void *baton);
/* Step the given statement; if it returns SQLITE_DONE, reset the statement.
Otherwise, raise an SVN error. */
svn_error_t *
svn_sqlite__step_done(svn_sqlite__stmt_t *stmt);
/* Step the given statement; raise an SVN error (and reset the
statement) if it doesn't return SQLITE_ROW. */
svn_error_t *
svn_sqlite__step_row(svn_sqlite__stmt_t *stmt);
/* Step the given statement; raise an SVN error (and reset the
statement) if it doesn't return SQLITE_DONE or SQLITE_ROW. Set
*GOT_ROW to true iff it got SQLITE_ROW.
*/
svn_error_t *
svn_sqlite__step(svn_boolean_t *got_row, svn_sqlite__stmt_t *stmt);
/* Perform an insert as given by the prepared and bound STMT, and set
*ROW_ID to the id of the inserted row if ROW_ID is non-NULL.
STMT will be reset prior to returning. */
svn_error_t *
svn_sqlite__insert(apr_int64_t *row_id, svn_sqlite__stmt_t *stmt);
/* Perform an update/delete and then return the number of affected rows.
If AFFECTED_ROWS is not NULL, then set *AFFECTED_ROWS to the
number of rows changed.
STMT will be reset prior to returning. */
svn_error_t *
svn_sqlite__update(int *affected_rows, svn_sqlite__stmt_t *stmt);
/* Return in *VERSION the version of the schema in DB. Use SCRATCH_POOL
for temporary allocations. */
svn_error_t *
svn_sqlite__read_schema_version(int *version,
svn_sqlite__db_t *db,
apr_pool_t *scratch_pool);
/* Open a connection in *DB to the database at PATH. Validate the schema,
creating/upgrading to LATEST_SCHEMA if needed using the instructions
in UPGRADE_SQL. The resulting DB is allocated in RESULT_POOL, and any
temporary allocations are made in SCRATCH_POOL.
STATEMENTS is an array of strings which may eventually be executed, the
last element of which should be NULL. These strings and the array itself
are not duplicated internally, and should have a lifetime at least as long
as RESULT_POOL.
STATEMENTS itself may be NULL, in which case it has no impact.
See svn_sqlite__get_statement() for how these strings are used.
TIMEOUT defines the SQLite busy timeout, values <= 0 cause a Subversion
default to be used.
The statements will be finalized and the SQLite database will be closed
when RESULT_POOL is cleaned up. */
svn_error_t *
svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
svn_sqlite__mode_t mode, const char * const statements[],
int latest_schema, const char * const *upgrade_sql,
apr_int32_t timeout,
apr_pool_t *result_pool, apr_pool_t *scratch_pool);
/* Explicitly close the connection in DB. */
svn_error_t *
svn_sqlite__close(svn_sqlite__db_t *db);
/* Add a custom function to be used with this database connection. The data
in BATON should live at least as long as the connection in DB.
Pass TRUE if the result of the function is constant within a statement with
a specific set of argument values and FALSE if not (or when in doubt). When
TRUE newer Sqlite versions use this knowledge for query optimizations. */
svn_error_t *
svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
const char *func_name,
int argc,
svn_boolean_t deterministic,
svn_sqlite__func_t func,
void *baton);
/* Execute the (multiple) statements in the STATEMENTS[STMT_IDX] string. */
svn_error_t *
svn_sqlite__exec_statements(svn_sqlite__db_t *db, int stmt_idx);
/* Return the statement in *STMT which has been prepared from the
STATEMENTS[STMT_IDX] string, where STATEMENTS is the array that was
passed to svn_sqlite__open(). This statement is allocated in the same
pool as the DB, and will be cleaned up when DB is closed. */
svn_error_t *
svn_sqlite__get_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
int stmt_idx);
/* ---------------------------------------------------------------------
BINDING VALUES
*/
/* Bind values to SQL parameters in STMT, according to FMT. FMT may contain:
Spec Argument type Item type
---- ----------------- ---------
n <none, absent> Column assignment skip
d int Number
L apr_int64_t Number
i apr_int64_t Number (deprecated format spec)
s const char * String
b const void * Blob data
apr_size_t Blob length
r svn_revnum_t Revision number
t const svn_token_map_t * Token mapping table
int Token value
Each character in FMT maps to one SQL parameter, and one or two function
parameters, in the order they appear.
*/
svn_error_t *
svn_sqlite__bindf(svn_sqlite__stmt_t *stmt, const char *fmt, ...);
/* Error-handling wrapper around sqlite3_bind_int. */
svn_error_t *
svn_sqlite__bind_int(svn_sqlite__stmt_t *stmt, int slot, int val);
/* Error-handling wrapper around sqlite3_bind_int64. */
svn_error_t *
svn_sqlite__bind_int64(svn_sqlite__stmt_t *stmt, int slot,
apr_int64_t val);
/* Error-handling wrapper around sqlite3_bind_text. VAL cannot contain
zero bytes; we always pass SQLITE_TRANSIENT. */
svn_error_t *
svn_sqlite__bind_text(svn_sqlite__stmt_t *stmt, int slot,
const char *val);
/* Error-handling wrapper around sqlite3_bind_blob. */
svn_error_t *
svn_sqlite__bind_blob(svn_sqlite__stmt_t *stmt,
int slot,
const void *val,
apr_size_t len);
/* Look up VALUE in MAP, and bind the resulting token word at SLOT. */
svn_error_t *
svn_sqlite__bind_token(svn_sqlite__stmt_t *stmt,
int slot,
const svn_token_map_t *map,
int value);
/* Bind the value to SLOT, unless SVN_IS_VALID_REVNUM(value) is false,
in which case it binds NULL. */
svn_error_t *
svn_sqlite__bind_revnum(svn_sqlite__stmt_t *stmt, int slot,
svn_revnum_t value);
/* Bind a set of properties to the given slot. If PROPS is NULL, then no
binding will occur. PROPS will be stored as a serialized skel. */
svn_error_t *
svn_sqlite__bind_properties(svn_sqlite__stmt_t *stmt,
int slot,
const apr_hash_t *props,
apr_pool_t *scratch_pool);
/* Bind a set of inherited properties to the given slot. If INHERITED_PROPS
is NULL, then no binding will occur. INHERITED_PROPS will be stored as a
serialized skel. */
svn_error_t *
svn_sqlite__bind_iprops(svn_sqlite__stmt_t *stmt,
int slot,
const apr_array_header_t *inherited_props,
apr_pool_t *scratch_pool);
/* Bind a checksum's value to the given slot. If CHECKSUM is NULL, then no
binding will occur. */
svn_error_t *
svn_sqlite__bind_checksum(svn_sqlite__stmt_t *stmt,
int slot,
const svn_checksum_t *checksum,
apr_pool_t *scratch_pool);
/* ---------------------------------------------------------------------
FETCHING VALUES
*/
/* Wrapper around sqlite3_column_blob and sqlite3_column_bytes. The return
value will be NULL if the column is null.
If RESULT_POOL is not NULL, allocate the return value (if any) in it.
If RESULT_POOL is NULL, the return value will be valid until an
invocation of svn_sqlite__column_* performs a data type conversion (as
described in the SQLite documentation) or the statement is stepped or
reset or finalized. */
const void *
svn_sqlite__column_blob(svn_sqlite__stmt_t *stmt, int column,
apr_size_t *len, apr_pool_t *result_pool);
/* Wrapper around sqlite3_column_text. If the column is null, then the
return value will be NULL.
If RESULT_POOL is not NULL, allocate the return value (if any) in it.
If RESULT_POOL is NULL, the return value will be valid until an
invocation of svn_sqlite__column_* performs a data type conversion (as
described in the SQLite documentation) or the statement is stepped or
reset or finalized. */
const char *
svn_sqlite__column_text(svn_sqlite__stmt_t *stmt, int column,
apr_pool_t *result_pool);
/* Wrapper around sqlite3_column_int64. If the column is null, then the
return value will be SVN_INVALID_REVNUM. */
svn_revnum_t
svn_sqlite__column_revnum(svn_sqlite__stmt_t *stmt, int column);
/* Wrapper around sqlite3_column_int64. If the column is null, then the
return value will be FALSE. */
svn_boolean_t
svn_sqlite__column_boolean(svn_sqlite__stmt_t *stmt, int column);
/* Wrapper around sqlite3_column_int. If the column is null, then the
return value will be 0. */
int
svn_sqlite__column_int(svn_sqlite__stmt_t *stmt, int column);
/* Wrapper around sqlite3_column_int64. If the column is null, then the
return value will be 0. */
apr_int64_t
svn_sqlite__column_int64(svn_sqlite__stmt_t *stmt, int column);
/* Fetch the word at COLUMN, look it up in the MAP, and return its value.
MALFUNCTION is thrown if the column is null or contains an unknown word. */
int
svn_sqlite__column_token(svn_sqlite__stmt_t *stmt,
int column,
const svn_token_map_t *map);
/* Fetch the word at COLUMN, look it up in the MAP, and return its value.
Returns NULL_VAL if the column is null. MALFUNCTION is thrown if the
column contains an unknown word. */
int
svn_sqlite__column_token_null(svn_sqlite__stmt_t *stmt,
int column,
const svn_token_map_t *map,
int null_val);
/* Return the column as a hash of const char * => const svn_string_t *.
If the column is null, then set *PROPS to NULL. The
results will be allocated in RESULT_POOL, and any temporary allocations
will be made in SCRATCH_POOL. */
svn_error_t *
svn_sqlite__column_properties(apr_hash_t **props,
svn_sqlite__stmt_t *stmt,
int column,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Return the column as an array of depth-first ordered array of
svn_prop_inherited_item_t * structures. If the column is null, then
set *IPROPS to NULL. The results will be allocated in RESULT_POOL,
and any temporary allocations will be made in SCRATCH_POOL. */
svn_error_t *
svn_sqlite__column_iprops(apr_array_header_t **iprops,
svn_sqlite__stmt_t *stmt,
int column,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Return the column as a checksum. If the column is null, then NULL will
be stored into *CHECKSUM. The result will be allocated in RESULT_POOL. */
svn_error_t *
svn_sqlite__column_checksum(const svn_checksum_t **checksum,
svn_sqlite__stmt_t *stmt,
int column,
apr_pool_t *result_pool);
/* Return TRUE if the result of selecting the column is null,
FALSE otherwise */
svn_boolean_t
svn_sqlite__column_is_null(svn_sqlite__stmt_t *stmt, int column);
/* Return the number of bytes the column uses in a text or blob representation.
0 for NULL columns. */
int
svn_sqlite__column_bytes(svn_sqlite__stmt_t *stmt, int column);
/* When Subversion is compiled in maintainer mode: enables the sqlite error
logging to SVN_DBG_OUTPUT. */
void
svn_sqlite__dbg_enable_errorlog(void);
/* --------------------------------------------------------------------- */
#define SVN_SQLITE__INTEGER 1
#define SVN_SQLITE__FLOAT 2
#define SVN_SQLITE__TEXT 3
#define SVN_SQLITE__BLOB 4
#define SVN_SQLITE__NULL 5
/* */
int
svn_sqlite__value_type(svn_sqlite__value_t *val);
/* */
const char *
svn_sqlite__value_text(svn_sqlite__value_t *val);
/* --------------------------------------------------------------------- */
/* */
void
svn_sqlite__result_null(svn_sqlite__context_t *sctx);
void
svn_sqlite__result_int64(svn_sqlite__context_t *sctx, apr_int64_t val);
void
svn_sqlite__result_error(svn_sqlite__context_t *sctx, const char *msg, int num);
/* --------------------------------------------------------------------- */
/* Error-handling wrapper around sqlite3_finalize. */
svn_error_t *
svn_sqlite__finalize(svn_sqlite__stmt_t *stmt);
/* Reset STMT by calling sqlite3_reset(), and also clear any bindings to it.
Note: svn_sqlite__get_statement() calls this function automatically if
the requested statement has been used and has not yet been reset. */
svn_error_t *
svn_sqlite__reset(svn_sqlite__stmt_t *stmt);
/* Begin a transaction in DB. */
svn_error_t *
svn_sqlite__begin_transaction(svn_sqlite__db_t *db);
/* Like svn_sqlite__begin_transaction(), but takes out a 'RESERVED' lock
immediately, instead of using the default deferred locking scheme. */
svn_error_t *
svn_sqlite__begin_immediate_transaction(svn_sqlite__db_t *db);
/* Begin a savepoint in DB. */
svn_error_t *
svn_sqlite__begin_savepoint(svn_sqlite__db_t *db);
/* Commit the current transaction in DB if ERR is SVN_NO_ERROR, otherwise
* roll back the transaction. Return a composition of ERR and any error
* that may occur during the commit or roll-back. */
svn_error_t *
svn_sqlite__finish_transaction(svn_sqlite__db_t *db,
svn_error_t *err);
/* Release the current savepoint in DB if EXPR is SVN_NO_ERROR, otherwise
* roll back to the savepoint and then release it. Return a composition of
* ERR and any error that may occur during the release or roll-back. */
svn_error_t *
svn_sqlite__finish_savepoint(svn_sqlite__db_t *db,
svn_error_t *err);
/* Evaluate the expression EXPR within a transaction.
*
* Begin a transaction in DB; evaluate the expression EXPR, which would
* typically be a function call that does some work in DB; finally commit
* the transaction if EXPR evaluated to SVN_NO_ERROR, otherwise roll back
* the transaction.
*/
#define SVN_SQLITE__WITH_TXN(expr, db) \
do { \
svn_sqlite__db_t *svn_sqlite__db = (db); \
svn_error_t *svn_sqlite__err; \
\
SVN_ERR(svn_sqlite__begin_transaction(svn_sqlite__db)); \
svn_sqlite__err = (expr); \
SVN_ERR(svn_sqlite__finish_transaction(svn_sqlite__db, svn_sqlite__err)); \
} while (0)
/* Callback function to for use with svn_sqlite__with_transaction(). */
typedef svn_error_t *(*svn_sqlite__transaction_callback_t)(
void *baton, svn_sqlite__db_t *db, apr_pool_t *scratch_pool);
/* Helper function to handle SQLite transactions. All the work done inside
CB_FUNC will be wrapped in an SQLite transaction, which will be committed
if CB_FUNC does not return an error. If any error is returned from CB_FUNC,
the transaction will be rolled back. DB and CB_BATON will be passed to
CB_FUNC. SCRATCH_POOL will be passed to the callback (NULL is valid). */
svn_error_t *
svn_sqlite__with_transaction(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton, apr_pool_t *scratch_pool);
/* Like SVN_SQLITE__WITH_TXN(), but takes out a 'RESERVED' lock
immediately, instead of using the default deferred locking scheme. */
#define SVN_SQLITE__WITH_IMMEDIATE_TXN(expr, db) \
do { \
svn_sqlite__db_t *svn_sqlite__db = (db); \
svn_error_t *svn_sqlite__err; \
\
SVN_ERR(svn_sqlite__begin_immediate_transaction(svn_sqlite__db)); \
svn_sqlite__err = (expr); \
SVN_ERR(svn_sqlite__finish_transaction(svn_sqlite__db, svn_sqlite__err)); \
} while (0)
/* Like svn_sqlite__with_transaction(), but takes out a 'RESERVED' lock
immediately, instead of using the default deferred locking scheme. */
svn_error_t *
svn_sqlite__with_immediate_transaction(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool);
/* Evaluate the expression EXPR within a 'savepoint'. Savepoints can be
* nested.
*
* Begin a savepoint in DB; evaluate the expression EXPR, which would
* typically be a function call that does some work in DB; finally release
* the savepoint if EXPR evaluated to SVN_NO_ERROR, otherwise roll back
* to the savepoint and then release it.
*/
#define SVN_SQLITE__WITH_LOCK(expr, db) \
do { \
svn_sqlite__db_t *svn_sqlite__db = (db); \
svn_error_t *svn_sqlite__err; \
\
SVN_ERR(svn_sqlite__begin_savepoint(svn_sqlite__db)); \
svn_sqlite__err = (expr); \
SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err)); \
} while (0)
/* Evaluate the expression EXPR1..EXPR4 within a 'savepoint'. Savepoints can
* be nested.
*
* Begin a savepoint in DB; evaluate the expression EXPR1, which would
* typically be a function call that does some work in DB; if no error occurred,
* run EXPR2; if no error occurred EXPR3; ... and finally release
* the savepoint if EXPR evaluated to SVN_NO_ERROR, otherwise roll back
* to the savepoint and then release it.
*/
#define SVN_SQLITE__WITH_LOCK4(expr1, expr2, expr3, expr4, db) \
do { \
svn_sqlite__db_t *svn_sqlite__db = (db); \
svn_error_t *svn_sqlite__err; \
\
SVN_ERR(svn_sqlite__begin_savepoint(svn_sqlite__db)); \
svn_sqlite__err = (expr1); \
if (!svn_sqlite__err) \
svn_sqlite__err = (expr2); \
if (!svn_sqlite__err) \
svn_sqlite__err = (expr3); \
if (!svn_sqlite__err) \
svn_sqlite__err = (expr4); \
SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err)); \
} while (0)
/* Helper function to handle several SQLite operations inside a shared lock.
This callback is similar to svn_sqlite__with_transaction(), but can be
nested (even with a transaction).
Using this function as a wrapper around a group of operations can give a
*huge* performance boost as the shared-read lock will be shared over
multiple statements, instead of being reobtained every time, which may
require disk and/or network io, depending on SQLite's locking strategy.
SCRATCH_POOL will be passed to the callback (NULL is valid).
### Since we now require SQLite >= 3.6.18, this function has the effect of
always behaving like a deferred transaction. Can it be combined with
svn_sqlite__with_transaction()?
*/
svn_error_t *
svn_sqlite__with_lock(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool);
/* Hotcopy an SQLite database from SRC_PATH to DST_PATH. */
svn_error_t *
svn_sqlite__hotcopy(const char *src_path,
const char *dst_path,
apr_pool_t *scratch_pool);
+/* Backported version of SVN_ERR_SQLITE_ROLLBACK_FAILED. */
+#define SVN_SQLITE__ERR_ROLLBACK_FAILED (SVN_ERR_MISC_CATEGORY_START + 44)
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_SQLITE_H */
Index: stable/11/contrib/subversion/subversion/include/svn_version.h
===================================================================
--- stable/11/contrib/subversion/subversion/include/svn_version.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/include/svn_version.h (revision 309511)
@@ -1,452 +1,452 @@
/**
* @copyright
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
* @endcopyright
*
* @file svn_version.h
* @brief Version information.
*/
#ifndef SVN_VERSION_H
#define SVN_VERSION_H
/* Hack to prevent the resource compiler from including
apr and other headers. */
#ifndef SVN_WIN32_RESOURCE_COMPILATION
#include <apr_general.h>
#include <apr_tables.h>
#include "svn_types.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Symbols that define the version number. */
/* Version numbers: <major>.<minor>.<micro>
*
* The version numbers in this file follow the rules established by:
*
* http://apr.apache.org/versioning.html
*/
/** Major version number.
*
* Modify when incompatible changes are made to published interfaces.
*/
#define SVN_VER_MAJOR 1
/** Minor version number.
*
* Modify when new functionality is added or new interfaces are
* defined, but all changes are backward compatible.
*/
#define SVN_VER_MINOR 9
/**
* Patch number.
*
* Modify for every released patch.
*
* @since New in 1.1.
*/
-#define SVN_VER_PATCH 4
+#define SVN_VER_PATCH 5
/** @deprecated Provided for backward compatibility with the 1.0 API. */
#define SVN_VER_MICRO SVN_VER_PATCH
/** @deprecated Provided for backward compatibility with the 1.0 API. */
#define SVN_VER_LIBRARY SVN_VER_MAJOR
/** Version tag: a string describing the version.
*
* This tag remains " (under development)" in the repository so that we can
* always see from "svn --version" that the software has been built
* from the repository rather than a "blessed" distribution.
*
* When rolling a tarball, we automatically replace this text with " (r1234)"
* (where 1234 is the last revision on the branch prior to the release)
* for final releases; in prereleases, it becomes " (Alpha 1)",
* " (Beta 1)", etc., as appropriate.
*
* Always change this at the same time as SVN_VER_NUMTAG.
*/
-#define SVN_VER_TAG " (r1740329)"
+#define SVN_VER_TAG " (r1770682)"
/** Number tag: a string describing the version.
*
* This tag is used to generate a version number string to identify
* the client and server in HTTP requests, for example. It must not
* contain any spaces. This value remains "-dev" in the repository.
*
* When rolling a tarball, we automatically replace this text with ""
* for final releases; in prereleases, it becomes "-alpha1, "-beta1",
* etc., as appropriate.
*
* Always change this at the same time as SVN_VER_TAG.
*/
#define SVN_VER_NUMTAG ""
/** Revision number: The repository revision number of this release.
*
* This constant is used to generate the build number part of the Windows
* file version. Its value remains 0 in the repository except in release
* tags where it is the revision from which the tag was created.
*/
-#define SVN_VER_REVISION 1740329
+#define SVN_VER_REVISION 1770682
/* Version strings composed from the above definitions. */
/** Version number */
#define SVN_VER_NUM APR_STRINGIFY(SVN_VER_MAJOR) \
"." APR_STRINGIFY(SVN_VER_MINOR) \
"." APR_STRINGIFY(SVN_VER_PATCH)
/** Version number with tag (contains no whitespace) */
#define SVN_VER_NUMBER SVN_VER_NUM SVN_VER_NUMTAG
/** Complete version string */
#define SVN_VERSION SVN_VER_NUMBER SVN_VER_TAG
/* Version queries and compatibility checks */
/**
* Version information. Each library contains a function called
* svn_<i>libname</i>_version() that returns a pointer to a statically
* allocated object of this type.
*
* @since New in 1.1.
*/
struct svn_version_t
{
int major; /**< Major version number */
int minor; /**< Minor version number */
int patch; /**< Patch number */
/**
* The version tag (#SVN_VER_NUMTAG). Must always point to a
* statically allocated string.
*/
const char *tag;
};
/**
* Define a static svn_version_t object.
*
* @since New in 1.1.
*/
#define SVN_VERSION_DEFINE(name) \
static const svn_version_t name = \
{ \
SVN_VER_MAJOR, \
SVN_VER_MINOR, \
SVN_VER_PATCH, \
SVN_VER_NUMTAG \
} \
/**
* Generate the implementation of a version query function.
*
* @since New in 1.1.
* @since Since 1.9, embeds a string into the compiled object
* file that can be queried with the 'what' utility.
*/
#define SVN_VERSION_BODY \
static struct versioninfo_t \
{ \
const char *const str; \
const svn_version_t num; \
} const versioninfo = \
{ \
"@(#)" SVN_VERSION, \
{ \
SVN_VER_MAJOR, \
SVN_VER_MINOR, \
SVN_VER_PATCH, \
SVN_VER_NUMTAG \
} \
}; \
return &versioninfo.num
/**
* Check library version compatibility. Return #TRUE if the client's
* version, given in @a my_version, is compatible with the library
* version, provided in @a lib_version.
*
* This function checks for version compatibility as per our
* guarantees, but requires an exact match when linking to an
* unreleased library. A development client is always compatible with
* a previous released library.
*
* @note Implements the #svn_ver_check_list2.@a comparator interface.
*
* @since New in 1.1.
*/
svn_boolean_t
svn_ver_compatible(const svn_version_t *my_version,
const svn_version_t *lib_version);
/**
* Check if @a my_version and @a lib_version encode the same version number.
*
* @note Implements the #svn_ver_check_list2.@a comparator interface.
*
* @since New in 1.2.
*/
svn_boolean_t
svn_ver_equal(const svn_version_t *my_version,
const svn_version_t *lib_version);
/**
* An entry in the compatibility checklist.
* @see svn_ver_check_list()
*
* @since New in 1.1.
*/
typedef struct svn_version_checklist_t
{
const char *label; /**< Entry label */
/** Version query function for this entry */
const svn_version_t *(*version_query)(void);
} svn_version_checklist_t;
/**
* Perform a series of version compatibility checks. Checks if @a
* my_version is compatible with each entry in @a checklist. @a
* checklist must end with an entry whose label is @c NULL.
*
* @a my_version is considered to be compatible with a version in @a checklist
* if @a comparator returns #TRUE when called with @a my_version as the first
* parammeter and the @a checklist version as the second parameter.
*
* @see svn_ver_compatible(), svn_ver_equal()
*
* @note Subversion's own code invariably uses svn_ver_equal() as @a comparator,
* since the cmdline tools sometimes use non-public APIs (such as utility
* functions that haven't been promoted to svn_cmdline.h). Third-party code
* SHOULD use svn_ver_compatible() as @a comparator.
*
* @since New in 1.9.
*/
svn_error_t *
svn_ver_check_list2(const svn_version_t *my_version,
const svn_version_checklist_t *checklist,
svn_boolean_t (*comparator)(const svn_version_t *,
const svn_version_t *));
/** Similar to svn_ver_check_list2(), with @a comparator set to
* #svn_ver_compatible.
*
* @deprecated Provided for backward compatibility with 1.8 API.
*/
SVN_DEPRECATED
svn_error_t *
svn_ver_check_list(const svn_version_t *my_version,
const svn_version_checklist_t *checklist);
/**
* Type of function returning library version.
*
* @since New in 1.6.
*/
typedef const svn_version_t *(*svn_version_func_t)(void);
/* libsvn_subr doesn't have an svn_subr header, so put the prototype here. */
/**
* Get libsvn_subr version information.
*
* @since New in 1.1.
*/
const svn_version_t *
svn_subr_version(void);
/**
* Extended version information, including info about the running system.
*
* @since New in 1.8.
*/
typedef struct svn_version_extended_t svn_version_extended_t;
/**
* Return version information for the running program. If @a verbose
* is #TRUE, collect extra information that may be expensive to
* retrieve (for example, the OS release name, list of shared
* libraries, etc.). Use @a pool for all allocations.
*
* @note This function may allocate significant auxiliary resources
* (memory and file descriptors) in @a pool. It is recommended to
* copy the returned data to suitable longer-lived memory and clear
* @a pool after calling this function.
*
* @since New in 1.8.
*/
const svn_version_extended_t *
svn_version_extended(svn_boolean_t verbose,
apr_pool_t *pool);
/**
* Accessor for svn_version_extended_t.
*
* @return The date when the libsvn_subr library was compiled, in the
* format defined by the C standard macro @c __DATE__.
*
* @since New in 1.8.
*/
const char *
svn_version_ext_build_date(const svn_version_extended_t *ext_info);
/**
* Accessor for svn_version_extended_t.
*
* @return The time when the libsvn_subr library was compiled, in the
* format defined by the C standard macro @c __TIME__.
*
* @since New in 1.8.
*/
const char *
svn_version_ext_build_time(const svn_version_extended_t *ext_info);
/**
* Accessor for svn_version_extended_t.
*
* @return The canonical host triplet (arch-vendor-osname) of the
* system where libsvn_subr was compiled.
*
* @note On Unix-like systems (includng Mac OS X), this string is the
* same as the output of the config.guess script.
*
* @since New in 1.8.
*/
const char *
svn_version_ext_build_host(const svn_version_extended_t *ext_info);
/**
* Accessor for svn_version_extended_t.
*
* @return The localized copyright notice.
*
* @since New in 1.8.
*/
const char *
svn_version_ext_copyright(const svn_version_extended_t *ext_info);
/**
* Accessor for svn_version_extended_t.
*
* @return The canonical host triplet (arch-vendor-osname) of the
* system where the current process is running.
*
* @note This string may not be the same as the output of config.guess
* on the same system.
*
* @since New in 1.8.
*/
const char *
svn_version_ext_runtime_host(const svn_version_extended_t *ext_info);
/**
* Accessor for svn_version_extended_t.
*
* @return The "commercial" release name of the running operating
* system, if available. Not to be confused with, e.g., the output of
* "uname -v" or "uname -r". The returned value may be @c NULL.
*
* @since New in 1.8.
*/
const char *
svn_version_ext_runtime_osname(const svn_version_extended_t *ext_info);
/**
* Dependent library information.
* Describes the name and versions of known dependencies
* used by libsvn_subr.
*
* @since New in 1.8.
*/
typedef struct svn_version_ext_linked_lib_t
{
const char *name; /**< Library name */
const char *compiled_version; /**< Compile-time version string */
const char *runtime_version; /**< Run-time version string (optional) */
} svn_version_ext_linked_lib_t;
/**
* Accessor for svn_version_extended_t.
*
* @return Array of svn_version_ext_linked_lib_t describing dependent
* libraries. The returned value may be @c NULL.
*
* @since New in 1.8.
*/
const apr_array_header_t *
svn_version_ext_linked_libs(const svn_version_extended_t *ext_info);
/**
* Loaded shared library information.
* Describes the name and, where available, version of the shared libraries
* loaded by the running program.
*
* @since New in 1.8.
*/
typedef struct svn_version_ext_loaded_lib_t
{
const char *name; /**< Library name */
const char *version; /**< Library version (optional) */
} svn_version_ext_loaded_lib_t;
/**
* Accessor for svn_version_extended_t.
*
* @return Array of svn_version_ext_loaded_lib_t describing loaded
* shared libraries. The returned value may be @c NULL.
*
* @note On Mac OS X, the loaded frameworks, private frameworks and
* system libraries will not be listed.
*
* @since New in 1.8.
*/
const apr_array_header_t *
svn_version_ext_loaded_libs(const svn_version_extended_t *ext_info);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_VERSION_H */
Index: stable/11/contrib/subversion/subversion/libsvn_client/merge.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_client/merge.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_client/merge.c (revision 309511)
@@ -1,12865 +1,12916 @@
/*
* merge.c: merging
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* ==================================================================== */
/*** Includes ***/
#include <assert.h>
#include <apr_strings.h>
#include <apr_tables.h>
#include <apr_hash.h>
#include "svn_types.h"
#include "svn_hash.h"
#include "svn_wc.h"
#include "svn_delta.h"
#include "svn_diff.h"
#include "svn_mergeinfo.h"
#include "svn_client.h"
#include "svn_string.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_io.h"
#include "svn_utf.h"
#include "svn_pools.h"
#include "svn_config.h"
#include "svn_props.h"
#include "svn_time.h"
#include "svn_sorts.h"
#include "svn_subst.h"
#include "svn_ra.h"
#include "client.h"
#include "mergeinfo.h"
#include "private/svn_fspath.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_client_private.h"
#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_wc_private.h"
#include "svn_private_config.h"
/*-----------------------------------------------------------------------*/
/* MERGEINFO MERGE SOURCE NORMALIZATION
*
* Nearly any helper function herein that accepts two URL/revision
* pairs (or equivalent struct merge_source_t) expects one of two things
* to be true:
*
* 1. that mergeinfo is not being recorded at all for this
* operation, or
*
* 2. that the pairs represent two locations along a single line
* of version history such that there are no copies in the
* history of the object between the locations when treating
* the oldest of the two locations as non-inclusive. In other
* words, if there is a copy at all between them, there is only
* one copy and its source was the oldest of the two locations.
*
* We use svn_ra_get_location_segments() to split a given range of
* revisions across an object's history into several which obey these
* rules. For example, an extract from the log of Subversion's own
* /subversion/tags/1.4.5 directory shows the following copies between
* r859500 and r866500 (omitting the '/subversion' prefix for clarity):
*
* r859598:
* A /branches/1.4.x (from /trunk:859597)
*
* r865417:
* A /tags/1.4.4 (from /branches/1.4.x:865262)
* # Notice that this copy leaves a gap between 865262 and 865417.
*
* r866420:
* A /branches/1.4.5 (from /tags/1.4.4:866419)
*
* r866425:
* D /branches/1.4.5
* A /tags/1.4.5 (from /branches/1.4.5:866424)
*
* In graphical form:
*
* 859500 859597 865262 866419 866424 866500
* . . . . . .
* trunk ------------------------------------------------
* \ . . .
* branches/1.4.x A-------------------------------------
* . \______ . .
* . \ . .
* tags/1.4.4 . A-----------------------
* . . \ .
* branches/1.4.5 . . A------D
* . . . \.
* tags/1.4.5 . . . A---------
* . . . .
* 859598 865417 866420 866425
*
* A merge of the difference between r859500 and r866500 of this directory
* gets split into sequential merges of the following location pairs.
*
* 859500 859597 865262 865416 866419 866424 866500
* . . . . . . .
* trunk (======] . . . . .
* . . . . .
* trunk ( . . . . .
* branches/1.4.x ======] . . . .
* . . . .
* branches/1.4.x ( . . . .
* tags/1.4.4 =============] . .
* implicit_src_gap (======] . . .
* . . .
* tags/1.4.4 ( . .
* branches/1.4.5 ======] .
* . .
* branches/1.4.5 ( .
* tags/1.4.5 ======]
*
* which are represented in merge_source_t as:
*
* [/trunk:859500, /trunk:859597]
* (recorded in svn:mergeinfo as /trunk:859501-859597)
*
* [/trunk:859597, /branches/1.4.x:865262]
* (recorded in svn:mergeinfo as /branches/1.4.x:859598-865262)
*
* [/branches/1.4.x:865262, /tags/1.4.4@866419]
* (recorded in svn:mergeinfo as /tags/1.4.4:865263-866419)
* (and there is a gap, the revision range [865262, 865416])
*
* [/tags/1.4.4@866419, /branches/1.4.5@866424]
* (recorded in svn:mergeinfo as /branches/1.4.5:866420-866424)
*
* [/branches/1.4.5@866424, /tags/1.4.5@866500]
* (recorded in svn:mergeinfo as /tags/1.4.5:866425-866500)
*
* Our helper functions would then operate on one of these location
* pairs at a time.
*/
/* WHICH SVN_CLIENT_MERGE* API DO I WANT?
*
* libsvn_client has three public merge APIs; they are all wrappers
* around the do_merge engine. Which one to use depends on the number
* of URLs passed as arguments and whether or not specific merge
* ranges (-c/-r) are specified.
*
* 1 URL 2 URLs
* +----+--------------------------------+---------------------+
* | -c | mergeinfo-driven | |
* | or | cherrypicking | |
* | -r | (svn_client_merge_peg) | |
* |----+--------------------------------+ |
* | | mergeinfo-driven | unsupported |
* | | 'cherry harvest', i.e. merge | |
* | | all revisions from URL that | |
* | no | have not already been merged | |
* | -c | (svn_client_merge_peg) | |
* | or +--------------------------------+---------------------+
* | -r | mergeinfo-driven | mergeinfo-writing |
* | | whole-branch | diff-and-apply |
* | | heuristic merge | (svn_client_merge) |
* | | (svn_client_merge_reintegrate) | |
* +----+--------------------------------+---------------------+
*
*
*/
/* THE CHILDREN_WITH_MERGEINFO ARRAY
*
* Many of the helper functions in this file pass around an
* apr_array_header_t *CHILDREN_WITH_MERGEINFO. This is a depth first
* sorted array filled with svn_client__merge_path_t * describing the
* merge target and any of its subtrees which have explicit mergeinfo
* or otherwise need special attention during a merge.
*
* During mergeinfo unaware merges, CHILDREN_WITH_MERGEINFO contains
* contains only one element (added by do_mergeinfo_unaware_dir_merge)
* describing a contiguous range to be merged to the WC merge target.
*
* During mergeinfo aware merges CHILDREN_WITH_MERGEINFO is created
* by get_mergeinfo_paths() and outside of that function and its helpers
* should always meet the criteria dictated in get_mergeinfo_paths()'s doc
* string. The elements of CHILDREN_WITH_MERGEINFO should never be NULL.
*
* For clarification on mergeinfo aware vs. mergeinfo unaware merges, see
* the doc string for HONOR_MERGEINFO().
*/
/*-----------------------------------------------------------------------*/
/*** Repos-Diff Editor Callbacks ***/
/* */
typedef struct merge_source_t
{
/* "left" side URL and revision (inclusive iff youngest) */
const svn_client__pathrev_t *loc1;
/* "right" side URL and revision (inclusive iff youngest) */
const svn_client__pathrev_t *loc2;
/* True iff LOC1 is an ancestor of LOC2 or vice-versa (history-wise). */
svn_boolean_t ancestral;
} merge_source_t;
/* Description of the merge target root node (a WC working node) */
typedef struct merge_target_t
{
/* Absolute path to the WC node */
const char *abspath;
/* The repository location of the base node of the target WC. If the node
* is locally added, then URL & REV are NULL & SVN_INVALID_REVNUM.
* REPOS_ROOT_URL and REPOS_UUID are always valid. */
svn_client__pathrev_t loc;
} merge_target_t;
typedef struct merge_cmd_baton_t {
svn_boolean_t force_delete; /* Delete a file/dir even if modified */
svn_boolean_t dry_run;
svn_boolean_t record_only; /* Whether to merge only mergeinfo
differences. */
svn_boolean_t same_repos; /* Whether the merge source repository
is the same repository as the
target. Defaults to FALSE if DRY_RUN
is TRUE.*/
svn_boolean_t mergeinfo_capable; /* Whether the merge source server
is capable of Merge Tracking. */
svn_boolean_t ignore_mergeinfo; /* Don't honor mergeinfo; see
doc string of do_merge(). FALSE if
MERGE_SOURCE->ancestral is FALSE. */
svn_boolean_t diff_ignore_ancestry; /* Diff unrelated nodes as if related; see
doc string of do_merge(). FALSE if
MERGE_SOURCE->ancestral is FALSE. */
svn_boolean_t reintegrate_merge; /* Whether this is a --reintegrate
merge or not. */
const merge_target_t *target; /* Description of merge target node */
/* The left and right URLs and revs. The value of this field changes to
reflect the merge_source_t *currently* being merged by do_merge(). */
merge_source_t merge_source;
/* Rangelist containing single range which describes the gap, if any,
in the natural history of the merge source currently being processed.
See http://subversion.tigris.org/issues/show_bug.cgi?id=3432.
Updated during each call to do_directory_merge(). May be NULL if there
is no gap. */
svn_rangelist_t *implicit_src_gap;
svn_client_ctx_t *ctx; /* Client context for callbacks, etc. */
/* The list of any paths which remained in conflict after a
resolution attempt was made. We track this in-memory, rather
than just using WC entry state, since the latter doesn't help us
when in dry_run mode.
### And because we only want to resolve conflicts that were
generated by this merge, not pre-existing ones? */
apr_hash_t *conflicted_paths;
/* A list of absolute paths which had no explicit mergeinfo prior to the
merge but got explicit mergeinfo added by the merge. This is populated
by merge_change_props() and is allocated in POOL so it is subject to the
lifetime limitations of POOL. Is NULL if no paths are found which
meet the criteria or DRY_RUN is true. */
apr_hash_t *paths_with_new_mergeinfo;
/* A list of absolute paths whose mergeinfo doesn't need updating after
the merge. This can be caused by the removal of mergeinfo by the merge
or by deleting the node itself. This is populated by merge_change_props()
and the delete callbacks and is allocated in POOL so it is subject to the
lifetime limitations of POOL. Is NULL if no paths are found which
meet the criteria or DRY_RUN is true. */
apr_hash_t *paths_with_deleted_mergeinfo;
/* The list of absolute skipped paths, which should be examined and
cleared after each invocation of the callback. The paths
are absolute. Is NULL if MERGE_B->MERGE_SOURCE->ancestral and
MERGE_B->REINTEGRATE_MERGE are both false. */
apr_hash_t *skipped_abspaths;
/* The list of absolute merged paths. Unused if MERGE_B->MERGE_SOURCE->ancestral
and MERGE_B->REINTEGRATE_MERGE are both false. */
apr_hash_t *merged_abspaths;
/* A hash of (const char *) absolute WC paths mapped to the same which
represent the roots of subtrees added by the merge. */
apr_hash_t *added_abspaths;
/* A list of tree conflict victim absolute paths which may be NULL. */
apr_hash_t *tree_conflicted_abspaths;
/* The diff3_cmd in ctx->config, if any, else null. We could just
extract this as needed, but since more than one caller uses it,
we just set it up when this baton is created. */
const char *diff3_cmd;
const apr_array_header_t *merge_options;
/* Array of file extension patterns to preserve as extensions in
generated conflict files. */
const apr_array_header_t *ext_patterns;
/* RA sessions used throughout a merge operation. Opened/re-parented
as needed.
NOTE: During the actual merge editor drive, RA_SESSION1 is used
for the primary editing and RA_SESSION2 for fetching additional
information -- as necessary -- from the repository. So during
this phase of the merge, you *must not* reparent RA_SESSION1; use
(temporarily reparenting if you must) RA_SESSION2 instead. */
svn_ra_session_t *ra_session1;
svn_ra_session_t *ra_session2;
/* During the merge, *USE_SLEEP is set to TRUE if a sleep will be required
afterwards to ensure timestamp integrity, or unchanged if not. */
svn_boolean_t *use_sleep;
/* Pool which has a lifetime limited to one iteration over a given
merge source, i.e. it is cleared on every call to do_directory_merge()
or do_file_merge() in do_merge(). */
apr_pool_t *pool;
/* State for notify_merge_begin() */
struct notify_begin_state_t
{
/* Cache of which abspath was last notified. */
const char *last_abspath;
/* Reference to the one-and-only CHILDREN_WITH_MERGEINFO (see global
comment) or a similar list for single-file-merges */
const apr_array_header_t *nodes_with_mergeinfo;
} notify_begin;
} merge_cmd_baton_t;
/* Return TRUE iff we should be taking account of mergeinfo in deciding what
changes to merge, for the merge described by MERGE_B. Specifically, that
is if the merge source server is capable of merge tracking, the left-side
merge source is an ancestor of the right-side (or vice-versa), the merge
source is in the same repository as the merge target, and we are not
ignoring mergeinfo. */
#define HONOR_MERGEINFO(merge_b) ((merge_b)->mergeinfo_capable \
&& (merge_b)->merge_source.ancestral \
&& (merge_b)->same_repos \
&& (! (merge_b)->ignore_mergeinfo))
/* Return TRUE iff we should be recording mergeinfo for the merge described
by MERGE_B. Specifically, that is if we are honoring mergeinfo and the
merge is not a dry run. */
#define RECORD_MERGEINFO(merge_b) (HONOR_MERGEINFO(merge_b) \
&& !(merge_b)->dry_run)
/*-----------------------------------------------------------------------*/
/*** Utilities ***/
/* Return TRUE iff the session URL of RA_SESSION is equal to URL. Useful in
* asserting preconditions. */
static svn_boolean_t
session_url_is(svn_ra_session_t *ra_session,
const char *url,
apr_pool_t *scratch_pool)
{
const char *session_url;
svn_error_t *err
= svn_ra_get_session_url(ra_session, &session_url, scratch_pool);
SVN_ERR_ASSERT_NO_RETURN(! err);
return strcmp(url, session_url) == 0;
}
/* Return a new merge_source_t structure, allocated in RESULT_POOL,
* initialized with deep copies of LOC1 and LOC2 and ANCESTRAL. */
static merge_source_t *
merge_source_create(const svn_client__pathrev_t *loc1,
const svn_client__pathrev_t *loc2,
svn_boolean_t ancestral,
apr_pool_t *result_pool)
{
merge_source_t *s
= apr_palloc(result_pool, sizeof(*s));
s->loc1 = svn_client__pathrev_dup(loc1, result_pool);
s->loc2 = svn_client__pathrev_dup(loc2, result_pool);
s->ancestral = ancestral;
return s;
}
/* Return a deep copy of SOURCE, allocated in RESULT_POOL. */
static merge_source_t *
merge_source_dup(const merge_source_t *source,
apr_pool_t *result_pool)
{
merge_source_t *s = apr_palloc(result_pool, sizeof(*s));
s->loc1 = svn_client__pathrev_dup(source->loc1, result_pool);
s->loc2 = svn_client__pathrev_dup(source->loc2, result_pool);
s->ancestral = source->ancestral;
return s;
}
/* Return SVN_ERR_UNSUPPORTED_FEATURE if URL is not inside the repository
of LOCAL_ABSPATH. Use SCRATCH_POOL for temporary allocations. */
static svn_error_t *
check_repos_match(const merge_target_t *target,
const char *local_abspath,
const char *url,
apr_pool_t *scratch_pool)
{
if (!svn_uri__is_ancestor(target->loc.repos_root_url, url))
return svn_error_createf(
SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("URL '%s' of '%s' is not in repository '%s'"),
url, svn_dirent_local_style(local_abspath, scratch_pool),
target->loc.repos_root_url);
return SVN_NO_ERROR;
}
/* Return TRUE iff the repository of LOCATION1 is the same as
* that of LOCATION2. If STRICT_URLS is true, the URLs must
* match (and the UUIDs, just to be sure), otherwise just the UUIDs must
* match and the URLs can differ (a common case is http versus https). */
static svn_boolean_t
is_same_repos(const svn_client__pathrev_t *location1,
const svn_client__pathrev_t *location2,
svn_boolean_t strict_urls)
{
if (strict_urls)
return (strcmp(location1->repos_root_url, location2->repos_root_url) == 0
&& strcmp(location1->repos_uuid, location2->repos_uuid) == 0);
else
return (strcmp(location1->repos_uuid, location2->repos_uuid) == 0);
}
/* If the repository identified of LOCATION1 is not the same as that
* of LOCATION2, throw a SVN_ERR_CLIENT_UNRELATED_RESOURCES
* error mentioning PATH1 and PATH2. For STRICT_URLS, see is_same_repos().
*/
static svn_error_t *
check_same_repos(const svn_client__pathrev_t *location1,
const char *path1,
const svn_client__pathrev_t *location2,
const char *path2,
svn_boolean_t strict_urls,
apr_pool_t *scratch_pool)
{
if (! is_same_repos(location1, location2, strict_urls))
return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
_("'%s' must be from the same repository as "
"'%s'"), path1, path2);
return SVN_NO_ERROR;
}
/* Store LOCAL_ABSPATH in PATH_HASH after duplicating it into the pool
containing PATH_HASH. */
static APR_INLINE void
store_path(apr_hash_t *path_hash, const char *local_abspath)
{
const char *dup_path = apr_pstrdup(apr_hash_pool_get(path_hash),
local_abspath);
svn_hash_sets(path_hash, dup_path, dup_path);
}
/* Store LOCAL_ABSPATH in *PATH_HASH_P after duplicating it into the pool
containing *PATH_HASH_P. If *PATH_HASH_P is NULL, then first set
*PATH_HASH_P to a new hash allocated from POOL. */
static APR_INLINE void
alloc_and_store_path(apr_hash_t **path_hash_p,
const char *local_abspath,
apr_pool_t *pool)
{
if (! *path_hash_p)
*path_hash_p = apr_hash_make(pool);
store_path(*path_hash_p, local_abspath);
}
/* Return whether any WC path was put in conflict by the merge
operation corresponding to MERGE_B. */
static APR_INLINE svn_boolean_t
is_path_conflicted_by_merge(merge_cmd_baton_t *merge_b)
{
return (merge_b->conflicted_paths &&
apr_hash_count(merge_b->conflicted_paths) > 0);
}
/* Return a state indicating whether the WC metadata matches the
* node kind on disk of the local path LOCAL_ABSPATH.
* Use MERGE_B to determine the dry-run details; particularly, if a dry run
* noted that it deleted this path, assume matching node kinds (as if both
* kinds were svn_node_none).
*
* - Return svn_wc_notify_state_inapplicable if the node kind matches.
* - Return 'obstructed' if there is a node on disk where none or a
* different kind is expected, or if the disk node cannot be read.
* - Return 'missing' if there is no node on disk but one is expected.
* Also return 'missing' for server-excluded nodes (not here due to
* authz or other reasons determined by the server).
*
* Optionally return a bit more info for interested users.
**/
static svn_error_t *
perform_obstruction_check(svn_wc_notify_state_t *obstruction_state,
svn_boolean_t *deleted,
svn_boolean_t *excluded,
svn_node_kind_t *kind,
svn_depth_t *parent_depth,
const merge_cmd_baton_t *merge_b,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
svn_wc_context_t *wc_ctx = merge_b->ctx->wc_ctx;
svn_node_kind_t wc_kind;
svn_boolean_t check_root;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
*obstruction_state = svn_wc_notify_state_inapplicable;
if (deleted)
*deleted = FALSE;
if (kind)
*kind = svn_node_none;
if (kind == NULL)
kind = &wc_kind;
check_root = ! strcmp(local_abspath, merge_b->target->abspath);
SVN_ERR(svn_wc__check_for_obstructions(obstruction_state,
kind,
deleted,
excluded,
parent_depth,
wc_ctx, local_abspath,
check_root,
scratch_pool));
return SVN_NO_ERROR;
}
/* Create *LEFT and *RIGHT conflict versions for conflict victim
* at VICTIM_ABSPATH, with merge-left node kind MERGE_LEFT_NODE_KIND
* and merge-right node kind MERGE_RIGHT_NODE_KIND, using information
* obtained from MERGE_SOURCE and TARGET.
* Allocate returned conflict versions in RESULT_POOL. */
static svn_error_t *
make_conflict_versions(const svn_wc_conflict_version_t **left,
const svn_wc_conflict_version_t **right,
const char *victim_abspath,
svn_node_kind_t merge_left_node_kind,
svn_node_kind_t merge_right_node_kind,
const merge_source_t *merge_source,
const merge_target_t *target,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *child = svn_dirent_skip_ancestor(target->abspath,
victim_abspath);
const char *left_relpath, *right_relpath;
SVN_ERR_ASSERT(child != NULL);
left_relpath = svn_client__pathrev_relpath(merge_source->loc1,
scratch_pool);
right_relpath = svn_client__pathrev_relpath(merge_source->loc2,
scratch_pool);
*left = svn_wc_conflict_version_create2(
merge_source->loc1->repos_root_url,
merge_source->loc1->repos_uuid,
svn_relpath_join(left_relpath, child, scratch_pool),
merge_source->loc1->rev,
merge_left_node_kind, result_pool);
*right = svn_wc_conflict_version_create2(
merge_source->loc2->repos_root_url,
merge_source->loc2->repos_uuid,
svn_relpath_join(right_relpath, child, scratch_pool),
merge_source->loc2->rev,
merge_right_node_kind, result_pool);
return SVN_NO_ERROR;
}
/* Helper for filter_self_referential_mergeinfo()
*MERGEINFO is a non-empty, non-null collection of mergeinfo.
Remove all mergeinfo from *MERGEINFO that describes revision ranges
greater than REVISION. Put a copy of any removed mergeinfo, allocated
in POOL, into *YOUNGER_MERGEINFO.
If no mergeinfo is removed from *MERGEINFO then *YOUNGER_MERGEINFO is set
to NULL. If all mergeinfo is removed from *MERGEINFO then *MERGEINFO is
set to NULL.
*/
static svn_error_t*
split_mergeinfo_on_revision(svn_mergeinfo_t *younger_mergeinfo,
svn_mergeinfo_t *mergeinfo,
svn_revnum_t revision,
apr_pool_t *pool)
{
apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(pool);
*younger_mergeinfo = NULL;
for (hi = apr_hash_first(pool, *mergeinfo); hi; hi = apr_hash_next(hi))
{
int i;
const char *merge_source_path = apr_hash_this_key(hi);
svn_rangelist_t *rangelist = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
for (i = 0; i < rangelist->nelts; i++)
{
svn_merge_range_t *range =
APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
if (range->end <= revision)
{
/* This entirely of this range is as old or older than
REVISION, so leave it in *MERGEINFO. */
continue;
}
else
{
/* Since the rangelists in svn_mergeinfo_t's are sorted in
increasing order we know that part or all of *this* range
and *all* of the remaining ranges in *RANGELIST are younger
than REVISION. Remove the younger rangelists from
*MERGEINFO and put them in *YOUNGER_MERGEINFO. */
int j;
svn_rangelist_t *younger_rangelist =
apr_array_make(pool, 1, sizeof(svn_merge_range_t *));
for (j = i; j < rangelist->nelts; j++)
{
svn_merge_range_t *younger_range = svn_merge_range_dup(
APR_ARRAY_IDX(rangelist, j, svn_merge_range_t *), pool);
/* REVISION might intersect with the first range where
range->end > REVISION. If that is the case then split
the current range into two, putting the younger half
into *YOUNGER_MERGEINFO and leaving the older half in
*MERGEINFO. */
if (j == i && range->start + 1 <= revision)
younger_range->start = range->end = revision;
APR_ARRAY_PUSH(younger_rangelist, svn_merge_range_t *) =
younger_range;
}
/* So far we've only been manipulating rangelists, now we
actually create *YOUNGER_MERGEINFO and then remove the older
ranges from *MERGEINFO */
if (!(*younger_mergeinfo))
*younger_mergeinfo = apr_hash_make(pool);
svn_hash_sets(*younger_mergeinfo, merge_source_path,
younger_rangelist);
SVN_ERR(svn_mergeinfo_remove2(mergeinfo, *younger_mergeinfo,
*mergeinfo, TRUE, pool, iterpool));
break; /* ...out of for (i = 0; i < rangelist->nelts; i++) */
}
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Make a copy of PROPCHANGES (array of svn_prop_t) into *TRIMMED_PROPCHANGES,
omitting any svn:mergeinfo changes. */
static svn_error_t *
omit_mergeinfo_changes(apr_array_header_t **trimmed_propchanges,
const apr_array_header_t *propchanges,
apr_pool_t *result_pool)
{
int i;
*trimmed_propchanges = apr_array_make(result_pool,
propchanges->nelts,
sizeof(svn_prop_t));
for (i = 0; i < propchanges->nelts; ++i)
{
const svn_prop_t *change = &APR_ARRAY_IDX(propchanges, i, svn_prop_t);
/* If this property is not svn:mergeinfo, then copy it. */
if (strcmp(change->name, SVN_PROP_MERGEINFO) != 0)
APR_ARRAY_PUSH(*trimmed_propchanges, svn_prop_t) = *change;
}
return SVN_NO_ERROR;
}
/* Helper for merge_props_changed().
*PROPS is an array of svn_prop_t structures representing regular properties
to be added to the working copy TARGET_ABSPATH.
The merge source and target are assumed to be in the same repository.
Filter out mergeinfo property additions to TARGET_ABSPATH when
those additions refer to the same line of history as TARGET_ABSPATH as
described below.
Examine the added mergeinfo, looking at each range (or single rev)
of each source path. If a source_path/range refers to the same line of
history as TARGET_ABSPATH (pegged at its base revision), then filter out
that range. If the entire rangelist for a given path is filtered then
filter out the path as well.
RA_SESSION is an open RA session to the repository
in which both the source and target live, else RA_SESSION is not used. It
may be temporarily reparented as needed by this function.
Use CTX for any further client operations.
If any filtering occurs, set outgoing *PROPS to a shallow copy (allocated
in POOL) of incoming *PROPS minus the filtered mergeinfo. */
static svn_error_t *
filter_self_referential_mergeinfo(apr_array_header_t **props,
const char *target_abspath,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
apr_array_header_t *adjusted_props;
int i;
apr_pool_t *iterpool;
svn_boolean_t is_copy;
const char *repos_relpath;
svn_client__pathrev_t target_base;
/* If PATH itself has been added there is no need to filter. */
SVN_ERR(svn_wc__node_get_origin(&is_copy, &target_base.rev, &repos_relpath,
&target_base.repos_root_url,
&target_base.repos_uuid, NULL, NULL,
ctx->wc_ctx, target_abspath, FALSE,
pool, pool));
if (is_copy || !repos_relpath)
return SVN_NO_ERROR; /* A copy or a local addition */
target_base.url = svn_path_url_add_component2(target_base.repos_root_url,
repos_relpath, pool);
adjusted_props = apr_array_make(pool, (*props)->nelts, sizeof(svn_prop_t));
iterpool = svn_pool_create(pool);
for (i = 0; i < (*props)->nelts; ++i)
{
svn_prop_t *prop = &APR_ARRAY_IDX((*props), i, svn_prop_t);
svn_mergeinfo_t mergeinfo, younger_mergeinfo;
svn_mergeinfo_t filtered_mergeinfo = NULL;
svn_mergeinfo_t filtered_younger_mergeinfo = NULL;
svn_error_t *err;
/* If this property isn't mergeinfo or is NULL valued (i.e. prop removal)
or empty mergeinfo it does not require any special handling. There
is nothing to filter out of empty mergeinfo and the concept of
filtering doesn't apply if we are trying to remove mergeinfo
entirely. */
if ((strcmp(prop->name, SVN_PROP_MERGEINFO) != 0)
|| (! prop->value) /* Removal of mergeinfo */
|| (! prop->value->len)) /* Empty mergeinfo */
{
APR_ARRAY_PUSH(adjusted_props, svn_prop_t) = *prop;
continue;
}
svn_pool_clear(iterpool);
/* Non-empty mergeinfo; filter self-referential mergeinfo out. */
/* Parse the incoming mergeinfo to allow easier manipulation. */
err = svn_mergeinfo_parse(&mergeinfo, prop->value->data, iterpool);
if (err)
{
/* Issue #3896: If we can't parse it, we certainly can't
filter it. */
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
{
svn_error_clear(err);
APR_ARRAY_PUSH(adjusted_props, svn_prop_t) = *prop;
continue;
}
else
{
return svn_error_trace(err);
}
}
/* The working copy target PATH is at BASE_REVISION. Divide the
incoming mergeinfo into two groups. One where all revision ranges
are as old or older than BASE_REVISION and one where all revision
ranges are younger.
Note: You may be wondering why we do this.
For the incoming mergeinfo "older" than target's base revision we
can filter out self-referential mergeinfo efficiently using
svn_client__get_history_as_mergeinfo(). We simply look at PATH's
natural history as mergeinfo and remove that from any incoming
mergeinfo.
For mergeinfo "younger" than the base revision we can't use
svn_ra_get_location_segments() to look into PATH's future
history. Instead we must use svn_client__repos_locations() and
look at each incoming source/range individually and see if PATH
at its base revision and PATH at the start of the incoming range
exist on the same line of history. If they do then we can filter
out the incoming range. But since we have to do this for each
range there is a substantial performance penalty to pay if the
incoming ranges are not contiguous, i.e. we call
svn_client__repos_locations for each discrete range and incur
the cost of a roundtrip communication with the repository. */
SVN_ERR(split_mergeinfo_on_revision(&younger_mergeinfo,
&mergeinfo,
target_base.rev,
iterpool));
/* Filter self-referential mergeinfo from younger_mergeinfo. */
if (younger_mergeinfo)
{
apr_hash_index_t *hi;
const char *merge_source_root_url;
SVN_ERR(svn_ra_get_repos_root2(ra_session,
&merge_source_root_url, iterpool));
for (hi = apr_hash_first(iterpool, younger_mergeinfo);
hi; hi = apr_hash_next(hi))
{
int j;
const char *source_path = apr_hash_this_key(hi);
svn_rangelist_t *rangelist = apr_hash_this_val(hi);
const char *merge_source_url;
svn_rangelist_t *adjusted_rangelist =
apr_array_make(iterpool, 0, sizeof(svn_merge_range_t *));
merge_source_url =
svn_path_url_add_component2(merge_source_root_url,
source_path + 1, iterpool);
for (j = 0; j < rangelist->nelts; j++)
{
svn_error_t *err2;
svn_client__pathrev_t *start_loc;
svn_merge_range_t *range =
APR_ARRAY_IDX(rangelist, j, svn_merge_range_t *);
/* Because the merge source normalization code
ensures mergeinfo refers to real locations on
the same line of history, there's no need to
look at the whole range, just the start. */
/* Check if PATH@BASE_REVISION exists at
RANGE->START on the same line of history.
(start+1 because RANGE->start is not inclusive.) */
err2 = svn_client__repos_location(&start_loc, ra_session,
&target_base,
range->start + 1,
ctx, iterpool, iterpool);
if (err2)
{
if (err2->apr_err == SVN_ERR_CLIENT_UNRELATED_RESOURCES
|| err2->apr_err == SVN_ERR_FS_NOT_FOUND
|| err2->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
{
/* PATH@BASE_REVISION didn't exist at
RANGE->START + 1 or is unrelated to the
resource PATH@RANGE->START. Some of the
requested revisions may not even exist in
the repository; a real possibility since
mergeinfo is hand editable. In all of these
cases clear and ignore the error and don't
do any filtering.
Note: In this last case it is possible that
we will allow self-referential mergeinfo to
be applied, but fixing it here is potentially
very costly in terms of finding what part of
a range is actually valid. Simply allowing
the merge to proceed without filtering the
offending range seems the least worst
option. */
svn_error_clear(err2);
err2 = NULL;
APR_ARRAY_PUSH(adjusted_rangelist,
svn_merge_range_t *) = range;
}
else
{
return svn_error_trace(err2);
}
}
else
{
/* PATH@BASE_REVISION exists on the same
line of history at RANGE->START and RANGE->END.
Now check that PATH@BASE_REVISION's path
names at RANGE->START and RANGE->END are the same.
If the names are not the same then the mergeinfo
describing PATH@RANGE->START through
PATH@RANGE->END actually belong to some other
line of history and we want to record this
mergeinfo, not filter it. */
if (strcmp(start_loc->url, merge_source_url) != 0)
{
APR_ARRAY_PUSH(adjusted_rangelist,
svn_merge_range_t *) = range;
}
}
/* else no need to add, this mergeinfo is
all on the same line of history. */
} /* for (j = 0; j < rangelist->nelts; j++) */
/* Add any rangelists for source_path that are not
self-referential. */
if (adjusted_rangelist->nelts)
{
if (!filtered_younger_mergeinfo)
filtered_younger_mergeinfo = apr_hash_make(iterpool);
svn_hash_sets(filtered_younger_mergeinfo, source_path,
adjusted_rangelist);
}
} /* Iteration over each merge source in younger_mergeinfo. */
} /* if (younger_mergeinfo) */
/* Filter self-referential mergeinfo from "older" mergeinfo. */
if (mergeinfo)
{
svn_mergeinfo_t implicit_mergeinfo;
SVN_ERR(svn_client__get_history_as_mergeinfo(
&implicit_mergeinfo, NULL,
&target_base, target_base.rev, SVN_INVALID_REVNUM,
ra_session, ctx, iterpool));
/* Remove PATH's implicit mergeinfo from the incoming mergeinfo. */
SVN_ERR(svn_mergeinfo_remove2(&filtered_mergeinfo,
implicit_mergeinfo,
mergeinfo, TRUE, iterpool, iterpool));
}
/* Combine whatever older and younger filtered mergeinfo exists
into filtered_mergeinfo. */
if (filtered_mergeinfo && filtered_younger_mergeinfo)
SVN_ERR(svn_mergeinfo_merge2(filtered_mergeinfo,
filtered_younger_mergeinfo, iterpool,
iterpool));
else if (filtered_younger_mergeinfo)
filtered_mergeinfo = filtered_younger_mergeinfo;
/* If there is any incoming mergeinfo remaining after filtering
then put it in adjusted_props. */
if (filtered_mergeinfo && apr_hash_count(filtered_mergeinfo))
{
/* Convert filtered_mergeinfo to a svn_prop_t and put it
back in the array. */
svn_string_t *filtered_mergeinfo_str;
svn_prop_t *adjusted_prop = apr_pcalloc(pool,
sizeof(*adjusted_prop));
SVN_ERR(svn_mergeinfo_to_string(&filtered_mergeinfo_str,
filtered_mergeinfo,
pool));
adjusted_prop->name = SVN_PROP_MERGEINFO;
adjusted_prop->value = filtered_mergeinfo_str;
APR_ARRAY_PUSH(adjusted_props, svn_prop_t) = *adjusted_prop;
}
}
svn_pool_destroy(iterpool);
*props = adjusted_props;
return SVN_NO_ERROR;
}
/* Prepare a set of property changes PROPCHANGES to be used for a merge
operation on LOCAL_ABSPATH.
Remove all non-regular prop-changes (entry-props and WC-props).
Remove all non-mergeinfo prop-changes if it's a record-only merge.
Remove self-referential mergeinfo (### in some cases...)
Remove foreign-repository mergeinfo (### in some cases...)
Store the resulting property changes in *PROP_UPDATES.
Store information on where mergeinfo is updated in MERGE_B.
Used for both file and directory property merges. */
static svn_error_t *
prepare_merge_props_changed(const apr_array_header_t **prop_updates,
const char *local_abspath,
const apr_array_header_t *propchanges,
merge_cmd_baton_t *merge_b,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_array_header_t *props;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
/* We only want to merge "regular" version properties: by
definition, 'svn merge' shouldn't touch any data within .svn/ */
SVN_ERR(svn_categorize_props(propchanges, NULL, NULL, &props,
result_pool));
/* If we are only applying mergeinfo changes then we need to do
additional filtering of PROPS so it contains only mergeinfo changes. */
if (merge_b->record_only && props->nelts)
{
apr_array_header_t *mergeinfo_props =
apr_array_make(result_pool, 1, sizeof(svn_prop_t));
int i;
for (i = 0; i < props->nelts; i++)
{
svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
if (strcmp(prop->name, SVN_PROP_MERGEINFO) == 0)
{
APR_ARRAY_PUSH(mergeinfo_props, svn_prop_t) = *prop;
break;
}
}
props = mergeinfo_props;
}
if (props->nelts)
{
/* Issue #3383: We don't want mergeinfo from a foreign repos.
If this is a merge from a foreign repository we must strip all
incoming mergeinfo (including mergeinfo deletions). */
if (! merge_b->same_repos)
SVN_ERR(omit_mergeinfo_changes(&props, props, result_pool));
/* If this is a forward merge then don't add new mergeinfo to
PATH that is already part of PATH's own history, see
http://svn.haxx.se/dev/archive-2008-09/0006.shtml. If the
merge sources are not ancestral then there is no concept of a
'forward' or 'reverse' merge and we filter unconditionally. */
if (merge_b->merge_source.loc1->rev < merge_b->merge_source.loc2->rev
|| !merge_b->merge_source.ancestral)
{
if (HONOR_MERGEINFO(merge_b) || merge_b->reintegrate_merge)
SVN_ERR(filter_self_referential_mergeinfo(&props,
local_abspath,
merge_b->ra_session2,
merge_b->ctx,
result_pool));
}
}
*prop_updates = props;
/* Make a record in BATON if we find a PATH where mergeinfo is added
where none existed previously or PATH is having its existing
mergeinfo deleted. */
if (props->nelts)
{
int i;
for (i = 0; i < props->nelts; ++i)
{
svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
if (strcmp(prop->name, SVN_PROP_MERGEINFO) == 0)
{
/* Does LOCAL_ABSPATH have any pristine mergeinfo? */
svn_boolean_t has_pristine_mergeinfo = FALSE;
apr_hash_t *pristine_props;
SVN_ERR(svn_wc_get_pristine_props(&pristine_props,
merge_b->ctx->wc_ctx,
local_abspath,
scratch_pool,
scratch_pool));
if (pristine_props
&& svn_hash_gets(pristine_props, SVN_PROP_MERGEINFO))
has_pristine_mergeinfo = TRUE;
if (!has_pristine_mergeinfo && prop->value)
{
alloc_and_store_path(&merge_b->paths_with_new_mergeinfo,
local_abspath, merge_b->pool);
}
else if (has_pristine_mergeinfo && !prop->value)
{
alloc_and_store_path(&merge_b->paths_with_deleted_mergeinfo,
local_abspath, merge_b->pool);
}
}
}
}
return SVN_NO_ERROR;
}
#define CONFLICT_REASON_NONE ((svn_wc_conflict_reason_t)-1)
#define CONFLICT_REASON_SKIP ((svn_wc_conflict_reason_t)-2)
#define CONFLICT_REASON_SKIP_WC ((svn_wc_conflict_reason_t)-3)
/* Baton used for testing trees for being editted while performing tree
conflict detection for incoming deletes */
struct dir_delete_baton_t
{
/* Reference to dir baton of directory that is the root of the deletion */
struct merge_dir_baton_t *del_root;
/* Boolean indicating that some edit is found. Allows avoiding more work */
svn_boolean_t found_edit;
/* A list of paths that are compared. Kept up to date until FOUND_EDIT is
set to TRUE */
apr_hash_t *compared_abspaths;
};
/* Baton for the merge_dir_*() functions. Initialized in merge_dir_opened() */
struct merge_dir_baton_t
{
/* Reference to the parent baton, unless the parent is the anchor, in which
case PARENT_BATON is NULL */
struct merge_dir_baton_t *parent_baton;
/* The pool containing this baton. Use for RESULT_POOL for storing in this
baton */
apr_pool_t *pool;
/* This directory doesn't have a representation in the working copy, so any
operation on it will be skipped and possibly cause a tree conflict on the
shadow root */
svn_boolean_t shadowed;
/* This node or one of its descendants received operational changes from the
merge. If this node is the shadow root its tree conflict status has been
applied */
svn_boolean_t edited;
/* If a tree conflict will be installed once edited, it's reason. If a skip
should be produced its reason. Otherwise CONFLICT_REASON_NONE for no tree
conflict.
Special values:
CONFLICT_REASON_SKIP:
The node will be skipped with content and property state as stored in
SKIP_REASON.
CONFLICT_REASON_SKIP_WC:
The node will be skipped as an obstructing working copy.
*/
svn_wc_conflict_reason_t tree_conflict_reason;
svn_wc_conflict_action_t tree_conflict_action;
svn_node_kind_t tree_conflict_local_node_kind;
svn_node_kind_t tree_conflict_merge_left_node_kind;
svn_node_kind_t tree_conflict_merge_right_node_kind;
/* When TREE_CONFLICT_REASON is CONFLICT_REASON_SKIP, the skip state to
add to the notification */
svn_wc_notify_state_t skip_reason;
/* TRUE if the node was added by this merge. Otherwise FALSE */
svn_boolean_t added;
svn_boolean_t add_is_replace; /* Add is second part of replace */
/* TRUE if we are taking over an existing directory as addition, otherwise
FALSE. */
svn_boolean_t add_existing;
/* NULL, or an hashtable mapping const char * local_abspaths to
const char *kind mapping, containing deleted nodes that still need a delete
notification (which may be a replaced notification if the node is not just
deleted) */
apr_hash_t *pending_deletes;
/* NULL, or an hashtable mapping const char * LOCAL_ABSPATHs to
a const svn_wc_conflict_description2_t * instance, describing the just
installed conflict */
apr_hash_t *new_tree_conflicts;
/* If not NULL, a reference to the information of the delete test that is
currently in progress. Allocated in the root-directory baton, referenced
from all descendants */
struct dir_delete_baton_t *delete_state;
};
/* Baton for the merge_dir_*() functions. Initialized in merge_file_opened() */
struct merge_file_baton_t
{
/* Reference to the parent baton, unless the parent is the anchor, in which
case PARENT_BATON is NULL */
struct merge_dir_baton_t *parent_baton;
/* This file doesn't have a representation in the working copy, so any
operation on it will be skipped and possibly cause a tree conflict
on the shadow root */
svn_boolean_t shadowed;
/* This node received operational changes from the merge. If this node
is the shadow root its tree conflict status has been applied */
svn_boolean_t edited;
/* If a tree conflict will be installed once edited, it's reason. If a skip
should be produced its reason. Some special values are defined. See the
merge_tree_baton_t for an explanation. */
svn_wc_conflict_reason_t tree_conflict_reason;
svn_wc_conflict_action_t tree_conflict_action;
svn_node_kind_t tree_conflict_local_node_kind;
svn_node_kind_t tree_conflict_merge_left_node_kind;
svn_node_kind_t tree_conflict_merge_right_node_kind;
/* When TREE_CONFLICT_REASON is CONFLICT_REASON_SKIP, the skip state to
add to the notification */
svn_wc_notify_state_t skip_reason;
/* TRUE if the node was added by this merge. Otherwise FALSE */
svn_boolean_t added;
svn_boolean_t add_is_replace; /* Add is second part of replace */
};
/* Forward declaration */
static svn_error_t *
notify_merge_begin(merge_cmd_baton_t *merge_b,
const char *local_abspath,
svn_boolean_t delete_action,
apr_pool_t *scratch_pool);
/* Record the skip for future processing and (later) produce the
skip notification */
static svn_error_t *
record_skip(merge_cmd_baton_t *merge_b,
const char *local_abspath,
svn_node_kind_t kind,
svn_wc_notify_action_t action,
svn_wc_notify_state_t state,
struct merge_dir_baton_t *pdb,
apr_pool_t *scratch_pool)
{
if (merge_b->record_only)
return SVN_NO_ERROR; /* ### Why? - Legacy compatibility */
if ((merge_b->merge_source.ancestral || merge_b->reintegrate_merge)
&& !(pdb && pdb->shadowed))
{
store_path(merge_b->skipped_abspaths, local_abspath);
}
if (merge_b->ctx->notify_func2)
{
svn_wc_notify_t *notify;
SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE, scratch_pool));
notify = svn_wc_create_notify(local_abspath, action, scratch_pool);
notify->kind = kind;
notify->content_state = notify->prop_state = state;
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
scratch_pool);
}
return SVN_NO_ERROR;
}
+/* Forward declaration */
+static svn_client__merge_path_t *
+find_nearest_ancestor_with_intersecting_ranges(
+ svn_revnum_t *start,
+ svn_revnum_t *end,
+ const apr_array_header_t *children_with_mergeinfo,
+ svn_boolean_t path_is_own_ancestor,
+ const char *local_abspath);
+
/* Record a tree conflict in the WC, unless this is a dry run or a record-
* only merge, or if a tree conflict is already flagged for the VICTIM_PATH.
* (The latter can happen if a merge-tracking-aware merge is doing multiple
* editor drives because of a gap in the range of eligible revisions.)
*
* The tree conflict, with its victim specified by VICTIM_PATH, is
* assumed to have happened during a merge using merge baton MERGE_B.
*
* ACTION and REASON correspond to the fields
* of the same names in svn_wc_tree_conflict_description_t.
*/
static svn_error_t *
record_tree_conflict(merge_cmd_baton_t *merge_b,
const char *local_abspath,
struct merge_dir_baton_t *parent_baton,
svn_node_kind_t local_node_kind,
svn_node_kind_t merge_left_node_kind,
svn_node_kind_t merge_right_node_kind,
svn_wc_conflict_action_t action,
svn_wc_conflict_reason_t reason,
const svn_wc_conflict_description2_t *existing_conflict,
svn_boolean_t notify_tc,
apr_pool_t *scratch_pool)
{
svn_wc_context_t *wc_ctx = merge_b->ctx->wc_ctx;
if (merge_b->record_only)
return SVN_NO_ERROR;
if (merge_b->merge_source.ancestral
|| merge_b->reintegrate_merge)
{
store_path(merge_b->tree_conflicted_abspaths, local_abspath);
}
alloc_and_store_path(&merge_b->conflicted_paths, local_abspath,
merge_b->pool);
if (!merge_b->dry_run)
{
svn_wc_conflict_description2_t *conflict;
const svn_wc_conflict_version_t *left;
const svn_wc_conflict_version_t *right;
apr_pool_t *result_pool = parent_baton ? parent_baton->pool
: scratch_pool;
if (reason == svn_wc_conflict_reason_deleted)
{
const char *moved_to_abspath;
SVN_ERR(svn_wc__node_was_moved_away(&moved_to_abspath, NULL,
wc_ctx, local_abspath,
scratch_pool, scratch_pool));
if (moved_to_abspath)
{
/* Local abspath itself has been moved away. If only a
descendant is moved away, we call the node itself deleted */
reason = svn_wc_conflict_reason_moved_away;
}
}
else if (reason == svn_wc_conflict_reason_added)
{
const char *moved_from_abspath;
SVN_ERR(svn_wc__node_was_moved_here(&moved_from_abspath, NULL,
wc_ctx, local_abspath,
scratch_pool, scratch_pool));
if (moved_from_abspath)
reason = svn_wc_conflict_reason_moved_here;
}
- SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
- merge_left_node_kind,
- merge_right_node_kind,
- &merge_b->merge_source, merge_b->target,
- result_pool, scratch_pool));
+ if (HONOR_MERGEINFO(merge_b) && merge_b->merge_source.ancestral)
+ {
+ struct merge_source_t *source;
+ svn_client__pathrev_t *loc1;
+ svn_client__pathrev_t *loc2;
+ svn_merge_range_t range =
+ {SVN_INVALID_REVNUM, SVN_INVALID_REVNUM, TRUE};
+ /* We are honoring mergeinfo so do not blindly record
+ * a conflict describing the merge of
+ * SOURCE->LOC1->URL@SOURCE->LOC1->REV through
+ * SOURCE->LOC2->URL@SOURCE->LOC2->REV
+ * but figure out the actual revision range merged. */
+ (void)find_nearest_ancestor_with_intersecting_ranges(
+ &(range.start), &(range.end),
+ merge_b->notify_begin.nodes_with_mergeinfo,
+ action != svn_wc_conflict_action_delete,
+ local_abspath);
+ loc1 = svn_client__pathrev_dup(merge_b->merge_source.loc1,
+ scratch_pool);
+ loc2 = svn_client__pathrev_dup(merge_b->merge_source.loc2,
+ scratch_pool);
+ loc1->rev = range.start;
+ loc2->rev = range.end;
+ source = merge_source_create(loc1, loc2,
+ merge_b->merge_source.ancestral,
+ scratch_pool);
+ SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
+ merge_left_node_kind,
+ merge_right_node_kind,
+ source, merge_b->target,
+ result_pool, scratch_pool));
+ }
+ else
+ SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
+ merge_left_node_kind,
+ merge_right_node_kind,
+ &merge_b->merge_source, merge_b->target,
+ result_pool, scratch_pool));
+
/* Fix up delete of file, add of dir replacement (or other way around) */
if (existing_conflict != NULL && existing_conflict->src_left_version)
left = existing_conflict->src_left_version;
conflict = svn_wc_conflict_description_create_tree2(
local_abspath, local_node_kind,
svn_wc_operation_merge,
left, right, result_pool);
conflict->action = action;
conflict->reason = reason;
/* May return SVN_ERR_WC_PATH_UNEXPECTED_STATUS */
if (existing_conflict)
SVN_ERR(svn_wc__del_tree_conflict(wc_ctx, local_abspath,
scratch_pool));
SVN_ERR(svn_wc__add_tree_conflict(merge_b->ctx->wc_ctx, conflict,
scratch_pool));
if (parent_baton)
{
if (! parent_baton->new_tree_conflicts)
parent_baton->new_tree_conflicts = apr_hash_make(result_pool);
svn_hash_sets(parent_baton->new_tree_conflicts,
apr_pstrdup(result_pool, local_abspath),
conflict);
}
/* ### TODO: Store in parent baton */
}
/* On a replacement we currently get two tree conflicts */
if (merge_b->ctx->notify_func2 && notify_tc)
{
svn_wc_notify_t *notify;
SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE, scratch_pool));
notify = svn_wc_create_notify(local_abspath, svn_wc_notify_tree_conflict,
scratch_pool);
notify->kind = local_node_kind;
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
scratch_pool);
}
return SVN_NO_ERROR;
}
/* Record the add for future processing and produce the
update_add notification
*/
static svn_error_t *
record_update_add(merge_cmd_baton_t *merge_b,
const char *local_abspath,
svn_node_kind_t kind,
svn_boolean_t notify_replaced,
apr_pool_t *scratch_pool)
{
if (merge_b->merge_source.ancestral || merge_b->reintegrate_merge)
{
store_path(merge_b->merged_abspaths, local_abspath);
}
if (merge_b->ctx->notify_func2)
{
svn_wc_notify_t *notify;
svn_wc_notify_action_t action = svn_wc_notify_update_add;
SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE, scratch_pool));
if (notify_replaced)
action = svn_wc_notify_update_replace;
notify = svn_wc_create_notify(local_abspath, action, scratch_pool);
notify->kind = kind;
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
scratch_pool);
}
return SVN_NO_ERROR;
}
/* Record the update for future processing and produce the
update_update notification */
static svn_error_t *
record_update_update(merge_cmd_baton_t *merge_b,
const char *local_abspath,
svn_node_kind_t kind,
svn_wc_notify_state_t content_state,
svn_wc_notify_state_t prop_state,
apr_pool_t *scratch_pool)
{
if (merge_b->merge_source.ancestral || merge_b->reintegrate_merge)
{
store_path(merge_b->merged_abspaths, local_abspath);
}
if (merge_b->ctx->notify_func2)
{
svn_wc_notify_t *notify;
SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE, scratch_pool));
notify = svn_wc_create_notify(local_abspath, svn_wc_notify_update_update,
scratch_pool);
notify->kind = kind;
notify->content_state = content_state;
notify->prop_state = prop_state;
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
scratch_pool);
}
return SVN_NO_ERROR;
}
/* Record the delete for future processing and for (later) producing the
update_delete notification */
static svn_error_t *
record_update_delete(merge_cmd_baton_t *merge_b,
struct merge_dir_baton_t *parent_db,
const char *local_abspath,
svn_node_kind_t kind,
apr_pool_t *scratch_pool)
{
/* Update the lists of merged, skipped, tree-conflicted and added paths. */
if (merge_b->merge_source.ancestral
|| merge_b->reintegrate_merge)
{
/* Issue #4166: If a previous merge added NOTIFY_ABSPATH, but we
are now deleting it, then remove it from the list of added
paths. */
svn_hash_sets(merge_b->added_abspaths, local_abspath, NULL);
store_path(merge_b->merged_abspaths, local_abspath);
}
SVN_ERR(notify_merge_begin(merge_b, local_abspath, TRUE, scratch_pool));
if (parent_db)
{
const char *dup_abspath = apr_pstrdup(parent_db->pool, local_abspath);
if (!parent_db->pending_deletes)
parent_db->pending_deletes = apr_hash_make(parent_db->pool);
svn_hash_sets(parent_db->pending_deletes, dup_abspath,
svn_node_kind_to_word(kind));
}
return SVN_NO_ERROR;
}
/* Notify the pending 'D'eletes, that were waiting to see if a matching 'A'dd
might make them a 'R'eplace. */
static svn_error_t *
handle_pending_notifications(merge_cmd_baton_t *merge_b,
struct merge_dir_baton_t *db,
apr_pool_t *scratch_pool)
{
if (merge_b->ctx->notify_func2 && db->pending_deletes)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, db->pending_deletes);
hi;
hi = apr_hash_next(hi))
{
const char *del_abspath = apr_hash_this_key(hi);
svn_wc_notify_t *notify;
notify = svn_wc_create_notify(del_abspath,
svn_wc_notify_update_delete,
scratch_pool);
notify->kind = svn_node_kind_from_word(
apr_hash_this_val(hi));
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2,
notify, scratch_pool);
}
db->pending_deletes = NULL;
}
return SVN_NO_ERROR;
}
/* Helper function for the merge_dir_*() and merge_file_*() functions.
Installs and notifies pre-recorded tree conflicts and skips for
ancestors of operational merges
*/
static svn_error_t *
mark_dir_edited(merge_cmd_baton_t *merge_b,
struct merge_dir_baton_t *db,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
/* ### Too much common code with mark_file_edited */
if (db->edited)
return SVN_NO_ERROR;
if (db->parent_baton && !db->parent_baton->edited)
{
const char *dir_abspath = svn_dirent_dirname(local_abspath,
scratch_pool);
SVN_ERR(mark_dir_edited(merge_b, db->parent_baton, dir_abspath,
scratch_pool));
}
db->edited = TRUE;
if (! db->shadowed)
return SVN_NO_ERROR; /* Easy out */
if (db->parent_baton
&& db->parent_baton->delete_state
&& db->tree_conflict_reason != CONFLICT_REASON_NONE)
{
db->parent_baton->delete_state->found_edit = TRUE;
}
else if (db->tree_conflict_reason == CONFLICT_REASON_SKIP
|| db->tree_conflict_reason == CONFLICT_REASON_SKIP_WC)
{
/* open_directory() decided not to flag a tree conflict, but
for clarity we produce a skip for this node that
most likely isn't touched by the merge itself */
if (merge_b->ctx->notify_func2)
{
svn_wc_notify_t *notify;
SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE,
scratch_pool));
notify = svn_wc_create_notify(
local_abspath,
(db->tree_conflict_reason == CONFLICT_REASON_SKIP)
? svn_wc_notify_skip
: svn_wc_notify_update_skip_obstruction,
scratch_pool);
notify->kind = svn_node_dir;
notify->content_state = notify->prop_state = db->skip_reason;
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2,
notify,
scratch_pool);
}
if (merge_b->merge_source.ancestral
|| merge_b->reintegrate_merge)
{
store_path(merge_b->skipped_abspaths, local_abspath);
}
}
else if (db->tree_conflict_reason != CONFLICT_REASON_NONE)
{
/* open_directory() decided that a tree conflict should be raised */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, db->parent_baton,
db->tree_conflict_local_node_kind,
db->tree_conflict_merge_left_node_kind,
db->tree_conflict_merge_right_node_kind,
db->tree_conflict_action,
db->tree_conflict_reason,
NULL, TRUE,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Helper function for the merge_file_*() functions.
Installs and notifies pre-recorded tree conflicts and skips for
ancestors of operational merges
*/
static svn_error_t *
mark_file_edited(merge_cmd_baton_t *merge_b,
struct merge_file_baton_t *fb,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
/* ### Too much common code with mark_dir_edited */
if (fb->edited)
return SVN_NO_ERROR;
if (fb->parent_baton && !fb->parent_baton->edited)
{
const char *dir_abspath = svn_dirent_dirname(local_abspath,
scratch_pool);
SVN_ERR(mark_dir_edited(merge_b, fb->parent_baton, dir_abspath,
scratch_pool));
}
fb->edited = TRUE;
if (! fb->shadowed)
return SVN_NO_ERROR; /* Easy out */
if (fb->parent_baton
&& fb->parent_baton->delete_state
&& fb->tree_conflict_reason != CONFLICT_REASON_NONE)
{
fb->parent_baton->delete_state->found_edit = TRUE;
}
else if (fb->tree_conflict_reason == CONFLICT_REASON_SKIP
|| fb->tree_conflict_reason == CONFLICT_REASON_SKIP_WC)
{
/* open_directory() decided not to flag a tree conflict, but
for clarity we produce a skip for this node that
most likely isn't touched by the merge itself */
if (merge_b->ctx->notify_func2)
{
svn_wc_notify_t *notify;
SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE,
scratch_pool));
notify = svn_wc_create_notify(local_abspath, svn_wc_notify_skip,
scratch_pool);
notify->kind = svn_node_file;
notify->content_state = notify->prop_state = fb->skip_reason;
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2,
notify,
scratch_pool);
}
if (merge_b->merge_source.ancestral
|| merge_b->reintegrate_merge)
{
store_path(merge_b->skipped_abspaths, local_abspath);
}
}
else if (fb->tree_conflict_reason != CONFLICT_REASON_NONE)
{
/* open_file() decided that a tree conflict should be raised */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, fb->parent_baton,
fb->tree_conflict_local_node_kind,
fb->tree_conflict_merge_left_node_kind,
fb->tree_conflict_merge_right_node_kind,
fb->tree_conflict_action,
fb->tree_conflict_reason,
NULL, TRUE,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
Called before either merge_file_changed(), merge_file_added(),
merge_file_deleted() or merge_file_closed(), unless it sets *SKIP to TRUE.
When *SKIP is TRUE, the diff driver avoids work on getting the details
for the closing callbacks.
*/
static svn_error_t *
merge_file_opened(void **new_file_baton,
svn_boolean_t *skip,
const char *relpath,
const svn_diff_source_t *left_source,
const svn_diff_source_t *right_source,
const svn_diff_source_t *copyfrom_source,
void *dir_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *pdb = dir_baton;
struct merge_file_baton_t *fb;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
fb = apr_pcalloc(result_pool, sizeof(*fb));
fb->tree_conflict_reason = CONFLICT_REASON_NONE;
fb->tree_conflict_action = svn_wc_conflict_action_edit;
fb->skip_reason = svn_wc_notify_state_unknown;
if (left_source)
fb->tree_conflict_merge_left_node_kind = svn_node_file;
else
fb->tree_conflict_merge_left_node_kind = svn_node_none;
if (right_source)
fb->tree_conflict_merge_right_node_kind = svn_node_file;
else
fb->tree_conflict_merge_right_node_kind = svn_node_none;
*new_file_baton = fb;
if (pdb)
{
fb->parent_baton = pdb;
fb->shadowed = pdb->shadowed;
fb->skip_reason = pdb->skip_reason;
}
if (fb->shadowed)
{
/* An ancestor is tree conflicted. Nothing to do here. */
}
else if (left_source != NULL)
{
/* Node is expected to be a file, which will be changed or deleted. */
svn_boolean_t is_deleted;
svn_boolean_t excluded;
svn_depth_t parent_depth;
if (! right_source)
fb->tree_conflict_action = svn_wc_conflict_action_delete;
{
svn_wc_notify_state_t obstr_state;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, &excluded,
&fb->tree_conflict_local_node_kind,
&parent_depth,
merge_b, local_abspath,
scratch_pool));
if (obstr_state != svn_wc_notify_state_inapplicable)
{
fb->shadowed = TRUE;
fb->tree_conflict_reason = CONFLICT_REASON_SKIP;
fb->skip_reason = obstr_state;
return SVN_NO_ERROR;
}
if (is_deleted)
fb->tree_conflict_local_node_kind = svn_node_none;
}
if (fb->tree_conflict_local_node_kind == svn_node_none)
{
fb->shadowed = TRUE;
/* If this is not the merge target and the parent is too shallow to
contain this directory, and the directory is not present
via exclusion or depth filtering, skip it instead of recording
a tree conflict.
Non-inheritable mergeinfo will be recorded, allowing
future merges into non-shallow working copies to merge
changes we missed this time around. */
if (pdb && (excluded
|| (parent_depth != svn_depth_unknown &&
parent_depth < svn_depth_files)))
{
fb->shadowed = TRUE;
fb->tree_conflict_reason = CONFLICT_REASON_SKIP;
fb->skip_reason = svn_wc_notify_state_missing;
return SVN_NO_ERROR;
}
if (is_deleted)
fb->tree_conflict_reason = svn_wc_conflict_reason_deleted;
else
fb->tree_conflict_reason = svn_wc_conflict_reason_missing;
/* ### Similar to directory */
*skip = TRUE;
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
return SVN_NO_ERROR;
/* ### /Similar */
}
else if (fb->tree_conflict_local_node_kind != svn_node_file)
{
svn_boolean_t added;
fb->shadowed = TRUE;
SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
local_abspath, scratch_pool));
fb->tree_conflict_reason = added ? svn_wc_conflict_reason_added
: svn_wc_conflict_reason_obstructed;
/* ### Similar to directory */
*skip = TRUE;
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
return SVN_NO_ERROR;
/* ### /Similar */
}
if (! right_source)
{
/* We want to delete the directory */
fb->tree_conflict_action = svn_wc_conflict_action_delete;
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
if (fb->shadowed)
{
return SVN_NO_ERROR; /* Already set a tree conflict */
}
/* Comparison mode to verify for delete tree conflicts? */
if (pdb && pdb->delete_state
&& pdb->delete_state->found_edit)
{
/* Earlier nodes found a conflict. Done. */
*skip = TRUE;
}
}
}
else
{
const svn_wc_conflict_description2_t *old_tc = NULL;
/* The node doesn't exist pre-merge: We have an addition */
fb->added = TRUE;
fb->tree_conflict_action = svn_wc_conflict_action_add;
if (pdb && pdb->pending_deletes
&& svn_hash_gets(pdb->pending_deletes, local_abspath))
{
fb->add_is_replace = TRUE;
fb->tree_conflict_action = svn_wc_conflict_action_replace;
svn_hash_sets(pdb->pending_deletes, local_abspath, NULL);
}
if (pdb
&& pdb->new_tree_conflicts
&& (old_tc = svn_hash_gets(pdb->new_tree_conflicts, local_abspath)))
{
fb->tree_conflict_action = svn_wc_conflict_action_replace;
fb->tree_conflict_reason = old_tc->reason;
/* Update the tree conflict to store that this is a replace */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, pdb,
old_tc->node_kind,
old_tc->src_left_version->node_kind,
svn_node_file,
fb->tree_conflict_action,
fb->tree_conflict_reason,
old_tc, FALSE,
scratch_pool));
if (old_tc->reason == svn_wc_conflict_reason_deleted
|| old_tc->reason == svn_wc_conflict_reason_moved_away)
{
/* Issue #3806: Incoming replacements on local deletes produce
inconsistent result.
In this specific case we can continue applying the add part
of the replacement. */
}
else
{
*skip = TRUE;
return SVN_NO_ERROR;
}
}
else if (! (merge_b->dry_run
&& ((pdb && pdb->added) || fb->add_is_replace)))
{
svn_wc_notify_state_t obstr_state;
svn_boolean_t is_deleted;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, NULL,
&fb->tree_conflict_local_node_kind,
NULL, merge_b, local_abspath,
scratch_pool));
if (obstr_state != svn_wc_notify_state_inapplicable)
{
/* Skip the obstruction */
fb->shadowed = TRUE;
fb->tree_conflict_reason = CONFLICT_REASON_SKIP;
fb->skip_reason = obstr_state;
}
else if (fb->tree_conflict_local_node_kind != svn_node_none
&& !is_deleted)
{
/* Set a tree conflict */
svn_boolean_t added;
fb->shadowed = TRUE;
SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
local_abspath, scratch_pool));
fb->tree_conflict_reason = added ? svn_wc_conflict_reason_added
: svn_wc_conflict_reason_obstructed;
}
}
/* Handle pending conflicts */
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_file_opened() when a node receives only text and/or
* property changes between LEFT_SOURCE and RIGHT_SOURCE.
*
* left_file and right_file can be NULL when the file is not modified.
* left_props and right_props are always available.
*/
static svn_error_t *
merge_file_changed(const char *relpath,
const svn_diff_source_t *left_source,
const svn_diff_source_t *right_source,
const char *left_file,
const char *right_file,
/*const*/ apr_hash_t *left_props,
/*const*/ apr_hash_t *right_props,
svn_boolean_t file_modified,
const apr_array_header_t *prop_changes,
void *file_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_file_baton_t *fb = file_baton;
svn_client_ctx_t *ctx = merge_b->ctx;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
const svn_wc_conflict_version_t *left;
const svn_wc_conflict_version_t *right;
svn_wc_notify_state_t text_state;
svn_wc_notify_state_t property_state;
SVN_ERR_ASSERT(local_abspath && svn_dirent_is_absolute(local_abspath));
SVN_ERR_ASSERT(!left_file || svn_dirent_is_absolute(left_file));
SVN_ERR_ASSERT(!right_file || svn_dirent_is_absolute(right_file));
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
if (fb->shadowed)
{
if (fb->tree_conflict_reason == CONFLICT_REASON_NONE)
{
/* We haven't notified for this node yet: report a skip */
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_file,
svn_wc_notify_update_shadowed_update,
fb->skip_reason, fb->parent_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* This callback is essentially no more than a wrapper around
svn_wc_merge5(). Thank goodness that all the
diff-editor-mechanisms are doing the hard work of getting the
fulltexts! */
property_state = svn_wc_notify_state_unchanged;
text_state = svn_wc_notify_state_unchanged;
SVN_ERR(prepare_merge_props_changed(&prop_changes, local_abspath,
prop_changes, merge_b,
scratch_pool, scratch_pool));
SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
svn_node_file, svn_node_file,
&merge_b->merge_source, merge_b->target,
scratch_pool, scratch_pool));
/* Do property merge now, if we are not going to perform a text merge */
if ((merge_b->record_only || !left_file) && prop_changes->nelts)
{
SVN_ERR(svn_wc_merge_props3(&property_state, ctx->wc_ctx, local_abspath,
left, right,
left_props, prop_changes,
merge_b->dry_run,
NULL, NULL,
ctx->cancel_func, ctx->cancel_baton,
scratch_pool));
if (property_state == svn_wc_notify_state_conflicted)
{
alloc_and_store_path(&merge_b->conflicted_paths, local_abspath,
merge_b->pool);
}
}
/* Easy out: We are only applying mergeinfo differences. */
if (merge_b->record_only)
{
/* NO-OP */
}
else if (left_file)
{
svn_boolean_t has_local_mods;
enum svn_wc_merge_outcome_t content_outcome;
const char *target_label;
const char *left_label;
const char *right_label;
const char *path_ext = "";
if (merge_b->ext_patterns && merge_b->ext_patterns->nelts)
{
svn_path_splitext(NULL, &path_ext, local_abspath, scratch_pool);
if (! (*path_ext
&& svn_cstring_match_glob_list(path_ext,
merge_b->ext_patterns)))
{
path_ext = "";
}
}
/* xgettext: the '.working', '.merge-left.r%ld' and
'.merge-right.r%ld' strings are used to tag onto a file
name in case of a merge conflict */
target_label = apr_psprintf(scratch_pool, _(".working%s%s"),
*path_ext ? "." : "", path_ext);
left_label = apr_psprintf(scratch_pool,
_(".merge-left.r%ld%s%s"),
left_source->revision,
*path_ext ? "." : "", path_ext);
right_label = apr_psprintf(scratch_pool,
_(".merge-right.r%ld%s%s"),
right_source->revision,
*path_ext ? "." : "", path_ext);
SVN_ERR(svn_wc_text_modified_p2(&has_local_mods, ctx->wc_ctx,
local_abspath, FALSE, scratch_pool));
/* Do property merge and text merge in one step so that keyword expansion
takes into account the new property values. */
SVN_ERR(svn_wc_merge5(&content_outcome, &property_state, ctx->wc_ctx,
left_file, right_file, local_abspath,
left_label, right_label, target_label,
left, right,
merge_b->dry_run, merge_b->diff3_cmd,
merge_b->merge_options,
left_props, prop_changes,
NULL, NULL,
ctx->cancel_func,
ctx->cancel_baton,
scratch_pool));
if (content_outcome == svn_wc_merge_conflict
|| property_state == svn_wc_notify_state_conflicted)
{
alloc_and_store_path(&merge_b->conflicted_paths, local_abspath,
merge_b->pool);
}
if (content_outcome == svn_wc_merge_conflict)
text_state = svn_wc_notify_state_conflicted;
else if (has_local_mods
&& content_outcome != svn_wc_merge_unchanged)
text_state = svn_wc_notify_state_merged;
else if (content_outcome == svn_wc_merge_merged)
text_state = svn_wc_notify_state_changed;
else if (content_outcome == svn_wc_merge_no_merge)
text_state = svn_wc_notify_state_missing;
else /* merge_outcome == svn_wc_merge_unchanged */
text_state = svn_wc_notify_state_unchanged;
}
if (text_state == svn_wc_notify_state_conflicted
|| text_state == svn_wc_notify_state_merged
|| text_state == svn_wc_notify_state_changed
|| property_state == svn_wc_notify_state_conflicted
|| property_state == svn_wc_notify_state_merged
|| property_state == svn_wc_notify_state_changed)
{
SVN_ERR(record_update_update(merge_b, local_abspath, svn_node_file,
text_state, property_state,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_file_opened() when a node doesn't exist in LEFT_SOURCE,
* but does in RIGHT_SOURCE.
*
* When a node is replaced instead of just added a separate opened+deleted will
* be invoked before the current open+added.
*/
static svn_error_t *
merge_file_added(const char *relpath,
const svn_diff_source_t *copyfrom_source,
const svn_diff_source_t *right_source,
const char *copyfrom_file,
const char *right_file,
/*const*/ apr_hash_t *copyfrom_props,
/*const*/ apr_hash_t *right_props,
void *file_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_file_baton_t *fb = file_baton;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
apr_hash_t *pristine_props;
apr_hash_t *new_props;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
if (fb->shadowed)
{
if (fb->tree_conflict_reason == CONFLICT_REASON_NONE)
{
/* We haven't notified for this node yet: report a skip */
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_file,
svn_wc_notify_update_shadowed_add,
fb->skip_reason, fb->parent_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Easy out: We are only applying mergeinfo differences. */
if (merge_b->record_only)
{
return SVN_NO_ERROR;
}
if ((merge_b->merge_source.ancestral || merge_b->reintegrate_merge)
&& ( !fb->parent_baton || !fb->parent_baton->added))
{
/* Store the roots of added subtrees */
store_path(merge_b->added_abspaths, local_abspath);
}
if (!merge_b->dry_run)
{
const char *copyfrom_url;
svn_revnum_t copyfrom_rev;
svn_stream_t *new_contents, *pristine_contents;
/* If this is a merge from the same repository as our
working copy, we handle adds as add-with-history.
Otherwise, we'll use a pure add. */
if (merge_b->same_repos)
{
const char *child =
svn_dirent_skip_ancestor(merge_b->target->abspath,
local_abspath);
SVN_ERR_ASSERT(child != NULL);
copyfrom_url = svn_path_url_add_component2(
merge_b->merge_source.loc2->url,
child, scratch_pool);
copyfrom_rev = right_source->revision;
SVN_ERR(check_repos_match(merge_b->target, local_abspath,
copyfrom_url, scratch_pool));
SVN_ERR(svn_stream_open_readonly(&pristine_contents,
right_file,
scratch_pool,
scratch_pool));
new_contents = NULL; /* inherit from new_base_contents */
pristine_props = right_props; /* Includes last_* information */
new_props = NULL; /* No local changes */
if (svn_hash_gets(pristine_props, SVN_PROP_MERGEINFO))
{
alloc_and_store_path(&merge_b->paths_with_new_mergeinfo,
local_abspath, merge_b->pool);
}
}
else
{
apr_array_header_t *regular_props;
copyfrom_url = NULL;
copyfrom_rev = SVN_INVALID_REVNUM;
pristine_contents = svn_stream_empty(scratch_pool);
SVN_ERR(svn_stream_open_readonly(&new_contents, right_file,
scratch_pool, scratch_pool));
pristine_props = apr_hash_make(scratch_pool); /* Local addition */
/* We don't want any foreign properties */
SVN_ERR(svn_categorize_props(svn_prop_hash_to_array(right_props,
scratch_pool),
NULL, NULL, &regular_props,
scratch_pool));
new_props = svn_prop_array_to_hash(regular_props, scratch_pool);
/* Issue #3383: We don't want mergeinfo from a foreign repository. */
svn_hash_sets(new_props, SVN_PROP_MERGEINFO, NULL);
}
/* Do everything like if we had called 'svn cp PATH1 PATH2'. */
SVN_ERR(svn_wc_add_repos_file4(merge_b->ctx->wc_ctx,
local_abspath,
pristine_contents,
new_contents,
pristine_props, new_props,
copyfrom_url, copyfrom_rev,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
scratch_pool));
/* Caller must call svn_sleep_for_timestamps() */
*merge_b->use_sleep = TRUE;
}
SVN_ERR(record_update_add(merge_b, local_abspath, svn_node_file,
fb->add_is_replace, scratch_pool));
return SVN_NO_ERROR;
}
/* Compare the two sets of properties PROPS1 and PROPS2, ignoring the
* "svn:mergeinfo" property, and noticing only "normal" props. Set *SAME to
* true if the rest of the properties are identical or false if they differ.
*/
static svn_error_t *
properties_same_p(svn_boolean_t *same,
apr_hash_t *props1,
apr_hash_t *props2,
apr_pool_t *scratch_pool)
{
apr_array_header_t *prop_changes;
int i, diffs;
/* Examine the properties that differ */
SVN_ERR(svn_prop_diffs(&prop_changes, props1, props2, scratch_pool));
diffs = 0;
for (i = 0; i < prop_changes->nelts; i++)
{
const char *pname = APR_ARRAY_IDX(prop_changes, i, svn_prop_t).name;
/* Count the properties we're interested in; ignore the rest */
if (svn_wc_is_normal_prop(pname)
&& strcmp(pname, SVN_PROP_MERGEINFO) != 0)
diffs++;
}
*same = (diffs == 0);
return SVN_NO_ERROR;
}
/* Compare the file OLDER_ABSPATH (together with its normal properties in
* ORIGINAL_PROPS which may also contain WC props and entry props) with the
* versioned file MINE_ABSPATH (together with its versioned properties).
* Set *SAME to true if they are the same or false if they differ, ignoring
* the "svn:mergeinfo" property, and ignoring differences in keyword
* expansion and end-of-line style. */
static svn_error_t *
files_same_p(svn_boolean_t *same,
const char *older_abspath,
apr_hash_t *original_props,
const char *mine_abspath,
svn_wc_context_t *wc_ctx,
apr_pool_t *scratch_pool)
{
apr_hash_t *working_props;
SVN_ERR(svn_wc_prop_list2(&working_props, wc_ctx, mine_abspath,
scratch_pool, scratch_pool));
/* Compare the properties */
SVN_ERR(properties_same_p(same, original_props, working_props,
scratch_pool));
if (*same)
{
svn_stream_t *mine_stream;
svn_stream_t *older_stream;
svn_string_t *special = svn_hash_gets(working_props, SVN_PROP_SPECIAL);
svn_string_t *eol_style = svn_hash_gets(working_props, SVN_PROP_EOL_STYLE);
svn_string_t *keywords = svn_hash_gets(working_props, SVN_PROP_KEYWORDS);
/* Compare the file content, translating 'mine' to 'normal' form. */
if (special != NULL)
SVN_ERR(svn_subst_read_specialfile(&mine_stream, mine_abspath,
scratch_pool, scratch_pool));
else
SVN_ERR(svn_stream_open_readonly(&mine_stream, mine_abspath,
scratch_pool, scratch_pool));
if (!special && (eol_style || keywords))
{
apr_hash_t *kw = NULL;
const char *eol = NULL;
svn_subst_eol_style_t style;
/* We used to use svn_client__get_normalized_stream() here, but
that doesn't work in 100% of the cases because it doesn't
convert EOLs to the repository form; just to '\n'.
*/
if (eol_style)
{
svn_subst_eol_style_from_value(&style, &eol, eol_style->data);
if (style == svn_subst_eol_style_native)
eol = SVN_SUBST_NATIVE_EOL_STR;
else if (style != svn_subst_eol_style_fixed
&& style != svn_subst_eol_style_none)
return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
}
if (keywords)
SVN_ERR(svn_subst_build_keywords3(&kw, keywords->data, "", "",
"", 0, "", scratch_pool));
mine_stream = svn_subst_stream_translated(
mine_stream, eol, FALSE, kw, FALSE, scratch_pool);
}
SVN_ERR(svn_stream_open_readonly(&older_stream, older_abspath,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_contents_same2(same, mine_stream, older_stream,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_file_opened() when a node does exist in LEFT_SOURCE, but
* no longer exists (or is replaced) in RIGHT_SOURCE.
*
* When a node is replaced instead of just added a separate opened+added will
* be invoked after the current open+deleted.
*/
static svn_error_t *
merge_file_deleted(const char *relpath,
const svn_diff_source_t *left_source,
const char *left_file,
/*const*/ apr_hash_t *left_props,
void *file_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_file_baton_t *fb = file_baton;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
svn_boolean_t same;
SVN_ERR(mark_file_edited(merge_b, fb, local_abspath, scratch_pool));
if (fb->shadowed)
{
if (fb->tree_conflict_reason == CONFLICT_REASON_NONE)
{
/* We haven't notified for this node yet: report a skip */
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_file,
svn_wc_notify_update_shadowed_delete,
fb->skip_reason, fb->parent_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Easy out: We are only applying mergeinfo differences. */
if (merge_b->record_only)
{
return SVN_NO_ERROR;
}
/* If the files are identical, attempt deletion */
if (merge_b->force_delete)
same = TRUE;
else
SVN_ERR(files_same_p(&same, left_file, left_props,
local_abspath, merge_b->ctx->wc_ctx,
scratch_pool));
if (fb->parent_baton
&& fb->parent_baton->delete_state)
{
if (same)
{
/* Note that we checked this file */
store_path(fb->parent_baton->delete_state->compared_abspaths,
local_abspath);
}
else
{
/* We found some modification. Parent should raise a tree conflict */
fb->parent_baton->delete_state->found_edit = TRUE;
}
return SVN_NO_ERROR;
}
else if (same)
{
if (!merge_b->dry_run)
SVN_ERR(svn_wc_delete4(merge_b->ctx->wc_ctx, local_abspath,
FALSE /* keep_local */, FALSE /* unversioned */,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
NULL, NULL /* no notify */,
scratch_pool));
/* Record that we might have deleted mergeinfo */
alloc_and_store_path(&merge_b->paths_with_deleted_mergeinfo,
local_abspath, merge_b->pool);
/* And notify the deletion */
SVN_ERR(record_update_delete(merge_b, fb->parent_baton, local_abspath,
svn_node_file, scratch_pool));
}
else
{
/* The files differ, so raise a conflict instead of deleting */
/* This is use case 5 described in the paper attached to issue
* #2282. See also notes/tree-conflicts/detection.txt
*/
SVN_ERR(record_tree_conflict(merge_b, local_abspath, fb->parent_baton,
svn_node_file,
svn_node_file,
svn_node_none,
svn_wc_conflict_action_delete,
svn_wc_conflict_reason_edited,
NULL, TRUE,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
Called before either merge_dir_changed(), merge_dir_added(),
merge_dir_deleted() or merge_dir_closed(), unless it sets *SKIP to TRUE.
After this call and before the close call, all descendants will receive
their changes, unless *SKIP_CHILDREN is set to TRUE.
When *SKIP is TRUE, the diff driver avoids work on getting the details
for the closing callbacks.
The SKIP and SKIP_DESCENDANTS work independently.
*/
static svn_error_t *
merge_dir_opened(void **new_dir_baton,
svn_boolean_t *skip,
svn_boolean_t *skip_children,
const char *relpath,
const svn_diff_source_t *left_source,
const svn_diff_source_t *right_source,
const svn_diff_source_t *copyfrom_source,
void *parent_dir_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *db;
struct merge_dir_baton_t *pdb = parent_dir_baton;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
db = apr_pcalloc(result_pool, sizeof(*db));
db->pool = result_pool;
db->tree_conflict_reason = CONFLICT_REASON_NONE;
db->tree_conflict_action = svn_wc_conflict_action_edit;
db->skip_reason = svn_wc_notify_state_unknown;
*new_dir_baton = db;
if (left_source)
db->tree_conflict_merge_left_node_kind = svn_node_dir;
else
db->tree_conflict_merge_left_node_kind = svn_node_none;
if (right_source)
db->tree_conflict_merge_right_node_kind = svn_node_dir;
else
db->tree_conflict_merge_right_node_kind = svn_node_none;
if (pdb)
{
db->parent_baton = pdb;
db->shadowed = pdb->shadowed;
db->skip_reason = pdb->skip_reason;
}
if (db->shadowed)
{
/* An ancestor is tree conflicted. Nothing to do here. */
if (! left_source)
db->added = TRUE;
}
else if (left_source != NULL)
{
/* Node is expected to be a directory. */
svn_boolean_t is_deleted;
svn_boolean_t excluded;
svn_depth_t parent_depth;
if (! right_source)
db->tree_conflict_action = svn_wc_conflict_action_delete;
/* Check for an obstructed or missing node on disk. */
{
svn_wc_notify_state_t obstr_state;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, &excluded,
&db->tree_conflict_local_node_kind,
&parent_depth, merge_b,
local_abspath, scratch_pool));
if (obstr_state != svn_wc_notify_state_inapplicable)
{
db->shadowed = TRUE;
if (obstr_state == svn_wc_notify_state_obstructed)
{
svn_boolean_t is_wcroot;
SVN_ERR(svn_wc_check_root(&is_wcroot, NULL, NULL,
merge_b->ctx->wc_ctx,
local_abspath, scratch_pool));
if (is_wcroot)
{
db->tree_conflict_reason = CONFLICT_REASON_SKIP_WC;
return SVN_NO_ERROR;
}
}
db->tree_conflict_reason = CONFLICT_REASON_SKIP;
db->skip_reason = obstr_state;
if (! right_source)
{
*skip = *skip_children = TRUE;
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath,
scratch_pool));
}
return SVN_NO_ERROR;
}
if (is_deleted)
db->tree_conflict_local_node_kind = svn_node_none;
}
if (db->tree_conflict_local_node_kind == svn_node_none)
{
db->shadowed = TRUE;
/* If this is not the merge target and the parent is too shallow to
contain this directory, and the directory is not presen
via exclusion or depth filtering, skip it instead of recording
a tree conflict.
Non-inheritable mergeinfo will be recorded, allowing
future merges into non-shallow working copies to merge
changes we missed this time around. */
if (pdb && (excluded
|| (parent_depth != svn_depth_unknown &&
parent_depth < svn_depth_immediates)))
{
db->shadowed = TRUE;
db->tree_conflict_reason = CONFLICT_REASON_SKIP;
db->skip_reason = svn_wc_notify_state_missing;
return SVN_NO_ERROR;
}
if (is_deleted)
db->tree_conflict_reason = svn_wc_conflict_reason_deleted;
else
db->tree_conflict_reason = svn_wc_conflict_reason_missing;
/* ### To avoid breaking tests */
*skip = TRUE;
*skip_children = TRUE;
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
return SVN_NO_ERROR;
/* ### /avoid breaking tests */
}
else if (db->tree_conflict_local_node_kind != svn_node_dir)
{
svn_boolean_t added;
db->shadowed = TRUE;
SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
local_abspath, scratch_pool));
db->tree_conflict_reason = added ? svn_wc_conflict_reason_added
: svn_wc_conflict_reason_obstructed;
/* ### To avoid breaking tests */
*skip = TRUE;
*skip_children = TRUE;
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
return SVN_NO_ERROR;
/* ### /avoid breaking tests */
}
if (! right_source)
{
/* We want to delete the directory */
/* Mark PB edited now? */
db->tree_conflict_action = svn_wc_conflict_action_delete;
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
if (db->shadowed)
{
*skip_children = TRUE;
return SVN_NO_ERROR; /* Already set a tree conflict */
}
db->delete_state = (pdb != NULL) ? pdb->delete_state : NULL;
if (db->delete_state && db->delete_state->found_edit)
{
/* A sibling found a conflict. Done. */
*skip = TRUE;
*skip_children = TRUE;
}
else if (merge_b->force_delete)
{
/* No comparison necessary */
*skip_children = TRUE;
}
else if (! db->delete_state)
{
/* Start descendant comparison */
db->delete_state = apr_pcalloc(db->pool,
sizeof(*db->delete_state));
db->delete_state->del_root = db;
db->delete_state->compared_abspaths = apr_hash_make(db->pool);
}
}
}
else
{
const svn_wc_conflict_description2_t *old_tc = NULL;
/* The node doesn't exist pre-merge: We have an addition */
db->added = TRUE;
db->tree_conflict_action = svn_wc_conflict_action_add;
if (pdb && pdb->pending_deletes
&& svn_hash_gets(pdb->pending_deletes, local_abspath))
{
db->add_is_replace = TRUE;
db->tree_conflict_action = svn_wc_conflict_action_replace;
svn_hash_sets(pdb->pending_deletes, local_abspath, NULL);
}
if (pdb
&& pdb->new_tree_conflicts
&& (old_tc = svn_hash_gets(pdb->new_tree_conflicts, local_abspath)))
{
db->tree_conflict_action = svn_wc_conflict_action_replace;
db->tree_conflict_reason = old_tc->reason;
if (old_tc->reason == svn_wc_conflict_reason_deleted
|| old_tc->reason == svn_wc_conflict_reason_moved_away)
{
/* Issue #3806: Incoming replacements on local deletes produce
inconsistent result.
In this specific case we can continue applying the add part
of the replacement. */
}
else
{
*skip = TRUE;
*skip_children = TRUE;
/* Update the tree conflict to store that this is a replace */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, pdb,
old_tc->node_kind,
old_tc->src_left_version->node_kind,
svn_node_dir,
db->tree_conflict_action,
db->tree_conflict_reason,
old_tc, FALSE,
scratch_pool));
return SVN_NO_ERROR;
}
}
if (! (merge_b->dry_run
&& ((pdb && pdb->added) || db->add_is_replace)))
{
svn_wc_notify_state_t obstr_state;
svn_boolean_t is_deleted;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, NULL,
&db->tree_conflict_local_node_kind,
NULL, merge_b, local_abspath,
scratch_pool));
/* In this case of adding a directory, we have an exception to the
* usual "skip if it's inconsistent" rule. If the directory exists
* on disk unexpectedly, we simply make it versioned, because we can
* do so without risk of destroying data. Only skip if it is
* versioned but unexpectedly missing from disk, or is unversioned
* but obstructed by a node of the wrong kind. */
if (obstr_state == svn_wc_notify_state_obstructed
&& (is_deleted ||
db->tree_conflict_local_node_kind == svn_node_none))
{
svn_node_kind_t disk_kind;
SVN_ERR(svn_io_check_path(local_abspath, &disk_kind,
scratch_pool));
if (disk_kind == svn_node_dir)
{
obstr_state = svn_wc_notify_state_inapplicable;
db->add_existing = TRUE; /* Take over existing directory */
}
}
if (obstr_state != svn_wc_notify_state_inapplicable)
{
/* Skip the obstruction */
db->shadowed = TRUE;
db->tree_conflict_reason = CONFLICT_REASON_SKIP;
db->skip_reason = obstr_state;
}
else if (db->tree_conflict_local_node_kind != svn_node_none
&& !is_deleted)
{
/* Set a tree conflict */
svn_boolean_t added;
db->shadowed = TRUE;
SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
local_abspath, scratch_pool));
db->tree_conflict_reason = added ? svn_wc_conflict_reason_added
: svn_wc_conflict_reason_obstructed;
}
}
/* Handle pending conflicts */
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
if (db->shadowed)
{
/* Notified and done. Skip children? */
}
else if (merge_b->record_only)
{
/* Ok, we are done for this node and its descendants */
*skip = TRUE;
*skip_children = TRUE;
}
else if (! merge_b->dry_run)
{
/* Create the directory on disk, to allow descendants to be added */
if (! db->add_existing)
SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT,
scratch_pool));
if (old_tc)
{
/* svn_wc_add4 and svn_wc_add_from_disk3 can't add a node
over an existing tree conflict */
/* ### These functions should take some tree conflict argument
and allow overwriting the tc when one is passed */
SVN_ERR(svn_wc__del_tree_conflict(merge_b->ctx->wc_ctx,
local_abspath,
scratch_pool));
}
if (merge_b->same_repos)
{
const char *original_url;
original_url = svn_path_url_add_component2(
merge_b->merge_source.loc2->url,
relpath, scratch_pool);
/* Limitation (aka HACK):
We create a newly added directory with an original URL and
revision as that in the repository, but without its properties
and children.
When the merge is cancelled before the final dir_added(), the
copy won't really represent the in-repository state of the node.
*/
SVN_ERR(svn_wc_add4(merge_b->ctx->wc_ctx, local_abspath,
svn_depth_infinity,
original_url,
right_source->revision,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
NULL, NULL /* no notify! */,
scratch_pool));
}
else
{
SVN_ERR(svn_wc_add_from_disk3(merge_b->ctx->wc_ctx, local_abspath,
apr_hash_make(scratch_pool),
FALSE /* skip checks */,
NULL, NULL /* no notify! */,
scratch_pool));
}
if (old_tc != NULL)
{
/* ### Should be atomic with svn_wc_add(4|_from_disk2)() */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, pdb,
old_tc->node_kind,
svn_node_none,
svn_node_dir,
db->tree_conflict_action,
db->tree_conflict_reason,
old_tc, FALSE,
scratch_pool));
}
}
if (! db->shadowed && !merge_b->record_only)
SVN_ERR(record_update_add(merge_b, local_abspath, svn_node_dir,
db->add_is_replace, scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_dir_opened() when a node exists in both the left and
* right source, but has its properties changed inbetween.
*
* After the merge_dir_opened() but before the call to this merge_dir_changed()
* function all descendants will have been updated.
*/
static svn_error_t *
merge_dir_changed(const char *relpath,
const svn_diff_source_t *left_source,
const svn_diff_source_t *right_source,
/*const*/ apr_hash_t *left_props,
/*const*/ apr_hash_t *right_props,
const apr_array_header_t *prop_changes,
void *dir_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *db = dir_baton;
const apr_array_header_t *props;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
SVN_ERR(handle_pending_notifications(merge_b, db, scratch_pool));
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
if (db->shadowed)
{
if (db->tree_conflict_reason == CONFLICT_REASON_NONE)
{
/* We haven't notified for this node yet: report a skip */
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_dir,
svn_wc_notify_update_shadowed_update,
db->skip_reason, db->parent_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
SVN_ERR(prepare_merge_props_changed(&props, local_abspath, prop_changes,
merge_b, scratch_pool, scratch_pool));
if (props->nelts)
{
const svn_wc_conflict_version_t *left;
const svn_wc_conflict_version_t *right;
svn_client_ctx_t *ctx = merge_b->ctx;
svn_wc_notify_state_t prop_state;
SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
svn_node_dir, svn_node_dir,
&merge_b->merge_source,
merge_b->target,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc_merge_props3(&prop_state, ctx->wc_ctx, local_abspath,
left, right,
left_props, props,
merge_b->dry_run,
NULL, NULL,
ctx->cancel_func, ctx->cancel_baton,
scratch_pool));
if (prop_state == svn_wc_notify_state_conflicted)
{
alloc_and_store_path(&merge_b->conflicted_paths, local_abspath,
merge_b->pool);
}
if (prop_state == svn_wc_notify_state_conflicted
|| prop_state == svn_wc_notify_state_merged
|| prop_state == svn_wc_notify_state_changed)
{
SVN_ERR(record_update_update(merge_b, local_abspath, svn_node_file,
svn_wc_notify_state_inapplicable,
prop_state, scratch_pool));
}
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_dir_opened() when a node doesn't exist in LEFT_SOURCE,
* but does in RIGHT_SOURCE. After the merge_dir_opened() but before the call
* to this merge_dir_added() function all descendants will have been added.
*
* When a node is replaced instead of just added a separate opened+deleted will
* be invoked before the current open+added.
*/
static svn_error_t *
merge_dir_added(const char *relpath,
const svn_diff_source_t *copyfrom_source,
const svn_diff_source_t *right_source,
/*const*/ apr_hash_t *copyfrom_props,
/*const*/ apr_hash_t *right_props,
void *dir_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *db = dir_baton;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
/* For consistency; usually a no-op from _dir_added() */
SVN_ERR(handle_pending_notifications(merge_b, db, scratch_pool));
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
if (db->shadowed)
{
if (db->tree_conflict_reason == CONFLICT_REASON_NONE)
{
/* We haven't notified for this node yet: report a skip */
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_dir,
svn_wc_notify_update_shadowed_add,
db->skip_reason, db->parent_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
SVN_ERR_ASSERT(
db->edited /* Marked edited from merge_open_dir() */
&& ! merge_b->record_only /* Skip details from merge_open_dir() */
);
if ((merge_b->merge_source.ancestral || merge_b->reintegrate_merge)
&& ( !db->parent_baton || !db->parent_baton->added))
{
/* Store the roots of added subtrees */
store_path(merge_b->added_abspaths, local_abspath);
}
if (merge_b->same_repos)
{
/* When the directory was added in merge_dir_added() we didn't update its
pristine properties. Instead we receive the property changes later and
apply them in this function.
If we would apply them as changes (such as before fixing issue #3405),
we would see the unmodified properties as local changes, and the
pristine properties would be out of sync with what the repository
expects for this directory.
Instead of doing that we now simply set the properties as the pristine
properties via a private libsvn_wc api.
*/
const char *copyfrom_url;
svn_revnum_t copyfrom_rev;
const char *parent_abspath;
const char *child;
/* Creating a hash containing regular and entry props */
apr_hash_t *new_pristine_props = right_props;
parent_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
child = svn_dirent_is_child(merge_b->target->abspath, local_abspath, NULL);
SVN_ERR_ASSERT(child != NULL);
copyfrom_url = svn_path_url_add_component2(merge_b->merge_source.loc2->url,
child, scratch_pool);
copyfrom_rev = right_source->revision;
SVN_ERR(check_repos_match(merge_b->target, parent_abspath, copyfrom_url,
scratch_pool));
if (!merge_b->dry_run)
{
SVN_ERR(svn_wc__complete_directory_add(merge_b->ctx->wc_ctx,
local_abspath,
new_pristine_props,
copyfrom_url, copyfrom_rev,
scratch_pool));
}
if (svn_hash_gets(new_pristine_props, SVN_PROP_MERGEINFO))
{
alloc_and_store_path(&merge_b->paths_with_new_mergeinfo,
local_abspath, merge_b->pool);
}
}
else
{
apr_array_header_t *regular_props;
apr_hash_t *new_props;
svn_wc_notify_state_t prop_state;
SVN_ERR(svn_categorize_props(svn_prop_hash_to_array(right_props,
scratch_pool),
NULL, NULL, &regular_props, scratch_pool));
new_props = svn_prop_array_to_hash(regular_props, scratch_pool);
svn_hash_sets(new_props, SVN_PROP_MERGEINFO, NULL);
/* ### What is the easiest way to set new_props on LOCAL_ABSPATH?
### This doesn't need a merge as we just added the node
### (or installed a tree conflict and skipped this node)*/
SVN_ERR(svn_wc_merge_props3(&prop_state, merge_b->ctx->wc_ctx,
local_abspath,
NULL, NULL,
apr_hash_make(scratch_pool),
svn_prop_hash_to_array(new_props,
scratch_pool),
merge_b->dry_run,
NULL, NULL,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
scratch_pool));
if (prop_state == svn_wc_notify_state_conflicted)
{
alloc_and_store_path(&merge_b->conflicted_paths, local_abspath,
merge_b->pool);
}
}
return SVN_NO_ERROR;
}
/* Helper for merge_dir_deleted. Implement svn_wc_status_func4_t */
static svn_error_t *
verify_touched_by_del_check(void *baton,
const char *local_abspath,
const svn_wc_status3_t *status,
apr_pool_t *scratch_pool)
{
struct dir_delete_baton_t *delb = baton;
if (svn_hash_gets(delb->compared_abspaths, local_abspath))
return SVN_NO_ERROR;
switch (status->node_status)
{
case svn_wc_status_deleted:
case svn_wc_status_ignored:
case svn_wc_status_none:
return SVN_NO_ERROR;
default:
delb->found_edit = TRUE;
return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
}
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_dir_opened() when a node existed only in the left source.
*
* After the merge_dir_opened() but before the call to this merge_dir_deleted()
* function all descendants that existed in left_source will have been deleted.
*
* If this node is replaced, an _opened() followed by a matching _add() will
* be invoked after this function.
*/
static svn_error_t *
merge_dir_deleted(const char *relpath,
const svn_diff_source_t *left_source,
/*const*/ apr_hash_t *left_props,
void *dir_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *db = dir_baton;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
svn_boolean_t same;
apr_hash_t *working_props;
SVN_ERR(handle_pending_notifications(merge_b, db, scratch_pool));
SVN_ERR(mark_dir_edited(merge_b, db, local_abspath, scratch_pool));
if (db->shadowed)
{
if (db->tree_conflict_reason == CONFLICT_REASON_NONE)
{
/* We haven't notified for this node yet: report a skip */
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_dir,
svn_wc_notify_update_shadowed_delete,
db->skip_reason, db->parent_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Easy out: We are only applying mergeinfo differences. */
if (merge_b->record_only)
{
return SVN_NO_ERROR;
}
SVN_ERR(svn_wc_prop_list2(&working_props,
merge_b->ctx->wc_ctx, local_abspath,
scratch_pool, scratch_pool));
if (merge_b->force_delete)
{
/* In this legacy mode we just assume that a directory delete
matches any directory. db->delete_state is NULL */
same = TRUE;
}
else
{
struct dir_delete_baton_t *delb;
/* Compare the properties */
SVN_ERR(properties_same_p(&same, left_props, working_props,
scratch_pool));
delb = db->delete_state;
assert(delb != NULL);
if (! same)
{
delb->found_edit = TRUE;
}
else
{
store_path(delb->compared_abspaths, local_abspath);
}
if (delb->del_root != db)
return SVN_NO_ERROR;
if (delb->found_edit)
same = FALSE;
else
{
apr_array_header_t *ignores;
svn_error_t *err;
same = TRUE;
SVN_ERR(svn_wc_get_default_ignores(&ignores, merge_b->ctx->config,
scratch_pool));
/* None of the descendants was modified, but maybe there are
descendants we haven't walked?
Note that we aren't interested in changes, as we already verified
changes in the paths touched by the merge. And the existence of
other paths is enough to mark the directory edited */
err = svn_wc_walk_status(merge_b->ctx->wc_ctx, local_abspath,
svn_depth_infinity, TRUE /* get-all */,
FALSE /* no-ignore */,
TRUE /* ignore-text-mods */, ignores,
verify_touched_by_del_check, delb,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_CEASE_INVOCATION)
return svn_error_trace(err);
svn_error_clear(err);
}
same = ! delb->found_edit;
}
}
if (same && !merge_b->dry_run)
{
svn_error_t *err;
err = svn_wc_delete4(merge_b->ctx->wc_ctx, local_abspath,
FALSE /* keep_local */, FALSE /* unversioned */,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
NULL, NULL /* no notify */,
scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_LEFT_LOCAL_MOD)
return svn_error_trace(err);
svn_error_clear(err);
same = FALSE;
}
}
if (! same)
{
/* If the attempt to delete an existing directory failed,
* the directory has local modifications (e.g. locally added
* files, or property changes). Flag a tree conflict. */
/* This handles use case 5 described in the paper attached to issue
* #2282. See also notes/tree-conflicts/detection.txt
*/
SVN_ERR(record_tree_conflict(merge_b, local_abspath, db->parent_baton,
svn_node_dir,
svn_node_dir,
svn_node_none,
svn_wc_conflict_action_delete,
svn_wc_conflict_reason_edited,
NULL, TRUE,
scratch_pool));
}
else
{
/* Record that we might have deleted mergeinfo */
if (working_props
&& svn_hash_gets(working_props, SVN_PROP_MERGEINFO))
{
alloc_and_store_path(&merge_b->paths_with_deleted_mergeinfo,
local_abspath, merge_b->pool);
}
SVN_ERR(record_update_delete(merge_b, db->parent_baton, local_abspath,
svn_node_dir, scratch_pool));
}
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
*
* Called after merge_dir_opened() when a node itself didn't change between
* the left and right source.
*
* After the merge_dir_opened() but before the call to this merge_dir_closed()
* function all descendants will have been processed.
*/
static svn_error_t *
merge_dir_closed(const char *relpath,
const svn_diff_source_t *left_source,
const svn_diff_source_t *right_source,
void *dir_baton,
const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *db = dir_baton;
SVN_ERR(handle_pending_notifications(merge_b, db, scratch_pool));
return SVN_NO_ERROR;
}
/* An svn_diff_tree_processor_t function.
Called when the diff driver wants to report an absent path.
In case of merges this happens when the diff encounters a server-excluded
path.
We register a skipped path, which will make parent mergeinfo non-
inheritable. This ensures that a future merge might see these skipped
changes as eligable for merging.
For legacy reasons we also notify the path as skipped.
*/
static svn_error_t *
merge_node_absent(const char *relpath,
void *dir_baton,
const svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t *merge_b = processor->baton;
struct merge_dir_baton_t *db = dir_baton;
const char *local_abspath = svn_dirent_join(merge_b->target->abspath,
relpath, scratch_pool);
SVN_ERR(record_skip(merge_b, local_abspath, svn_node_unknown,
svn_wc_notify_skip, svn_wc_notify_state_missing,
db, scratch_pool));
return SVN_NO_ERROR;
}
/*-----------------------------------------------------------------------*/
/*** Merge Notification ***/
/* Finds a nearest ancestor in CHILDREN_WITH_MERGEINFO for LOCAL_ABSPATH. If
PATH_IS_OWN_ANCESTOR is TRUE then a child in CHILDREN_WITH_MERGEINFO
where child->abspath == PATH is considered PATH's ancestor. If FALSE,
then child->abspath must be a proper ancestor of PATH.
CHILDREN_WITH_MERGEINFO is expected to be sorted in Depth first
order of path. */
static svn_client__merge_path_t *
find_nearest_ancestor(const apr_array_header_t *children_with_mergeinfo,
svn_boolean_t path_is_own_ancestor,
const char *local_abspath)
{
int i;
SVN_ERR_ASSERT_NO_RETURN(children_with_mergeinfo != NULL);
for (i = children_with_mergeinfo->nelts - 1; i >= 0 ; i--)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
if (svn_dirent_is_ancestor(child->abspath, local_abspath)
&& (path_is_own_ancestor
|| strcmp(child->abspath, local_abspath) != 0))
return child;
}
return NULL;
}
/* Find the highest level path in a merge target (possibly the merge target
itself) to use in a merge notification header.
Return the svn_client__merge_path_t * representing the most distant
ancestor in CHILDREN_WITH_MERGEINFO of LOCAL_ABSPATH where said
ancestor's first remaining ranges element (per the REMAINING_RANGES
member of the ancestor) intersect with the first remaining ranges element
for every intermediate ancestor svn_client__merge_path_t * of
LOCAL_ABSPATH. If no such ancestor is found return NULL.
If the remaining ranges of the elements in CHILDREN_WITH_MERGEINFO
represent a forward merge, then set *START to the oldest revision found
in any of the intersecting ancestors and *END to the youngest revision
found. If the remaining ranges of the elements in CHILDREN_WITH_MERGEINFO
represent a reverse merge, then set *START to the youngest revision
found and *END to the oldest revision found. If no ancestors are found
then set *START and *END to SVN_INVALID_REVNUM.
If PATH_IS_OWN_ANCESTOR is TRUE then a child in CHILDREN_WITH_MERGEINFO
where child->abspath == PATH is considered PATH's ancestor. If FALSE,
then child->abspath must be a proper ancestor of PATH.
See the CHILDREN_WITH_MERGEINFO ARRAY global comment for more
information. */
static svn_client__merge_path_t *
find_nearest_ancestor_with_intersecting_ranges(
svn_revnum_t *start,
svn_revnum_t *end,
const apr_array_header_t *children_with_mergeinfo,
svn_boolean_t path_is_own_ancestor,
const char *local_abspath)
{
int i;
svn_client__merge_path_t *nearest_ancestor = NULL;
*start = SVN_INVALID_REVNUM;
*end = SVN_INVALID_REVNUM;
SVN_ERR_ASSERT_NO_RETURN(children_with_mergeinfo != NULL);
for (i = children_with_mergeinfo->nelts - 1; i >= 0 ; i--)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
if (svn_dirent_is_ancestor(child->abspath, local_abspath)
&& (path_is_own_ancestor
|| strcmp(child->abspath, local_abspath) != 0))
{
if (nearest_ancestor == NULL)
{
/* Found an ancestor. */
nearest_ancestor = child;
if (child->remaining_ranges)
{
svn_merge_range_t *r1 = APR_ARRAY_IDX(
child->remaining_ranges, 0, svn_merge_range_t *);
*start = r1->start;
*end = r1->end;
}
else
{
/* If CHILD->REMAINING_RANGES is null then LOCAL_ABSPATH
is inside an absent subtree in the merge target. */
*start = SVN_INVALID_REVNUM;
*end = SVN_INVALID_REVNUM;
break;
}
}
else
{
/* We'e found another ancestor for LOCAL_ABSPATH. Do its
first remaining range intersect with the previously
found ancestor? */
svn_merge_range_t *r1 =
APR_ARRAY_IDX(nearest_ancestor->remaining_ranges, 0,
svn_merge_range_t *);
svn_merge_range_t *r2 =
APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *);
if (r1 && r2)
{
svn_merge_range_t range1;
svn_merge_range_t range2;
svn_boolean_t reverse_merge = r1->start > r2->end;
/* Flip endpoints if this is a reverse merge. */
if (reverse_merge)
{
range1.start = r1->end;
range1.end = r1->start;
range2.start = r2->end;
range2.end = r2->start;
}
else
{
range1.start = r1->start;
range1.end = r1->end;
range2.start = r2->start;
range2.end = r2->end;
}
if (range1.start < range2.end && range2.start < range1.end)
{
*start = reverse_merge ?
MAX(r1->start, r2->start) : MIN(r1->start, r2->start);
*end = reverse_merge ?
MIN(r1->end, r2->end) : MAX(r1->end, r2->end);
nearest_ancestor = child;
}
}
}
}
}
return nearest_ancestor;
}
/* Notify that we're starting to record mergeinfo for the merge of the
* revision range RANGE into TARGET_ABSPATH. RANGE should be null if the
* merge sources are not from the same URL.
*
* This calls the client's notification receiver (as found in the client
* context), with a WC abspath.
*/
static void
notify_mergeinfo_recording(const char *target_abspath,
const svn_merge_range_t *range,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
if (ctx->notify_func2)
{
svn_wc_notify_t *n = svn_wc_create_notify(
target_abspath, svn_wc_notify_merge_record_info_begin, pool);
n->merge_range = range ? svn_merge_range_dup(range, pool) : NULL;
ctx->notify_func2(ctx->notify_baton2, n, pool);
}
}
/* Notify that we're completing the merge into TARGET_ABSPATH.
*
* This calls the client's notification receiver (as found in the client
* context), with a WC abspath.
*/
static void
notify_merge_completed(const char *target_abspath,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
if (ctx->notify_func2)
{
svn_wc_notify_t *n
= svn_wc_create_notify(target_abspath, svn_wc_notify_merge_completed,
pool);
ctx->notify_func2(ctx->notify_baton2, n, pool);
}
}
/* Is the notification the result of a real operative merge? */
#define IS_OPERATIVE_NOTIFICATION(notify) \
(notify->content_state == svn_wc_notify_state_conflicted \
|| notify->content_state == svn_wc_notify_state_merged \
|| notify->content_state == svn_wc_notify_state_changed \
|| notify->prop_state == svn_wc_notify_state_conflicted \
|| notify->prop_state == svn_wc_notify_state_merged \
|| notify->prop_state == svn_wc_notify_state_changed \
|| notify->action == svn_wc_notify_update_add \
|| notify->action == svn_wc_notify_tree_conflict)
/* Remove merge source gaps from range used for merge notifications.
See http://subversion.tigris.org/issues/show_bug.cgi?id=4138
If IMPLICIT_SRC_GAP is not NULL then it is a rangelist containing a
single range (see the implicit_src_gap member of merge_cmd_baton_t).
RANGE describes a (possibly reverse) merge.
If IMPLICIT_SRC_GAP is not NULL and it's sole range intersects with
the older revision in *RANGE, then remove IMPLICIT_SRC_GAP's range
from *RANGE. */
static void
remove_source_gap(svn_merge_range_t *range,
apr_array_header_t *implicit_src_gap)
{
if (implicit_src_gap)
{
svn_merge_range_t *gap_range =
APR_ARRAY_IDX(implicit_src_gap, 0, svn_merge_range_t *);
if (range->start < range->end)
{
if (gap_range->start == range->start)
range->start = gap_range->end;
}
else /* Reverse merge */
{
if (gap_range->start == range->end)
range->end = gap_range->end;
}
}
}
/* Notify that we're starting a merge
*
* This calls the client's notification receiver (as found in the client
* context), with a WC abspath.
*/
static svn_error_t *
notify_merge_begin(merge_cmd_baton_t *merge_b,
const char *local_abspath,
svn_boolean_t delete_action,
apr_pool_t *scratch_pool)
{
svn_wc_notify_t *notify;
svn_merge_range_t n_range =
{SVN_INVALID_REVNUM, SVN_INVALID_REVNUM, TRUE};
const char *notify_abspath;
if (! merge_b->ctx->notify_func2)
return SVN_NO_ERROR;
/* If our merge sources are ancestors of one another... */
if (merge_b->merge_source.ancestral)
{
const svn_client__merge_path_t *child;
/* Find NOTIFY->PATH's nearest ancestor in
NOTIFY->CHILDREN_WITH_MERGEINFO. Normally we consider a child in
NOTIFY->CHILDREN_WITH_MERGEINFO representing PATH to be an
ancestor of PATH, but if this is a deletion of PATH then the
notification must be for a proper ancestor of PATH. This ensures
we don't get notifications like:
--- Merging rX into 'PARENT/CHILD'
D PARENT/CHILD
But rather:
--- Merging rX into 'PARENT'
D PARENT/CHILD
*/
child = find_nearest_ancestor_with_intersecting_ranges(
&(n_range.start), &(n_range.end),
merge_b->notify_begin.nodes_with_mergeinfo,
! delete_action, local_abspath);
if (!child && delete_action)
{
/* Triggered by file replace in single-file-merge */
child = find_nearest_ancestor(merge_b->notify_begin.nodes_with_mergeinfo,
TRUE, local_abspath);
}
assert(child != NULL); /* Should always find the merge anchor */
if (! child)
return SVN_NO_ERROR;
if (merge_b->notify_begin.last_abspath != NULL
&& strcmp(child->abspath, merge_b->notify_begin.last_abspath) == 0)
{
/* Don't notify the same merge again */
return SVN_NO_ERROR;
}
merge_b->notify_begin.last_abspath = child->abspath;
if (child->absent || child->remaining_ranges->nelts == 0
|| !SVN_IS_VALID_REVNUM(n_range.start))
{
/* No valid information for an header */
return SVN_NO_ERROR;
}
notify_abspath = child->abspath;
}
else
{
if (merge_b->notify_begin.last_abspath)
return SVN_NO_ERROR; /* already notified */
notify_abspath = merge_b->target->abspath;
/* Store something in last_abspath. Any value would do */
merge_b->notify_begin.last_abspath = merge_b->target->abspath;
}
notify = svn_wc_create_notify(notify_abspath,
merge_b->same_repos
? svn_wc_notify_merge_begin
: svn_wc_notify_foreign_merge_begin,
scratch_pool);
if (SVN_IS_VALID_REVNUM(n_range.start))
{
/* If the merge source has a gap, then don't mention
those gap revisions in the notification. */
remove_source_gap(&n_range, merge_b->implicit_src_gap);
notify->merge_range = &n_range;
}
else
{
notify->merge_range = NULL;
}
merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
scratch_pool);
return SVN_NO_ERROR;
}
/* Set *OUT_RANGELIST to the intersection of IN_RANGELIST with the simple
* (inheritable) revision range REV1:REV2, according to CONSIDER_INHERITANCE.
* If REV1 is equal to REV2, the result is an empty rangelist, otherwise
* REV1 must be less than REV2.
*
* Note: If CONSIDER_INHERITANCE is FALSE, the effect is to treat any non-
* inheritable input ranges as if they were inheritable. If it is TRUE, the
* effect is to discard any non-inheritable input ranges. Therefore the
* ranges in *OUT_RANGELIST will always be inheritable. */
static svn_error_t *
rangelist_intersect_range(svn_rangelist_t **out_rangelist,
const svn_rangelist_t *in_rangelist,
svn_revnum_t rev1,
svn_revnum_t rev2,
svn_boolean_t consider_inheritance,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
SVN_ERR_ASSERT(rev1 <= rev2);
if (rev1 < rev2)
{
svn_rangelist_t *simple_rangelist =
svn_rangelist__initialize(rev1, rev2, TRUE, scratch_pool);
SVN_ERR(svn_rangelist_intersect(out_rangelist,
simple_rangelist, in_rangelist,
consider_inheritance, result_pool));
}
else
{
*out_rangelist = apr_array_make(result_pool, 0,
sizeof(svn_merge_range_t *));
}
return SVN_NO_ERROR;
}
/* Helper for fix_deleted_subtree_ranges(). Like fix_deleted_subtree_ranges()
this function should only be called when honoring mergeinfo.
CHILD, PARENT, REVISION1, REVISION2, and RA_SESSION are all cascaded from
fix_deleted_subtree_ranges() -- see that function for more information on
each.
If PARENT is not the merge target then PARENT must have already have been
processed by this function as a child. Specifically, this means that
PARENT->REMAINING_RANGES must already be populated -- it can be an empty
rangelist but cannot be NULL.
PRIMARY_URL is the merge source url of CHILD at the younger of REVISION1
and REVISION2.
Since this function is only invoked for subtrees of the merge target, the
guarantees afforded by normalize_merge_sources() don't apply - see the
'MERGEINFO MERGE SOURCE NORMALIZATION' comment at the top of this file.
Therefore it is possible that PRIMARY_URL@REVISION1 and
PRIMARY_URL@REVISION2 don't describe the endpoints of an unbroken line of
history. The purpose of this helper is to identify these cases of broken
history and adjust CHILD->REMAINING_RANGES in such a way we don't later try
to describe nonexistent path/revisions to the merge report editor -- see
drive_merge_report_editor().
If PRIMARY_URL@REVISION1 and PRIMARY_URL@REVISION2 describe an unbroken
line of history then do nothing and leave CHILD->REMAINING_RANGES as-is.
If neither PRIMARY_URL@REVISION1 nor PRIMARY_URL@REVISION2 exist then
there is nothing to merge to CHILD->ABSPATH so set CHILD->REMAINING_RANGES
equal to PARENT->REMAINING_RANGES. This will cause the subtree to
effectively ignore CHILD -- see 'Note: If the first svn_merge_range_t...'
in drive_merge_report_editor()'s doc string.
If PRIMARY_URL@REVISION1 *xor* PRIMARY_URL@REVISION2 exist then we take the
subset of REVISION1:REVISION2 in CHILD->REMAINING_RANGES at which
PRIMARY_URL doesn't exist and set that subset equal to
PARENT->REMAINING_RANGES' intersection with that non-existent range. Why?
Because this causes CHILD->REMAINING_RANGES to be identical to
PARENT->REMAINING_RANGES for revisions between REVISION1 and REVISION2 at
which PRIMARY_URL doesn't exist. As mentioned above this means that
drive_merge_report_editor() won't attempt to describe these non-existent
subtree path/ranges to the reporter (which would break the merge).
If the preceding paragraph wasn't terribly clear then what follows spells
out this function's behavior a bit more explicitly:
For forward merges (REVISION1 < REVISION2)
If PRIMARY_URL@REVISION1 exists but PRIMARY_URL@REVISION2 doesn't, then
find the revision 'N' in which PRIMARY_URL@REVISION1 was deleted. Leave
the subset of CHILD->REMAINING_RANGES that intersects with
REVISION1:(N - 1) as-is and set the subset of CHILD->REMAINING_RANGES
that intersects with (N - 1):REVISION2 equal to PARENT->REMAINING_RANGES'
intersection with (N - 1):REVISION2.
If PRIMARY_URL@REVISION1 doesn't exist but PRIMARY_URL@REVISION2 does,
then find the revision 'M' in which PRIMARY_URL@REVISION2 came into
existence. Leave the subset of CHILD->REMAINING_RANGES that intersects with
(M - 1):REVISION2 as-is and set the subset of CHILD->REMAINING_RANGES
that intersects with REVISION1:(M - 1) equal to PARENT->REMAINING_RANGES'
intersection with REVISION1:(M - 1).
For reverse merges (REVISION1 > REVISION2)
If PRIMARY_URL@REVISION1 exists but PRIMARY_URL@REVISION2 doesn't, then
find the revision 'N' in which PRIMARY_URL@REVISION1 came into existence.
Leave the subset of CHILD->REMAINING_RANGES that intersects with
REVISION2:(N - 1) as-is and set the subset of CHILD->REMAINING_RANGES
that intersects with (N - 1):REVISION1 equal to PARENT->REMAINING_RANGES'
intersection with (N - 1):REVISION1.
If PRIMARY_URL@REVISION1 doesn't exist but PRIMARY_URL@REVISION2 does,
then find the revision 'M' in which PRIMARY_URL@REVISION2 came into
existence. Leave the subset of CHILD->REMAINING_RANGES that intersects with
REVISION2:(M - 1) as-is and set the subset of CHILD->REMAINING_RANGES
that intersects with (M - 1):REVISION1 equal to PARENT->REMAINING_RANGES'
intersection with REVISION1:(M - 1).
SCRATCH_POOL is used for all temporary allocations. Changes to CHILD are
allocated in RESULT_POOL. */
static svn_error_t *
adjust_deleted_subtree_ranges(svn_client__merge_path_t *child,
svn_client__merge_path_t *parent,
svn_revnum_t revision1,
svn_revnum_t revision2,
const char *primary_url,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_boolean_t is_rollback = revision2 < revision1;
svn_revnum_t younger_rev = is_rollback ? revision1 : revision2;
svn_revnum_t peg_rev = younger_rev;
svn_revnum_t older_rev = is_rollback ? revision2 : revision1;
apr_array_header_t *segments;
svn_error_t *err;
SVN_ERR_ASSERT(parent->remaining_ranges);
err = svn_client__repos_location_segments(&segments, ra_session,
primary_url, peg_rev,
younger_rev, older_rev, ctx,
scratch_pool);
if (err)
{
const char *rel_source_path; /* PRIMARY_URL relative to RA_SESSION */
svn_node_kind_t kind;
if (err->apr_err != SVN_ERR_FS_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
/* PRIMARY_URL@peg_rev doesn't exist. Check if PRIMARY_URL@older_rev
exists, if neither exist then the editor can simply ignore this
subtree. */
SVN_ERR(svn_ra_get_path_relative_to_session(
ra_session, &rel_source_path, primary_url, scratch_pool));
SVN_ERR(svn_ra_check_path(ra_session, rel_source_path,
older_rev, &kind, scratch_pool));
if (kind == svn_node_none)
{
/* Neither PRIMARY_URL@peg_rev nor PRIMARY_URL@older_rev exist,
so there is nothing to merge. Set CHILD->REMAINING_RANGES
identical to PARENT's. */
child->remaining_ranges =
svn_rangelist_dup(parent->remaining_ranges, scratch_pool);
}
else
{
svn_rangelist_t *deleted_rangelist;
svn_revnum_t rev_primary_url_deleted;
/* PRIMARY_URL@older_rev exists, so it was deleted at some
revision prior to peg_rev, find that revision. */
SVN_ERR(svn_ra_get_deleted_rev(ra_session, rel_source_path,
older_rev, younger_rev,
&rev_primary_url_deleted,
scratch_pool));
/* PRIMARY_URL@older_rev exists and PRIMARY_URL@peg_rev doesn't,
so svn_ra_get_deleted_rev() should always find the revision
PRIMARY_URL@older_rev was deleted. */
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(rev_primary_url_deleted));
/* If this is a reverse merge reorder CHILD->REMAINING_RANGES and
PARENT->REMAINING_RANGES so both will work with the
svn_rangelist_* APIs below. */
if (is_rollback)
{
/* svn_rangelist_reverse operates in place so it's safe
to use our scratch_pool. */
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
scratch_pool));
SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
scratch_pool));
}
/* Find the intersection of CHILD->REMAINING_RANGES with the
range over which PRIMARY_URL@older_rev exists (ending at
the youngest revision at which it still exists). */
SVN_ERR(rangelist_intersect_range(&child->remaining_ranges,
child->remaining_ranges,
older_rev,
rev_primary_url_deleted - 1,
FALSE,
scratch_pool, scratch_pool));
/* Merge into CHILD->REMAINING_RANGES the intersection of
PARENT->REMAINING_RANGES with the range beginning when
PRIMARY_URL@older_rev was deleted until younger_rev. */
SVN_ERR(rangelist_intersect_range(&deleted_rangelist,
parent->remaining_ranges,
rev_primary_url_deleted - 1,
peg_rev,
FALSE,
scratch_pool, scratch_pool));
SVN_ERR(svn_rangelist_merge2(child->remaining_ranges,
deleted_rangelist, scratch_pool,
scratch_pool));
/* Return CHILD->REMAINING_RANGES and PARENT->REMAINING_RANGES
to reverse order if necessary. */
if (is_rollback)
{
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
scratch_pool));
SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
scratch_pool));
}
}
}
else /* PRIMARY_URL@peg_rev exists. */
{
svn_rangelist_t *non_existent_rangelist;
svn_location_segment_t *segment =
APR_ARRAY_IDX(segments, (segments->nelts - 1),
svn_location_segment_t *);
/* We know PRIMARY_URL@peg_rev exists as the call to
svn_client__repos_location_segments() succeeded. If there is only
one segment that starts at oldest_rev then we know that
PRIMARY_URL@oldest_rev:PRIMARY_URL@peg_rev describes an unbroken
line of history, so there is nothing more to adjust in
CHILD->REMAINING_RANGES. */
if (segment->range_start == older_rev)
{
return SVN_NO_ERROR;
}
/* If this is a reverse merge reorder CHILD->REMAINING_RANGES and
PARENT->REMAINING_RANGES so both will work with the
svn_rangelist_* APIs below. */
if (is_rollback)
{
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
scratch_pool));
SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
scratch_pool));
}
/* Intersect CHILD->REMAINING_RANGES with the range where PRIMARY_URL
exists. Since segment doesn't span older_rev:peg_rev we know
PRIMARY_URL@peg_rev didn't come into existence until
segment->range_start + 1. */
SVN_ERR(rangelist_intersect_range(&child->remaining_ranges,
child->remaining_ranges,
segment->range_start, peg_rev,
FALSE, scratch_pool, scratch_pool));
/* Merge into CHILD->REMAINING_RANGES the intersection of
PARENT->REMAINING_RANGES with the range before PRIMARY_URL@peg_rev
came into existence. */
SVN_ERR(rangelist_intersect_range(&non_existent_rangelist,
parent->remaining_ranges,
older_rev, segment->range_start,
FALSE, scratch_pool, scratch_pool));
SVN_ERR(svn_rangelist_merge2(child->remaining_ranges,
non_existent_rangelist, scratch_pool,
scratch_pool));
/* Return CHILD->REMAINING_RANGES and PARENT->REMAINING_RANGES
to reverse order if necessary. */
if (is_rollback)
{
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
scratch_pool));
SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
scratch_pool));
}
}
/* Make a lasting copy of CHILD->REMAINING_RANGES using POOL. */
child->remaining_ranges = svn_rangelist_dup(child->remaining_ranges,
result_pool);
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge().
SOURCE is cascaded from the argument of the same name in
do_directory_merge(). TARGET is the merge target. RA_SESSION is the
session for the younger of SOURCE->loc1 and SOURCE->loc2.
Adjust the subtrees in CHILDREN_WITH_MERGEINFO so that we don't
later try to describe invalid paths in drive_merge_report_editor().
This function is just a thin wrapper around
adjust_deleted_subtree_ranges(), which see for further details.
SCRATCH_POOL is used for all temporary allocations. Changes to
CHILDREN_WITH_MERGEINFO are allocated in RESULT_POOL.
*/
static svn_error_t *
fix_deleted_subtree_ranges(const merge_source_t *source,
const merge_target_t *target,
svn_ra_session_t *ra_session,
apr_array_header_t *children_with_mergeinfo,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
svn_boolean_t is_rollback = source->loc2->rev < source->loc1->rev;
assert(session_url_is(ra_session,
(is_rollback ? source->loc1 : source->loc2)->url,
scratch_pool));
/* CHILDREN_WITH_MERGEINFO is sorted in depth-first order, so
start at index 1 to examine only subtrees. */
for (i = 1; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
svn_client__merge_path_t *parent;
svn_rangelist_t *deleted_rangelist, *added_rangelist;
SVN_ERR_ASSERT(child);
if (child->absent)
continue;
svn_pool_clear(iterpool);
/* Find CHILD's parent. */
parent = find_nearest_ancestor(children_with_mergeinfo,
FALSE, child->abspath);
/* Since CHILD is a subtree then its parent must be in
CHILDREN_WITH_MERGEINFO, see the global comment
'THE CHILDREN_WITH_MERGEINFO ARRAY'. */
SVN_ERR_ASSERT(parent);
/* If this is a reverse merge reorder CHILD->REMAINING_RANGES
so it will work with the svn_rangelist_diff API. */
if (is_rollback)
{
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges, iterpool));
SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges, iterpool));
}
SVN_ERR(svn_rangelist_diff(&deleted_rangelist, &added_rangelist,
child->remaining_ranges,
parent->remaining_ranges,
TRUE, iterpool));
if (is_rollback)
{
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges, iterpool));
SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges, iterpool));
}
/* If CHILD is the merge target we then know that SOURCE is provided
by normalize_merge_sources() -- see 'MERGEINFO MERGE SOURCE
NORMALIZATION'. Due to this normalization we know that SOURCE
describes an unbroken line of history such that the entire range
described by SOURCE can potentially be merged to CHILD.
But if CHILD is a subtree we don't have the same guarantees about
SOURCE as we do for the merge target. SOURCE->loc1 and/or
SOURCE->loc2 might not exist.
If one or both doesn't exist, then adjust CHILD->REMAINING_RANGES
such that we don't later try to describe invalid subtrees in
drive_merge_report_editor(), as that will break the merge.
If CHILD has the same remaining ranges as PARENT however, then
there is no need to make these adjustments, since
drive_merge_report_editor() won't attempt to describe CHILD in this
case, see the 'Note' in drive_merge_report_editor's docstring. */
if (deleted_rangelist->nelts || added_rangelist->nelts)
{
const char *child_primary_source_url;
const char *child_repos_src_path =
svn_dirent_is_child(target->abspath, child->abspath, iterpool);
/* This loop is only processing subtrees, so CHILD->ABSPATH
better be a proper child of the merge target. */
SVN_ERR_ASSERT(child_repos_src_path);
child_primary_source_url =
svn_path_url_add_component2((source->loc1->rev < source->loc2->rev)
? source->loc2->url : source->loc1->url,
child_repos_src_path, iterpool);
SVN_ERR(adjust_deleted_subtree_ranges(child, parent,
source->loc1->rev,
source->loc2->rev,
child_primary_source_url,
ra_session,
ctx, result_pool, iterpool));
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/*-----------------------------------------------------------------------*/
/*** Determining What Remains To Be Merged ***/
/* Get explicit and/or implicit mergeinfo for the working copy path
TARGET_ABSPATH.
If RECORDED_MERGEINFO is not NULL then set *RECORDED_MERGEINFO
to TARGET_ABSPATH's explicit or inherited mergeinfo as dictated by
INHERIT.
If IMPLICIT_MERGEINFO is not NULL then set *IMPLICIT_MERGEINFO
to TARGET_ABSPATH's implicit mergeinfo (a.k.a. natural history).
If both RECORDED_MERGEINFO and IMPLICIT_MERGEINFO are not NULL and
*RECORDED_MERGEINFO is inherited, then *IMPLICIT_MERGEINFO will be
removed from *RECORDED_MERGEINFO.
If INHERITED is not NULL set *INHERITED to TRUE if *RECORDED_MERGEINFO
is inherited rather than explicit. If RECORDED_MERGEINFO is NULL then
INHERITED is ignored.
If IMPLICIT_MERGEINFO is not NULL then START and END are limits on
the natural history sought, must both be valid revision numbers, and
START must be greater than END. If TARGET_ABSPATH's base revision
is older than START, then the base revision is used as the younger
bound in place of START.
RA_SESSION is an RA session open to the repository in which TARGET_ABSPATH
lives. It may be temporarily reparented as needed by this function.
Allocate *RECORDED_MERGEINFO and *IMPLICIT_MERGEINFO in RESULT_POOL.
Use SCRATCH_POOL for any temporary allocations. */
static svn_error_t *
get_full_mergeinfo(svn_mergeinfo_t *recorded_mergeinfo,
svn_mergeinfo_t *implicit_mergeinfo,
svn_boolean_t *inherited,
svn_mergeinfo_inheritance_t inherit,
svn_ra_session_t *ra_session,
const char *target_abspath,
svn_revnum_t start,
svn_revnum_t end,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* First, we get the real mergeinfo. */
if (recorded_mergeinfo)
{
SVN_ERR(svn_client__get_wc_or_repos_mergeinfo(recorded_mergeinfo,
inherited,
NULL /* from_repos */,
FALSE,
inherit, ra_session,
target_abspath,
ctx, result_pool));
}
if (implicit_mergeinfo)
{
svn_client__pathrev_t *target;
/* Assert that we have sane input. */
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(start) && SVN_IS_VALID_REVNUM(end)
&& (start > end));
/* Retrieve the origin (original_*) of the node, or just the
url if the node was not copied. */
SVN_ERR(svn_client__wc_node_get_origin(&target, target_abspath, ctx,
scratch_pool, scratch_pool));
if (! target)
{
/* We've been asked to operate on a locally added target, so its
* implicit mergeinfo is empty. */
*implicit_mergeinfo = apr_hash_make(result_pool);
}
else if (target->rev <= end)
{
/* We're asking about a range outside our natural history
altogether. That means our implicit mergeinfo is empty. */
*implicit_mergeinfo = apr_hash_make(result_pool);
}
else
{
/* Fetch so-called "implicit mergeinfo" (that is, natural
history). */
/* Do not ask for implicit mergeinfo from TARGET_ABSPATH's future.
TARGET_ABSPATH might not even exist, and even if it does the
working copy is *at* TARGET_REV so its implicit history ends
at TARGET_REV! */
if (target->rev < start)
start = target->rev;
/* Fetch the implicit mergeinfo. */
SVN_ERR(svn_client__get_history_as_mergeinfo(implicit_mergeinfo,
NULL,
target, start, end,
ra_session, ctx,
result_pool));
}
} /*if (implicit_mergeinfo) */
return SVN_NO_ERROR;
}
/* Helper for ensure_implicit_mergeinfo().
PARENT, CHILD, REVISION1, REVISION2 and CTX
are all cascaded from the arguments of the same names in
ensure_implicit_mergeinfo(). PARENT and CHILD must both exist, i.e.
this function should never be called where CHILD is the merge target.
If PARENT->IMPLICIT_MERGEINFO is NULL, obtain it from the server.
Set CHILD->IMPLICIT_MERGEINFO to the mergeinfo inherited from
PARENT->IMPLICIT_MERGEINFO. CHILD->IMPLICIT_MERGEINFO is allocated
in RESULT_POOL.
RA_SESSION is an RA session open to the repository that contains CHILD.
It may be temporarily reparented by this function.
*/
static svn_error_t *
inherit_implicit_mergeinfo_from_parent(svn_client__merge_path_t *parent,
svn_client__merge_path_t *child,
svn_revnum_t revision1,
svn_revnum_t revision2,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *path_diff;
/* This only works on subtrees! */
SVN_ERR_ASSERT(parent);
SVN_ERR_ASSERT(child);
/* While PARENT must exist, it is possible we've deferred
getting its implicit mergeinfo. If so get it now. */
if (!parent->implicit_mergeinfo)
SVN_ERR(get_full_mergeinfo(NULL, &(parent->implicit_mergeinfo),
NULL, svn_mergeinfo_inherited,
ra_session, child->abspath,
MAX(revision1, revision2),
MIN(revision1, revision2),
ctx, result_pool, scratch_pool));
/* Let CHILD inherit PARENT's implicit mergeinfo. */
path_diff = svn_dirent_is_child(parent->abspath, child->abspath,
scratch_pool);
/* PARENT->PATH better be an ancestor of CHILD->ABSPATH! */
SVN_ERR_ASSERT(path_diff);
SVN_ERR(svn_mergeinfo__add_suffix_to_mergeinfo(
&child->implicit_mergeinfo, parent->implicit_mergeinfo,
path_diff, result_pool, scratch_pool));
child->implicit_mergeinfo = svn_mergeinfo_dup(child->implicit_mergeinfo,
result_pool);
return SVN_NO_ERROR;
}
/* Helper of filter_merged_revisions().
If we have deferred obtaining CHILD->IMPLICIT_MERGEINFO, then get
it now, allocating it in RESULT_POOL. If CHILD_INHERITS_PARENT is true
then set CHILD->IMPLICIT_MERGEINFO to the mergeinfo inherited from
PARENT->IMPLICIT_MERGEINFO, otherwise contact the repository. Use
SCRATCH_POOL for all temporary allocations.
RA_SESSION is an RA session open to the repository that contains CHILD.
It may be temporarily reparented by this function.
PARENT, CHILD, REVISION1, REVISION2 and
CTX are all cascaded from the arguments of the same name in
filter_merged_revisions() and the same conditions for that function
hold here. */
static svn_error_t *
ensure_implicit_mergeinfo(svn_client__merge_path_t *parent,
svn_client__merge_path_t *child,
svn_boolean_t child_inherits_parent,
svn_revnum_t revision1,
svn_revnum_t revision2,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* If we haven't already found CHILD->IMPLICIT_MERGEINFO then
contact the server to get it. */
if (child->implicit_mergeinfo)
return SVN_NO_ERROR;
if (child_inherits_parent)
SVN_ERR(inherit_implicit_mergeinfo_from_parent(parent,
child,
revision1,
revision2,
ra_session,
ctx,
result_pool,
scratch_pool));
else
SVN_ERR(get_full_mergeinfo(NULL,
&(child->implicit_mergeinfo),
NULL, svn_mergeinfo_inherited,
ra_session, child->abspath,
MAX(revision1, revision2),
MIN(revision1, revision2),
ctx, result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Helper for calculate_remaining_ranges().
Initialize CHILD->REMAINING_RANGES to a rangelist representing the
requested merge of REVISION1:REVISION2 from MERGEINFO_PATH to
CHILD->ABSPATH.
For forward merges remove any ranges from CHILD->REMAINING_RANGES that
have already been merged to CHILD->ABSPATH per TARGET_MERGEINFO or
CHILD->IMPLICIT_MERGEINFO. For reverse merges remove any ranges from
CHILD->REMAINING_RANGES that have not already been merged to CHILD->ABSPATH
per TARGET_MERGEINFO or CHILD->IMPLICIT_MERGEINFO. If we have deferred
obtaining CHILD->IMPLICIT_MERGEINFO and it is necessary to use it for
these calculations, then get it from the server, allocating it in
RESULT_POOL.
CHILD represents a working copy path which is the merge target or one of
the target's subtrees. If not NULL, PARENT is CHILD's nearest path-wise
ancestor - see 'THE CHILDREN_WITH_MERGEINFO ARRAY'.
If the function needs to consider CHILD->IMPLICIT_MERGEINFO and
CHILD_INHERITS_IMPLICIT is true, then set CHILD->IMPLICIT_MERGEINFO to the
mergeinfo inherited from PARENT->IMPLICIT_MERGEINFO. Otherwise contact
the repository for CHILD->IMPLICIT_MERGEINFO.
NOTE: If PARENT is present then this function must have previously been
called for PARENT, i.e. if populate_remaining_ranges() is calling this
function for a set of svn_client__merge_path_t* the calls must be made
in depth-first order.
MERGEINFO_PATH is the merge source relative to the repository root.
REVISION1 and REVISION2 describe the merge range requested from
MERGEINFO_PATH.
TARGET_RANGELIST is the portion of CHILD->ABSPATH's explicit or inherited
mergeinfo that intersects with the merge history described by
MERGEINFO_PATH@REVISION1:MERGEINFO_PATH@REVISION2. TARGET_RANGELIST
should be NULL if there is no explicit or inherited mergeinfo on
CHILD->ABSPATH or an empty list if CHILD->ABSPATH has empty mergeinfo or
explicit mergeinfo that exclusively describes non-intersecting history
with MERGEINFO_PATH@REVISION1:MERGEINFO_PATH@REVISION2.
SCRATCH_POOL is used for all temporary allocations.
NOTE: This should only be called when honoring mergeinfo.
NOTE: Like calculate_remaining_ranges() if PARENT is present then this
function must have previously been called for PARENT.
*/
static svn_error_t *
filter_merged_revisions(svn_client__merge_path_t *parent,
svn_client__merge_path_t *child,
const char *mergeinfo_path,
svn_rangelist_t *target_rangelist,
svn_revnum_t revision1,
svn_revnum_t revision2,
svn_boolean_t child_inherits_implicit,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_rangelist_t *requested_rangelist,
*target_implicit_rangelist, *explicit_rangelist;
/* Convert REVISION1 and REVISION2 to a rangelist.
Note: Talking about a requested merge range's inheritability
doesn't make much sense, but as we are using svn_merge_range_t
to describe it we need to pick *something*. Since all the
rangelist manipulations in this function either don't consider
inheritance by default or we are requesting that they don't (i.e.
svn_rangelist_remove and svn_rangelist_intersect) then we could
set the inheritability as FALSE, it won't matter either way. */
requested_rangelist = svn_rangelist__initialize(revision1, revision2,
TRUE, scratch_pool);
/* Now filter out revisions that have already been merged to CHILD. */
if (revision1 > revision2) /* This is a reverse merge. */
{
svn_rangelist_t *added_rangelist, *deleted_rangelist;
/* The revert range and will need to be reversed for
our svn_rangelist_* APIs to work properly. */
SVN_ERR(svn_rangelist_reverse(requested_rangelist, scratch_pool));
/* Set EXPLICIT_RANGELIST to the list of source-range revs that are
already recorded as merged to target. */
if (target_rangelist)
{
/* Return the intersection of the revs which are both already
represented by CHILD's explicit or inherited mergeinfo.
We don't consider inheritance when determining intersecting
ranges. If we *did* consider inheritance, then our calculation
would be wrong. For example, if the CHILD->REMAINING_RANGES is
5:3 and TARGET_RANGELIST is r5* (non-inheritable) then the
intersection would be r4. And that would be wrong as we clearly
want to reverse merge both r4 and r5 in this case. Ignoring the
ranges' inheritance results in an intersection of r4-5.
You might be wondering about CHILD's children, doesn't the above
imply that we will reverse merge r4-5 from them? Nope, this is
safe to do because any path whose parent has non-inheritable
ranges is always considered a subtree with differing mergeinfo
even if that path has no explicit mergeinfo prior to the
merge -- See condition 3 in the doc string for
merge.c:get_mergeinfo_paths(). */
SVN_ERR(svn_rangelist_intersect(&explicit_rangelist,
target_rangelist,
requested_rangelist,
FALSE, scratch_pool));
}
else
{
explicit_rangelist =
apr_array_make(result_pool, 0, sizeof(svn_merge_range_t *));
}
/* Was any part of the requested reverse merge not accounted for in
CHILD's explicit or inherited mergeinfo? */
SVN_ERR(svn_rangelist_diff(&deleted_rangelist, &added_rangelist,
requested_rangelist, explicit_rangelist,
FALSE, scratch_pool));
if (deleted_rangelist->nelts == 0)
{
/* The whole of REVISION1:REVISION2 was represented in CHILD's
explicit/inherited mergeinfo, allocate CHILD's remaining
ranges in POOL and then we are done. */
SVN_ERR(svn_rangelist_reverse(requested_rangelist, scratch_pool));
child->remaining_ranges = svn_rangelist_dup(requested_rangelist,
result_pool);
}
else /* We need to check CHILD's implicit mergeinfo. */
{
svn_rangelist_t *implicit_rangelist;
SVN_ERR(ensure_implicit_mergeinfo(parent,
child,
child_inherits_implicit,
revision1,
revision2,
ra_session,
ctx,
result_pool,
scratch_pool));
target_implicit_rangelist = svn_hash_gets(child->implicit_mergeinfo,
mergeinfo_path);
if (target_implicit_rangelist)
SVN_ERR(svn_rangelist_intersect(&implicit_rangelist,
target_implicit_rangelist,
requested_rangelist,
FALSE, scratch_pool));
else
implicit_rangelist = apr_array_make(scratch_pool, 0,
sizeof(svn_merge_range_t *));
SVN_ERR(svn_rangelist_merge2(implicit_rangelist,
explicit_rangelist, scratch_pool,
scratch_pool));
SVN_ERR(svn_rangelist_reverse(implicit_rangelist, scratch_pool));
child->remaining_ranges = svn_rangelist_dup(implicit_rangelist,
result_pool);
}
}
else /* This is a forward merge */
{
/* Set EXPLICIT_RANGELIST to the list of source-range revs that are
NOT already recorded as merged to target. */
if (target_rangelist)
{
/* See earlier comment preceding svn_rangelist_intersect() for
why we don't consider inheritance here. */
SVN_ERR(svn_rangelist_remove(&explicit_rangelist,
target_rangelist,
requested_rangelist, FALSE,
scratch_pool));
}
else
{
explicit_rangelist = svn_rangelist_dup(requested_rangelist,
scratch_pool);
}
if (explicit_rangelist->nelts == 0)
{
child->remaining_ranges =
apr_array_make(result_pool, 0, sizeof(svn_merge_range_t *));
}
else
/* ### TODO: Which evil shall we choose?
###
### If we allow all forward-merges not already found in recorded
### mergeinfo, we destroy the ability to, say, merge the whole of a
### branch to the trunk while automatically ignoring the revisions
### common to both. That's bad.
###
### If we allow only forward-merges not found in either recorded
### mergeinfo or implicit mergeinfo (natural history), then the
### previous scenario works great, but we can't reverse-merge a
### previous change made to our line of history and then remake it
### (because the reverse-merge will leave no mergeinfo trace, and
### the remake-it attempt will still find the original change in
### natural mergeinfo. But you know, that we happen to use 'merge'
### for revision undoing is somewhat unnatural anyway, so I'm
### finding myself having little interest in caring too much about
### this. That said, if we had a way of storing reverse merge
### ranges, we'd be in good shape either way.
*/
#ifdef SVN_MERGE__ALLOW_ALL_FORWARD_MERGES_FROM_SELF
{
/* ### Don't consider implicit mergeinfo. */
child->remaining_ranges = svn_rangelist_dup(explicit_rangelist,
pool);
}
#else
{
/* Based on CHILD's TARGET_MERGEINFO there are ranges to merge.
Check CHILD's implicit mergeinfo to see if these remaining
ranges are represented there. */
SVN_ERR(ensure_implicit_mergeinfo(parent,
child,
child_inherits_implicit,
revision1,
revision2,
ra_session,
ctx,
result_pool,
scratch_pool));
target_implicit_rangelist = svn_hash_gets(child->implicit_mergeinfo,
mergeinfo_path);
if (target_implicit_rangelist)
SVN_ERR(svn_rangelist_remove(&(child->remaining_ranges),
target_implicit_rangelist,
explicit_rangelist,
FALSE, result_pool));
else
child->remaining_ranges = svn_rangelist_dup(explicit_rangelist,
result_pool);
}
#endif
}
return SVN_NO_ERROR;
}
/* Helper for do_file_merge and do_directory_merge (by way of
populate_remaining_ranges() for the latter).
Determine what portions of SOURCE have already
been merged to CHILD->ABSPATH and populate CHILD->REMAINING_RANGES with
the ranges that still need merging.
SOURCE and CTX are all cascaded from the caller's arguments of the same
names. Note that this means SOURCE adheres to the requirements noted in
`MERGEINFO MERGE SOURCE NORMALIZATION'.
CHILD represents a working copy path which is the merge target or one of
the target's subtrees. If not NULL, PARENT is CHILD's nearest path-wise
ancestor - see 'THE CHILDREN_WITH_MERGEINFO ARRAY'. TARGET_MERGEINFO is
the working mergeinfo on CHILD.
RA_SESSION is the session for the younger of SOURCE->loc1 and
SOURCE->loc2.
If the function needs to consider CHILD->IMPLICIT_MERGEINFO and
CHILD_INHERITS_IMPLICIT is true, then set CHILD->IMPLICIT_MERGEINFO to the
mergeinfo inherited from PARENT->IMPLICIT_MERGEINFO. Otherwise contact
the repository for CHILD->IMPLICIT_MERGEINFO.
If not null, IMPLICIT_SRC_GAP is the gap, if any, in the natural history
of SOURCE, see merge_cmd_baton_t.implicit_src_gap.
SCRATCH_POOL is used for all temporary allocations. Changes to CHILD and
PARENT are made in RESULT_POOL.
NOTE: This should only be called when honoring mergeinfo.
NOTE: If PARENT is present then this function must have previously been
called for PARENT, i.e. if populate_remaining_ranges() is calling this
function for a set of svn_client__merge_path_t* the calls must be made
in depth-first order.
NOTE: When performing reverse merges, return
SVN_ERR_CLIENT_NOT_READY_TO_MERGE if both locations in SOURCE and
CHILD->ABSPATH are all on the same line of history but CHILD->ABSPATH's
base revision is older than the SOURCE->rev1:rev2 range, see comment re
issue #2973 below.
*/
static svn_error_t *
calculate_remaining_ranges(svn_client__merge_path_t *parent,
svn_client__merge_path_t *child,
const merge_source_t *source,
svn_mergeinfo_t target_mergeinfo,
const apr_array_header_t *implicit_src_gap,
svn_boolean_t child_inherits_implicit,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const svn_client__pathrev_t *primary_src
= (source->loc1->rev < source->loc2->rev) ? source->loc2 : source->loc1;
const char *mergeinfo_path = svn_client__pathrev_fspath(primary_src,
scratch_pool);
/* Intersection of TARGET_MERGEINFO and the merge history
described by SOURCE. */
svn_rangelist_t *target_rangelist;
svn_revnum_t child_base_revision;
/* Since this function should only be called when honoring mergeinfo and
* SOURCE adheres to the requirements noted in 'MERGEINFO MERGE SOURCE
* NORMALIZATION', SOURCE must be 'ancestral'. */
SVN_ERR_ASSERT(source->ancestral);
/* Determine which of the requested ranges to consider merging... */
/* Set TARGET_RANGELIST to the portion of TARGET_MERGEINFO that refers
to SOURCE (excluding any gap in SOURCE): first get all ranges from
TARGET_MERGEINFO that refer to the path of SOURCE, and then prune
any ranges that lie in the gap in SOURCE.
### [JAF] In fact, that may still leave some ranges that lie entirely
outside the range of SOURCE; it seems we don't care about that. */
if (target_mergeinfo)
target_rangelist = svn_hash_gets(target_mergeinfo, mergeinfo_path);
else
target_rangelist = NULL;
if (implicit_src_gap && target_rangelist)
{
/* Remove any mergeinfo referring to the 'gap' in SOURCE, as that
mergeinfo doesn't really refer to SOURCE at all but instead
refers to locations that are non-existent or on a different
line of history. (Issue #3242.) */
SVN_ERR(svn_rangelist_remove(&target_rangelist,
implicit_src_gap, target_rangelist,
FALSE, result_pool));
}
/* Initialize CHILD->REMAINING_RANGES and filter out revisions already
merged (or, in the case of reverse merges, ranges not yet merged). */
SVN_ERR(filter_merged_revisions(parent, child, mergeinfo_path,
target_rangelist,
source->loc1->rev, source->loc2->rev,
child_inherits_implicit,
ra_session, ctx, result_pool,
scratch_pool));
/* Issue #2973 -- from the continuing series of "Why, since the advent of
merge tracking, allowing merges into mixed rev and locally modified
working copies isn't simple and could be considered downright evil".
If reverse merging a range to the WC path represented by CHILD, from
that path's own history, where the path inherits no locally modified
mergeinfo from its WC parents (i.e. there is no uncommitted merge to
the WC), and the path's base revision is older than the range, then
the merge will always be a no-op. This is because we only allow reverse
merges of ranges in the path's explicit or natural mergeinfo and a
reverse merge from the path's future history obviously isn't going to be
in either, hence the no-op.
The problem is two-fold. First, in a mixed rev WC, the change we
want to revert might actually be to some child of the target path
which is at a younger base revision. Sure, we can merge directly
to that child or update the WC or even use --ignore-ancestry and then
successfully run the reverse merge, but that gets to the second
problem: Those courses of action are not very obvious. Before 1.5 if
a user committed a change that didn't touch the commit target, then
immediately decided to revert that change via a reverse merge it would
just DTRT. But with the advent of merge tracking the user gets a no-op.
So in the name of user friendliness, return an error suggesting a helpful
course of action.
*/
SVN_ERR(svn_wc__node_get_base(NULL, &child_base_revision,
NULL, NULL, NULL, NULL,
ctx->wc_ctx, child->abspath,
TRUE /* ignore_enoent */,
scratch_pool, scratch_pool));
/* If CHILD has no base revision then it hasn't been committed yet, so it
can't have any "future" history. */
if (SVN_IS_VALID_REVNUM(child_base_revision)
&& ((child->remaining_ranges)->nelts == 0) /* Inoperative merge */
&& (source->loc2->rev < source->loc1->rev) /* Reverse merge */
&& (child_base_revision <= source->loc2->rev)) /* From CHILD's future */
{
/* Hmmm, an inoperative reverse merge from the "future". If it is
from our own future return a helpful error. */
svn_error_t *err;
svn_client__pathrev_t *start_loc;
err = svn_client__repos_location(&start_loc,
ra_session,
source->loc1,
child_base_revision,
ctx, scratch_pool, scratch_pool);
if (err)
{
if (err->apr_err == SVN_ERR_FS_NOT_FOUND
|| err->apr_err == SVN_ERR_CLIENT_UNRELATED_RESOURCES)
svn_error_clear(err);
else
return svn_error_trace(err);
}
else
{
const char *url;
SVN_ERR(svn_wc__node_get_url(&url, ctx->wc_ctx, child->abspath,
scratch_pool, scratch_pool));
if (strcmp(start_loc->url, url) == 0)
return svn_error_create(SVN_ERR_CLIENT_MERGE_UPDATE_REQUIRED, NULL,
_("Cannot reverse-merge a range from a "
"path's own future history; try "
"updating first"));
}
}
return SVN_NO_ERROR;
}
/* Helper for populate_remaining_ranges().
SOURCE is cascaded from the arguments of the same name in
populate_remaining_ranges().
Note: The following comments assume a forward merge, i.e.
SOURCE->loc1->rev < SOURCE->loc2->rev. If this is a reverse merge then
all the following comments still apply, but with SOURCE->loc1 switched
with SOURCE->loc2.
Like populate_remaining_ranges(), SOURCE must adhere to the restrictions
documented in 'MERGEINFO MERGE SOURCE NORMALIZATION'. These restrictions
allow for a *single* gap in SOURCE, GAP_REV1:GAP_REV2 exclusive:inclusive
(where SOURCE->loc1->rev == GAP_REV1 <= GAP_REV2 < SOURCE->loc2->rev),
if SOURCE->loc2->url@(GAP_REV2+1) was copied from SOURCE->loc1. If such
a gap exists, set *GAP_START and *GAP_END to the starting and ending
revisions of the gap. Otherwise set both to SVN_INVALID_REVNUM.
For example, if the natural history of URL@2:URL@9 is 'trunk/:2,7-9' this
would indicate that trunk@7 was copied from trunk@2. This function would
return GAP_START:GAP_END of 2:6 in this case. Note that a path 'trunk'
might exist at r3-6, but it would not be on the same line of history as
trunk@9.
### GAP_START is basically redundant, as (if there is a gap at all) it is
necessarily the older revision of SOURCE.
RA_SESSION is an open RA session to the repository in which SOURCE lives.
*/
static svn_error_t *
find_gaps_in_merge_source_history(svn_revnum_t *gap_start,
svn_revnum_t *gap_end,
const merge_source_t *source,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
svn_mergeinfo_t implicit_src_mergeinfo;
svn_revnum_t old_rev = MIN(source->loc1->rev, source->loc2->rev);
const svn_client__pathrev_t *primary_src
= (source->loc1->rev < source->loc2->rev) ? source->loc2 : source->loc1;
const char *merge_src_fspath = svn_client__pathrev_fspath(primary_src,
scratch_pool);
svn_rangelist_t *rangelist;
SVN_ERR_ASSERT(source->ancestral);
/* Start by assuming there is no gap. */
*gap_start = *gap_end = SVN_INVALID_REVNUM;
/* Easy out: There can't be a gap between adjacent revisions. */
if (labs(source->loc1->rev - source->loc2->rev) == 1)
return SVN_NO_ERROR;
/* Get SOURCE as mergeinfo. */
SVN_ERR(svn_client__get_history_as_mergeinfo(&implicit_src_mergeinfo, NULL,
primary_src,
primary_src->rev, old_rev,
ra_session,
ctx, scratch_pool));
rangelist = svn_hash_gets(implicit_src_mergeinfo, merge_src_fspath);
if (!rangelist) /* ### Can we ever not find a rangelist? */
return SVN_NO_ERROR;
/* A gap in natural history can result from either a copy or
a rename. If from a copy then history as mergeinfo will look
something like this:
'/trunk:X,Y-Z'
If from a rename it will look like this:
'/trunk_old_name:X'
'/trunk_new_name:Y-Z'
In both cases the gap, if it exists, is M-N, where M = X + 1 and
N = Y - 1.
Note that per the rules of 'MERGEINFO MERGE SOURCE NORMALIZATION' we
should never have multiple gaps, e.g. if we see anything like the
following then something is quite wrong:
'/trunk_old_name:A,B-C'
'/trunk_new_name:D-E'
*/
if (rangelist->nelts > 1) /* Copy */
{
const svn_merge_range_t *gap;
/* As mentioned above, multiple gaps *shouldn't* be possible. */
SVN_ERR_ASSERT(apr_hash_count(implicit_src_mergeinfo) == 1);
gap = APR_ARRAY_IDX(rangelist, rangelist->nelts - 1,
const svn_merge_range_t *);
*gap_start = MIN(source->loc1->rev, source->loc2->rev);
*gap_end = gap->start;
/* ### Issue #4132:
### This assertion triggers in merge_tests.py svnmucc_abuse_1()
### when a node is replaced by an older copy of itself.
BH: I think we should review this and the 'rename' case to find
out which behavior we really want, and if we can really
determine what happened this way. */
SVN_ERR_ASSERT(*gap_start < *gap_end);
}
else if (apr_hash_count(implicit_src_mergeinfo) > 1) /* Rename */
{
svn_rangelist_t *requested_rangelist =
svn_rangelist__initialize(MIN(source->loc1->rev, source->loc2->rev),
MAX(source->loc1->rev, source->loc2->rev),
TRUE, scratch_pool);
svn_rangelist_t *implicit_rangelist =
apr_array_make(scratch_pool, 2, sizeof(svn_merge_range_t *));
svn_rangelist_t *gap_rangelist;
SVN_ERR(svn_rangelist__merge_many(implicit_rangelist,
implicit_src_mergeinfo,
scratch_pool, scratch_pool));
SVN_ERR(svn_rangelist_remove(&gap_rangelist, implicit_rangelist,
requested_rangelist, FALSE,
scratch_pool));
/* If there is anything left it is the gap. */
if (gap_rangelist->nelts)
{
svn_merge_range_t *gap_range =
APR_ARRAY_IDX(gap_rangelist, 0, svn_merge_range_t *);
*gap_start = gap_range->start;
*gap_end = gap_range->end;
}
}
SVN_ERR_ASSERT(*gap_start == MIN(source->loc1->rev, source->loc2->rev)
|| (*gap_start == SVN_INVALID_REVNUM
&& *gap_end == SVN_INVALID_REVNUM));
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge().
For each (svn_client__merge_path_t *) child in CHILDREN_WITH_MERGEINFO,
populate that child's 'remaining_ranges' list with (### ... what?),
and populate that child's 'implicit_mergeinfo' with its implicit
mergeinfo (natural history). CHILDREN_WITH_MERGEINFO is expected
to be sorted in depth first order and each child must be processed in
that order. The inheritability of all calculated ranges is TRUE.
If mergeinfo is being honored (based on MERGE_B -- see HONOR_MERGEINFO()
for how this is determined), this function will actually try to be
intelligent about populating remaining_ranges list. Otherwise, it
will claim that each child has a single remaining range, from
SOURCE->rev1, to SOURCE->rev2.
### We also take the short-cut if doing record-only. Why?
SCRATCH_POOL is used for all temporary allocations. Changes to
CHILDREN_WITH_MERGEINFO are made in RESULT_POOL.
Note that if SOURCE->rev1 > SOURCE->rev2, then each child's remaining_ranges
member does not adhere to the API rules for rangelists described in
svn_mergeinfo.h -- See svn_client__merge_path_t.
See `MERGEINFO MERGE SOURCE NORMALIZATION' for more requirements
around SOURCE.
*/
static svn_error_t *
populate_remaining_ranges(apr_array_header_t *children_with_mergeinfo,
const merge_source_t *source,
svn_ra_session_t *ra_session,
merge_cmd_baton_t *merge_b,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
svn_revnum_t gap_start, gap_end;
/* If we aren't honoring mergeinfo or this is a --record-only merge,
we'll make quick work of this by simply adding dummy SOURCE->rev1:rev2
ranges for all children. */
if (! HONOR_MERGEINFO(merge_b) || merge_b->record_only)
{
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
svn_pool_clear(iterpool);
/* Issue #3646 'record-only merges create self-referential
mergeinfo'. Get the merge target's implicit mergeinfo (natural
history). We'll use it later to avoid setting self-referential
mergeinfo -- see filter_natural_history_from_mergeinfo(). */
if (i == 0) /* First item is always the merge target. */
{
SVN_ERR(get_full_mergeinfo(NULL, /* child->pre_merge_mergeinfo */
&(child->implicit_mergeinfo),
NULL, /* child->inherited_mergeinfo */
svn_mergeinfo_inherited, ra_session,
child->abspath,
MAX(source->loc1->rev,
source->loc2->rev),
MIN(source->loc1->rev,
source->loc2->rev),
merge_b->ctx, result_pool,
iterpool));
}
else
{
/* Issue #3443 - Subtrees of the merge target can inherit
their parent's implicit mergeinfo in most cases. */
svn_client__merge_path_t *parent
= find_nearest_ancestor(children_with_mergeinfo,
FALSE, child->abspath);
svn_boolean_t child_inherits_implicit;
/* If CHILD is a subtree then its parent must be in
CHILDREN_WITH_MERGEINFO, see the global comment
'THE CHILDREN_WITH_MERGEINFO ARRAY'. */
SVN_ERR_ASSERT(parent);
child_inherits_implicit = (parent && !child->switched);
SVN_ERR(ensure_implicit_mergeinfo(parent, child,
child_inherits_implicit,
source->loc1->rev,
source->loc2->rev,
ra_session, merge_b->ctx,
result_pool, iterpool));
}
child->remaining_ranges = svn_rangelist__initialize(source->loc1->rev,
source->loc2->rev,
TRUE,
result_pool);
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* If, in the merge source's history, there was a copy from an older
revision, then SOURCE->loc2->url won't exist at some range M:N, where
SOURCE->loc1->rev < M < N < SOURCE->loc2->rev. The rules of 'MERGEINFO
MERGE SOURCE NORMALIZATION' allow this, but we must ignore these gaps
when calculating what ranges remain to be merged from SOURCE. If we
don't and try to merge any part of SOURCE->loc2->url@M:N we would
break the editor since no part of that actually exists. See
http://svn.haxx.se/dev/archive-2008-11/0618.shtml.
Find the gaps in the merge target's history, if any. Eventually
we will adjust CHILD->REMAINING_RANGES such that we don't describe
non-existent paths to the editor. */
SVN_ERR(find_gaps_in_merge_source_history(&gap_start, &gap_end,
source,
ra_session, merge_b->ctx,
iterpool));
/* Stash any gap in the merge command baton, we'll need it later when
recording mergeinfo describing this merge. */
if (SVN_IS_VALID_REVNUM(gap_start) && SVN_IS_VALID_REVNUM(gap_end))
merge_b->implicit_src_gap = svn_rangelist__initialize(gap_start, gap_end,
TRUE, result_pool);
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
const char *child_repos_path
= svn_dirent_skip_ancestor(merge_b->target->abspath, child->abspath);
merge_source_t child_source;
svn_client__merge_path_t *parent = NULL;
svn_boolean_t child_inherits_implicit;
svn_pool_clear(iterpool);
/* If the path is absent don't do subtree merge either. */
SVN_ERR_ASSERT(child);
if (child->absent)
continue;
SVN_ERR_ASSERT(child_repos_path != NULL);
child_source.loc1 = svn_client__pathrev_join_relpath(
source->loc1, child_repos_path, iterpool);
child_source.loc2 = svn_client__pathrev_join_relpath(
source->loc2, child_repos_path, iterpool);
/* ### Is the child 'ancestral' over the same revision range? It's
* not necessarily true that a child is 'ancestral' if the parent is,
* nor that it's not if the parent is not. However, here we claim
* that it is. Before we had this 'ancestral' field that we need to
* set explicitly, the claim was implicit. Either way, the impact is
* that we might pass calculate_remaining_ranges() a source that is
* not in fact 'ancestral' (despite its 'ancestral' field being true),
* contrary to its doc-string. */
child_source.ancestral = source->ancestral;
/* Get the explicit/inherited mergeinfo for CHILD. If CHILD is the
merge target then also get its implicit mergeinfo. Otherwise defer
this until we know it is absolutely necessary, since it requires an
expensive round trip communication with the server. */
SVN_ERR(get_full_mergeinfo(
child->pre_merge_mergeinfo ? NULL : &(child->pre_merge_mergeinfo),
/* Get implicit only for merge target. */
(i == 0) ? &(child->implicit_mergeinfo) : NULL,
&(child->inherited_mergeinfo),
svn_mergeinfo_inherited, ra_session,
child->abspath,
MAX(source->loc1->rev, source->loc2->rev),
MIN(source->loc1->rev, source->loc2->rev),
merge_b->ctx, result_pool, iterpool));
/* If CHILD isn't the merge target find its parent. */
if (i > 0)
{
parent = find_nearest_ancestor(children_with_mergeinfo,
FALSE, child->abspath);
/* If CHILD is a subtree then its parent must be in
CHILDREN_WITH_MERGEINFO, see the global comment
'THE CHILDREN_WITH_MERGEINFO ARRAY'. */
SVN_ERR_ASSERT(parent);
}
/* Issue #3443 - Can CHILD inherit PARENT's implicit mergeinfo, saving
us from having to ask the repos? The only time we can't do this is if
CHILD is the merge target and so there is no PARENT to inherit from
or if CHILD is the root of a switched subtree, in which case PARENT
exists but is not CHILD's repository parent. */
child_inherits_implicit = (parent && !child->switched);
SVN_ERR(calculate_remaining_ranges(parent, child,
&child_source,
child->pre_merge_mergeinfo,
merge_b->implicit_src_gap,
child_inherits_implicit,
ra_session,
merge_b->ctx, result_pool,
iterpool));
/* Deal with any gap in SOURCE's natural history.
If the gap is a proper subset of CHILD->REMAINING_RANGES then we can
safely ignore it since we won't describe this path/rev pair.
If the gap exactly matches or is a superset of a range in
CHILD->REMAINING_RANGES then we must remove that range so we don't
attempt to describe non-existent paths via the reporter, this will
break the editor and our merge.
If the gap adjoins or overlaps a range in CHILD->REMAINING_RANGES
then we must *add* the gap so we span the missing revisions. */
if (child->remaining_ranges->nelts
&& merge_b->implicit_src_gap)
{
int j;
svn_boolean_t proper_subset = FALSE;
svn_boolean_t overlaps_or_adjoins = FALSE;
/* If this is a reverse merge reorder CHILD->REMAINING_RANGES
so it will work with the svn_rangelist_* APIs below. */
if (source->loc1->rev > source->loc2->rev)
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges, iterpool));
for (j = 0; j < child->remaining_ranges->nelts; j++)
{
svn_merge_range_t *range
= APR_ARRAY_IDX(child->remaining_ranges, j, svn_merge_range_t *);
if ((range->start <= gap_start && gap_end < range->end)
|| (range->start < gap_start && gap_end <= range->end))
{
proper_subset = TRUE;
break;
}
else if ((gap_start == range->start) && (range->end == gap_end))
{
break;
}
else if (gap_start <= range->end && range->start <= gap_end)
/* intersect */
{
overlaps_or_adjoins = TRUE;
break;
}
}
if (!proper_subset)
{
/* We need to make adjustments. Remove from, or add the gap
to, CHILD->REMAINING_RANGES as appropriate. */
if (overlaps_or_adjoins)
SVN_ERR(svn_rangelist_merge2(child->remaining_ranges,
merge_b->implicit_src_gap,
result_pool, iterpool));
else /* equals == TRUE */
SVN_ERR(svn_rangelist_remove(&(child->remaining_ranges),
merge_b->implicit_src_gap,
child->remaining_ranges, FALSE,
result_pool));
}
if (source->loc1->rev > source->loc2->rev) /* Reverse merge */
SVN_ERR(svn_rangelist_reverse(child->remaining_ranges, iterpool));
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/*-----------------------------------------------------------------------*/
/*** Other Helper Functions ***/
/* Calculate the new mergeinfo for the target tree rooted at TARGET_ABSPATH
based on MERGES (a mapping of absolute WC paths to rangelists representing
a merge from the source SOURCE_FSPATH).
If RESULT_CATALOG is NULL, then record the new mergeinfo in the WC (at,
and possibly below, TARGET_ABSPATH).
If RESULT_CATALOG is not NULL, then don't record the new mergeinfo on the
WC, but instead record it in RESULT_CATALOG, where the keys are absolute
working copy paths and the values are the new mergeinfos for each.
Allocate additions to RESULT_CATALOG in pool which RESULT_CATALOG was
created in. */
static svn_error_t *
update_wc_mergeinfo(svn_mergeinfo_catalog_t result_catalog,
const char *target_abspath,
const char *source_fspath,
apr_hash_t *merges,
svn_boolean_t is_rollback,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_index_t *hi;
/* Combine the mergeinfo for the revision range just merged into
the WC with its on-disk mergeinfo. */
for (hi = apr_hash_first(scratch_pool, merges); hi; hi = apr_hash_next(hi))
{
const char *local_abspath = apr_hash_this_key(hi);
svn_rangelist_t *ranges = apr_hash_this_val(hi);
svn_rangelist_t *rangelist;
svn_error_t *err;
const char *local_abspath_rel_to_target;
const char *fspath;
svn_mergeinfo_t mergeinfo;
svn_pool_clear(iterpool);
/* As some of the merges may've changed the WC's mergeinfo, get
a fresh copy before using it to update the WC's mergeinfo. */
err = svn_client__parse_mergeinfo(&mergeinfo, ctx->wc_ctx,
local_abspath, iterpool, iterpool);
/* If a directory PATH was skipped because it is missing or was
obstructed by an unversioned item then there's nothing we can
do with that, so skip it. */
if (err)
{
if (err->apr_err == SVN_ERR_WC_NOT_LOCKED
|| err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
{
svn_error_clear(err);
continue;
}
else
{
return svn_error_trace(err);
}
}
/* If we are attempting to set empty revision range override mergeinfo
on a path with no explicit mergeinfo, we first need the
mergeinfo that path inherits. */
if (mergeinfo == NULL && ranges->nelts == 0)
{
SVN_ERR(svn_client__get_wc_mergeinfo(&mergeinfo, NULL,
svn_mergeinfo_nearest_ancestor,
local_abspath, NULL, NULL,
FALSE, ctx, iterpool, iterpool));
}
if (mergeinfo == NULL)
mergeinfo = apr_hash_make(iterpool);
local_abspath_rel_to_target = svn_dirent_skip_ancestor(target_abspath,
local_abspath);
SVN_ERR_ASSERT(local_abspath_rel_to_target != NULL);
fspath = svn_fspath__join(source_fspath,
local_abspath_rel_to_target,
iterpool);
rangelist = svn_hash_gets(mergeinfo, fspath);
if (rangelist == NULL)
rangelist = apr_array_make(iterpool, 0, sizeof(svn_merge_range_t *));
if (is_rollback)
{
ranges = svn_rangelist_dup(ranges, iterpool);
SVN_ERR(svn_rangelist_reverse(ranges, iterpool));
SVN_ERR(svn_rangelist_remove(&rangelist, ranges, rangelist,
FALSE,
iterpool));
}
else
{
SVN_ERR(svn_rangelist_merge2(rangelist, ranges, iterpool, iterpool));
}
/* Update the mergeinfo by adjusting the path's rangelist. */
svn_hash_sets(mergeinfo, fspath, rangelist);
if (is_rollback && apr_hash_count(mergeinfo) == 0)
mergeinfo = NULL;
svn_mergeinfo__remove_empty_rangelists(mergeinfo, scratch_pool);
if (result_catalog)
{
svn_mergeinfo_t existing_mergeinfo =
svn_hash_gets(result_catalog, local_abspath);
apr_pool_t *result_catalog_pool = apr_hash_pool_get(result_catalog);
if (existing_mergeinfo)
SVN_ERR(svn_mergeinfo_merge2(mergeinfo, existing_mergeinfo,
result_catalog_pool, scratch_pool));
svn_hash_sets(result_catalog,
apr_pstrdup(result_catalog_pool, local_abspath),
svn_mergeinfo_dup(mergeinfo, result_catalog_pool));
}
else
{
err = svn_client__record_wc_mergeinfo(local_abspath, mergeinfo,
TRUE, ctx, iterpool);
if (err && err->apr_err == SVN_ERR_ENTRY_NOT_FOUND)
{
/* PATH isn't just missing, it's not even versioned as far
as this working copy knows. But it was included in
MERGES, which means that the server knows about it.
Likely we don't have access to the source due to authz
restrictions. For now just clear the error and
continue...
### TODO: Set non-inheritable mergeinfo on PATH's immediate
### parent and normal mergeinfo on PATH's siblings which we
### do have access to. */
svn_error_clear(err);
}
else
SVN_ERR(err);
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Helper for record_mergeinfo_for_dir_merge().
Record override mergeinfo on any paths skipped during a merge.
Set empty mergeinfo on each path in MERGE_B->SKIPPED_ABSPATHS so the path
does not incorrectly inherit mergeinfo that will later be describing
the merge.
MERGEINFO_PATH and MERGE_B are cascaded from
arguments of the same name in the caller.
IS_ROLLBACK is true if the caller is recording a reverse merge and false
otherwise. RANGELIST is the set of revisions being merged from
MERGEINFO_PATH to MERGE_B->target. */
static svn_error_t *
record_skips_in_mergeinfo(const char *mergeinfo_path,
const svn_rangelist_t *rangelist,
svn_boolean_t is_rollback,
merge_cmd_baton_t *merge_b,
apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
apr_hash_t *merges;
apr_size_t nbr_skips = apr_hash_count(merge_b->skipped_abspaths);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
if (nbr_skips == 0)
return SVN_NO_ERROR;
merges = apr_hash_make(scratch_pool);
/* Override the mergeinfo for child paths which weren't actually merged. */
for (hi = apr_hash_first(scratch_pool, merge_b->skipped_abspaths); hi;
hi = apr_hash_next(hi))
{
const char *skipped_abspath = apr_hash_this_key(hi);
svn_wc_notify_state_t obstruction_state;
svn_pool_clear(iterpool);
/* Before we override, make sure this is a versioned path, it might
be an external or missing from disk due to authz restrictions. */
SVN_ERR(perform_obstruction_check(&obstruction_state, NULL, NULL,
NULL, NULL,
merge_b, skipped_abspath,
iterpool));
if (obstruction_state == svn_wc_notify_state_obstructed
|| obstruction_state == svn_wc_notify_state_missing)
continue;
/* Add an empty range list for this path.
### TODO: This works fine for a file path skipped because it is
### missing as long as the file's parent directory is present.
### But missing directory paths skipped are not handled yet,
### see issue #2915.
### TODO: An empty range is fine if the skipped path doesn't
### inherit any mergeinfo from a parent, but if it does
### we need to account for that. See issue #3440
### http://subversion.tigris.org/issues/show_bug.cgi?id=3440. */
svn_hash_sets(merges, skipped_abspath,
apr_array_make(scratch_pool, 0,
sizeof(svn_merge_range_t *)));
/* if (nbr_skips < notify_b->nbr_notifications)
### Use RANGELIST as the mergeinfo for all children of
### this path which were not also explicitly
### skipped? */
}
SVN_ERR(update_wc_mergeinfo(NULL, merge_b->target->abspath,
mergeinfo_path, merges,
is_rollback, merge_b->ctx, iterpool));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Data for reporting when a merge aborted because of raising conflicts.
*/
typedef struct single_range_conflict_report_t
{
/* What sub-range of the requested source raised conflicts?
* The 'inheritable' flag is ignored. */
merge_source_t *conflicted_range;
/* What sub-range of the requested source remains to be merged?
* NULL if no more. The 'inheritable' flag is ignored. */
merge_source_t *remaining_source;
} single_range_conflict_report_t;
/* Create a single_range_conflict_report_t, containing deep copies of
* CONFLICTED_RANGE and REMAINING_SOURCE, allocated in RESULT_POOL. */
static single_range_conflict_report_t *
single_range_conflict_report_create(const merge_source_t *conflicted_range,
const merge_source_t *remaining_source,
apr_pool_t *result_pool)
{
single_range_conflict_report_t *report
= apr_palloc(result_pool, sizeof(*report));
assert(conflicted_range != NULL);
report->conflicted_range = merge_source_dup(conflicted_range, result_pool);
report->remaining_source
= remaining_source ? merge_source_dup(remaining_source, result_pool)
: NULL;
return report;
}
/* Data for reporting when a merge aborted because of raising conflicts.
*
* ### TODO: More info, including the ranges (or other parameters) the user
* needs to complete the merge.
*/
typedef struct conflict_report_t
{
const char *target_abspath;
/* The revision range during which conflicts were raised */
const merge_source_t *conflicted_range;
/* Was the conflicted range the last range in the whole requested merge? */
svn_boolean_t was_last_range;
} conflict_report_t;
/* Return a new conflict_report_t containing deep copies of the parameters,
* allocated in RESULT_POOL. */
static conflict_report_t *
conflict_report_create(const char *target_abspath,
const merge_source_t *conflicted_range,
svn_boolean_t was_last_range,
apr_pool_t *result_pool)
{
conflict_report_t *report = apr_palloc(result_pool, sizeof(*report));
report->target_abspath = apr_pstrdup(result_pool, target_abspath);
report->conflicted_range = merge_source_dup(conflicted_range, result_pool);
report->was_last_range = was_last_range;
return report;
}
/* Return a deep copy of REPORT, allocated in RESULT_POOL. */
static conflict_report_t *
conflict_report_dup(const conflict_report_t *report,
apr_pool_t *result_pool)
{
conflict_report_t *new = apr_pmemdup(result_pool, report, sizeof(*new));
new->target_abspath = apr_pstrdup(result_pool, report->target_abspath);
new->conflicted_range = merge_source_dup(report->conflicted_range,
result_pool);
return new;
}
/* Create and return an error structure appropriate for the unmerged
revisions range(s). */
static APR_INLINE svn_error_t *
make_merge_conflict_error(conflict_report_t *report,
apr_pool_t *scratch_pool)
{
assert(!report || svn_dirent_is_absolute(report->target_abspath));
if (report && ! report->was_last_range)
{
svn_error_t *err = svn_error_createf(SVN_ERR_WC_FOUND_CONFLICT, NULL,
_("One or more conflicts were produced while merging r%ld:%ld into\n"
"'%s' --\n"
"resolve all conflicts and rerun the merge to apply the remaining\n"
"unmerged revisions"),
report->conflicted_range->loc1->rev, report->conflicted_range->loc2->rev,
svn_dirent_local_style(report->target_abspath, scratch_pool));
assert(report->conflicted_range->loc1->rev != report->conflicted_range->loc2->rev); /* ### is a valid case in a 2-URL merge */
return err;
}
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge().
TARGET_WCPATH is a directory and CHILDREN_WITH_MERGEINFO is filled
with paths (svn_client__merge_path_t *) arranged in depth first order,
which have mergeinfo set on them or meet one of the other criteria
defined in get_mergeinfo_paths(). Remove any paths absent from disk
or scheduled for deletion from CHILDREN_WITH_MERGEINFO which are equal to
or are descendants of TARGET_WCPATH by setting those children to NULL. */
static void
remove_absent_children(const char *target_wcpath,
apr_array_header_t *children_with_mergeinfo)
{
/* Before we try to override mergeinfo for skipped paths, make sure
the path isn't absent due to authz restrictions, because there's
nothing we can do about those. */
int i;
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
if ((child->absent || child->scheduled_for_deletion)
&& svn_dirent_is_ancestor(target_wcpath, child->abspath))
{
svn_sort__array_delete(children_with_mergeinfo, i--, 1);
}
}
}
/* Helper for do_directory_merge() to handle the case where a merge editor
drive removes explicit mergeinfo from a subtree of the merge target.
MERGE_B is cascaded from the argument of the same name in
do_directory_merge(). For each path (if any) in
MERGE_B->PATHS_WITH_DELETED_MERGEINFO remove that path from
CHILDREN_WITH_MERGEINFO.
The one exception is for the merge target itself,
MERGE_B->target->abspath, this must always be present in
CHILDREN_WITH_MERGEINFO so this is never removed by this
function. */
static void
remove_children_with_deleted_mergeinfo(merge_cmd_baton_t *merge_b,
apr_array_header_t *children_with_mergeinfo)
{
int i;
if (!merge_b->paths_with_deleted_mergeinfo)
return;
/* CHILDREN_WITH_MERGEINFO[0] is the always the merge target
so start at the first child. */
for (i = 1; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
if (svn_hash_gets(merge_b->paths_with_deleted_mergeinfo, child->abspath))
{
svn_sort__array_delete(children_with_mergeinfo, i--, 1);
}
}
}
/* Helper for do_directory_merge().
Set up the diff editor report to merge the SOURCE diff
into TARGET_ABSPATH and drive it.
If mergeinfo is not being honored (based on MERGE_B -- see the doc
string for HONOR_MERGEINFO() for how this is determined), then ignore
CHILDREN_WITH_MERGEINFO and merge the SOURCE diff to TARGET_ABSPATH.
If mergeinfo is being honored then perform a history-aware merge,
describing TARGET_ABSPATH and its subtrees to the reporter in such as way
as to avoid repeating merges already performed per the mergeinfo and
natural history of TARGET_ABSPATH and its subtrees.
The ranges that still need to be merged to the TARGET_ABSPATH and its
subtrees are described in CHILDREN_WITH_MERGEINFO, an array of
svn_client__merge_path_t * -- see 'THE CHILDREN_WITH_MERGEINFO ARRAY'
comment at the top of this file for more info. Note that it is possible
TARGET_ABSPATH and/or some of its subtrees need only a subset, or no part,
of SOURCE to be merged. Though there is little point to
calling this function if TARGET_ABSPATH and all its subtrees have already
had SOURCE merged, this will work but is a no-op.
SOURCE->rev1 and SOURCE->rev2 must be bound by the set of remaining_ranges
fields in CHILDREN_WITH_MERGEINFO's elements, specifically:
For forward merges (SOURCE->rev1 < SOURCE->rev2):
1) The first svn_merge_range_t * element of each child's remaining_ranges
array must meet one of the following conditions:
a) The range's start field is greater than or equal to SOURCE->rev2.
b) The range's end field is SOURCE->rev2.
2) Among all the ranges that meet condition 'b' the oldest start
revision must equal SOURCE->rev1.
For reverse merges (SOURCE->rev1 > SOURCE->rev2):
1) The first svn_merge_range_t * element of each child's remaining_ranges
array must meet one of the following conditions:
a) The range's start field is less than or equal to SOURCE->rev2.
b) The range's end field is SOURCE->rev2.
2) Among all the ranges that meet condition 'b' the youngest start
revision must equal SOURCE->rev1.
Note: If the first svn_merge_range_t * element of some subtree child's
remaining_ranges array is the same as the first range of that child's
nearest path-wise ancestor, then the subtree child *will not* be described
to the reporter.
DEPTH, NOTIFY_B, and MERGE_B are cascaded from do_directory_merge(), see
that function for more info.
MERGE_B->ra_session1 and MERGE_B->ra_session2 are RA sessions open to any
URL in the repository of SOURCE; they may be temporarily reparented within
this function.
If SOURCE->ancestral is set, then SOURCE->loc1 must be a
historical ancestor of SOURCE->loc2, or vice-versa (see
`MERGEINFO MERGE SOURCE NORMALIZATION' for more requirements around
SOURCE in this case).
*/
static svn_error_t *
drive_merge_report_editor(const char *target_abspath,
const merge_source_t *source,
const apr_array_header_t *children_with_mergeinfo,
const svn_diff_tree_processor_t *processor,
svn_depth_t depth,
merge_cmd_baton_t *merge_b,
apr_pool_t *scratch_pool)
{
const svn_ra_reporter3_t *reporter;
const svn_delta_editor_t *diff_editor;
void *diff_edit_baton;
void *report_baton;
svn_revnum_t target_start;
svn_boolean_t honor_mergeinfo = HONOR_MERGEINFO(merge_b);
const char *old_sess1_url, *old_sess2_url;
svn_boolean_t is_rollback = source->loc1->rev > source->loc2->rev;
/* Start with a safe default starting revision for the editor and the
merge target. */
target_start = source->loc1->rev;
/* If we are honoring mergeinfo the starting revision for the merge target
might not be SOURCE->rev1, in fact the merge target might not need *any*
part of SOURCE merged -- Instead some subtree of the target
needs SOURCE -- So get the right starting revision for the
target. */
if (honor_mergeinfo)
{
svn_client__merge_path_t *child;
/* CHILDREN_WITH_MERGEINFO must always exist if we are honoring
mergeinfo and must have at least one element (describing the
merge target). */
SVN_ERR_ASSERT(children_with_mergeinfo);
SVN_ERR_ASSERT(children_with_mergeinfo->nelts);
/* Get the merge target's svn_client__merge_path_t, which is always
the first in the array due to depth first sorting requirement,
see 'THE CHILDREN_WITH_MERGEINFO ARRAY'. */
child = APR_ARRAY_IDX(children_with_mergeinfo, 0,
svn_client__merge_path_t *);
SVN_ERR_ASSERT(child);
if (child->remaining_ranges->nelts == 0)
{
/* The merge target doesn't need anything merged. */
target_start = source->loc2->rev;
}
else
{
/* The merge target has remaining revisions to merge. These
ranges may fully or partially overlap the range described
by SOURCE->rev1:rev2 or may not intersect that range at
all. */
svn_merge_range_t *range =
APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *);
if ((!is_rollback && range->start > source->loc2->rev)
|| (is_rollback && range->start < source->loc2->rev))
{
/* Merge target's first remaining range doesn't intersect. */
target_start = source->loc2->rev;
}
else
{
/* Merge target's first remaining range partially or
fully overlaps. */
target_start = range->start;
}
}
}
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess1_url,
merge_b->ra_session1,
source->loc1->url, scratch_pool));
/* Temporarily point our second RA session to SOURCE->loc1->url, too. We use
this to request individual file contents. */
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess2_url,
merge_b->ra_session2,
source->loc1->url, scratch_pool));
/* Get the diff editor and a reporter with which to, ultimately,
drive it. */
SVN_ERR(svn_client__get_diff_editor2(&diff_editor, &diff_edit_baton,
merge_b->ra_session2,
depth,
source->loc1->rev,
TRUE /* text_deltas */,
processor,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
scratch_pool));
SVN_ERR(svn_ra_do_diff3(merge_b->ra_session1,
&reporter, &report_baton, source->loc2->rev,
"", depth, merge_b->diff_ignore_ancestry,
TRUE, /* text_deltas */
source->loc2->url, diff_editor, diff_edit_baton,
scratch_pool));
/* Drive the reporter. */
SVN_ERR(reporter->set_path(report_baton, "", target_start, depth,
FALSE, NULL, scratch_pool));
if (honor_mergeinfo && children_with_mergeinfo)
{
/* Describe children with mergeinfo overlapping this merge
operation such that no repeated diff is retrieved for them from
the repository. */
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
/* Start with CHILDREN_WITH_MERGEINFO[1], CHILDREN_WITH_MERGEINFO[0]
is always the merge target (TARGET_ABSPATH). */
for (i = 1; i < children_with_mergeinfo->nelts; i++)
{
svn_merge_range_t *range;
const char *child_repos_path;
const svn_client__merge_path_t *parent;
const svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
SVN_ERR_ASSERT(child);
if (child->absent)
continue;
svn_pool_clear(iterpool);
/* Find this child's nearest wc ancestor with mergeinfo. */
parent = find_nearest_ancestor(children_with_mergeinfo,
FALSE, child->abspath);
/* If a subtree needs the same range applied as its nearest parent
with mergeinfo or neither the subtree nor this parent need
SOURCE->rev1:rev2 merged, then we don't need to describe the
subtree separately. In the latter case this could break the
editor if child->abspath didn't exist at SOURCE->rev2 and we
attempt to describe it via a reporter set_path call. */
if (child->remaining_ranges->nelts)
{
range = APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *);
if ((!is_rollback && range->start > source->loc2->rev)
|| (is_rollback && range->start < source->loc2->rev))
{
/* This child's first remaining range comes after the range
we are currently merging, so skip it. We expect to get
to it in a subsequent call to this function. */
continue;
}
else if (parent->remaining_ranges->nelts)
{
svn_merge_range_t *parent_range =
APR_ARRAY_IDX(parent->remaining_ranges, 0,
svn_merge_range_t *);
svn_merge_range_t *child_range =
APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *);
if (parent_range->start == child_range->start)
continue; /* Subtree needs same range as parent. */
}
}
else /* child->remaining_ranges->nelts == 0*/
{
/* If both the subtree and its parent need no ranges applied
consider that as the "same ranges" and don't describe
the subtree. */
if (parent->remaining_ranges->nelts == 0)
continue;
}
/* Ok, we really need to describe this subtree as it needs different
ranges applied than its nearest working copy parent. */
child_repos_path = svn_dirent_is_child(target_abspath,
child->abspath,
iterpool);
/* This loop is only processing subtrees, so CHILD->ABSPATH
better be a proper child of the merge target. */
SVN_ERR_ASSERT(child_repos_path);
if ((child->remaining_ranges->nelts == 0)
|| (is_rollback && (range->start < source->loc2->rev))
|| (!is_rollback && (range->start > source->loc2->rev)))
{
/* Nothing to merge to this child. We'll claim we have
it up to date so the server doesn't send us
anything. */
SVN_ERR(reporter->set_path(report_baton, child_repos_path,
source->loc2->rev, depth, FALSE,
NULL, iterpool));
}
else
{
SVN_ERR(reporter->set_path(report_baton, child_repos_path,
range->start, depth, FALSE,
NULL, iterpool));
}
}
svn_pool_destroy(iterpool);
}
SVN_ERR(reporter->finish_report(report_baton, scratch_pool));
/* Point the merge baton's RA sessions back where they were. */
SVN_ERR(svn_ra_reparent(merge_b->ra_session1, old_sess1_url, scratch_pool));
SVN_ERR(svn_ra_reparent(merge_b->ra_session2, old_sess2_url, scratch_pool));
return SVN_NO_ERROR;
}
/* Iterate over each svn_client__merge_path_t * element in
CHILDREN_WITH_MERGEINFO and, if START_REV is true, find the most inclusive
start revision among those element's first remaining_ranges element. If
START_REV is false, then look for the most inclusive end revision.
If IS_ROLLBACK is true the youngest start or end (as per START_REV)
revision is considered the "most inclusive" otherwise the oldest revision
is.
If none of CHILDREN_WITH_MERGEINFO's elements have any remaining ranges
return SVN_INVALID_REVNUM. */
static svn_revnum_t
get_most_inclusive_rev(const apr_array_header_t *children_with_mergeinfo,
svn_boolean_t is_rollback,
svn_boolean_t start_rev)
{
int i;
svn_revnum_t most_inclusive_rev = SVN_INVALID_REVNUM;
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
if ((! child) || child->absent)
continue;
if (child->remaining_ranges->nelts > 0)
{
svn_merge_range_t *range =
APR_ARRAY_IDX(child->remaining_ranges, 0, svn_merge_range_t *);
/* Are we looking for the most inclusive start or end rev? */
svn_revnum_t rev = start_rev ? range->start : range->end;
if ((most_inclusive_rev == SVN_INVALID_REVNUM)
|| (is_rollback && (rev > most_inclusive_rev))
|| ((! is_rollback) && (rev < most_inclusive_rev)))
most_inclusive_rev = rev;
}
}
return most_inclusive_rev;
}
/* If first item in each child of CHILDREN_WITH_MERGEINFO's
remaining_ranges is inclusive of END_REV, Slice the first range in
to two at END_REV. All the allocations are persistent and allocated
from POOL. */
static void
slice_remaining_ranges(apr_array_header_t *children_with_mergeinfo,
svn_boolean_t is_rollback, svn_revnum_t end_rev,
apr_pool_t *pool)
{
int i;
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
if (!child || child->absent)
continue;
if (child->remaining_ranges->nelts > 0)
{
svn_merge_range_t *range = APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *);
if ((is_rollback && (range->start > end_rev)
&& (range->end < end_rev))
|| (!is_rollback && (range->start < end_rev)
&& (range->end > end_rev)))
{
svn_merge_range_t *split_range1, *split_range2;
split_range1 = svn_merge_range_dup(range, pool);
split_range2 = svn_merge_range_dup(range, pool);
split_range1->end = end_rev;
split_range2->start = end_rev;
APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *) = split_range1;
svn_sort__array_insert(child->remaining_ranges, &split_range2, 1);
}
}
}
}
/* Helper for do_directory_merge().
For each child in CHILDREN_WITH_MERGEINFO remove the first remaining_ranges
svn_merge_range_t *element of the child if that range has an end revision
equal to REVISION.
If a range is removed from a child's remaining_ranges array, allocate the
new remaining_ranges array in POOL.
*/
static void
remove_first_range_from_remaining_ranges(svn_revnum_t revision,
apr_array_header_t
*children_with_mergeinfo,
apr_pool_t *pool)
{
int i;
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
if (!child || child->absent)
continue;
if (child->remaining_ranges->nelts > 0)
{
svn_merge_range_t *first_range =
APR_ARRAY_IDX(child->remaining_ranges, 0, svn_merge_range_t *);
if (first_range->end == revision)
{
svn_sort__array_delete(child->remaining_ranges, 0, 1);
}
}
}
}
/* Get a file's content and properties from the repository.
Set *FILENAME to the local path to a new temporary file holding its text,
and set *PROPS to a new hash of its properties.
RA_SESSION is a session open to the correct repository, which will be
temporarily reparented to the URL of the file itself. LOCATION is the
repository location of the file.
The resulting file and the return values live as long as RESULT_POOL, all
other allocations occur in SCRATCH_POOL.
*/
static svn_error_t *
single_file_merge_get_file(const char **filename,
apr_hash_t **props,
svn_ra_session_t *ra_session,
const svn_client__pathrev_t *location,
const char *wc_target,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_stream_t *stream;
const char *old_sess_url;
svn_error_t *err;
SVN_ERR(svn_stream_open_unique(&stream, filename, NULL,
svn_io_file_del_on_pool_cleanup,
result_pool, scratch_pool));
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess_url, ra_session, location->url,
scratch_pool));
err = svn_ra_get_file(ra_session, "", location->rev,
stream, NULL, props, scratch_pool);
SVN_ERR(svn_error_compose_create(
err, svn_ra_reparent(ra_session, old_sess_url, scratch_pool)));
return svn_error_trace(svn_stream_close(stream));
}
/* Compare two svn_client__merge_path_t elements **A and **B, given the
addresses of pointers to them. Return an integer less than, equal to, or
greater than zero if A sorts before, the same as, or after B, respectively.
This is a helper for qsort() and bsearch() on an array of such elements. */
static int
compare_merge_path_t_as_paths(const void *a,
const void *b)
{
const svn_client__merge_path_t *child1
= *((const svn_client__merge_path_t * const *) a);
const svn_client__merge_path_t *child2
= *((const svn_client__merge_path_t * const *) b);
return svn_path_compare_paths(child1->abspath, child2->abspath);
}
/* Return a pointer to the element of CHILDREN_WITH_MERGEINFO whose path
* is PATH, or return NULL if there is no such element. */
static svn_client__merge_path_t *
get_child_with_mergeinfo(const apr_array_header_t *children_with_mergeinfo,
const char *abspath)
{
svn_client__merge_path_t merge_path;
svn_client__merge_path_t *key;
svn_client__merge_path_t **pchild;
merge_path.abspath = abspath;
key = &merge_path;
pchild = bsearch(&key, children_with_mergeinfo->elts,
children_with_mergeinfo->nelts,
children_with_mergeinfo->elt_size,
compare_merge_path_t_as_paths);
return pchild ? *pchild : NULL;
}
/* Insert a deep copy of INSERT_ELEMENT into the CHILDREN_WITH_MERGEINFO
array at its correct position. Allocate the new storage in POOL.
CHILDREN_WITH_MERGEINFO is a depth first sorted array of
(svn_client__merge_path_t *).
### Most callers don't need this to deep-copy the new element.
### It may be more efficient for some callers to insert a bunch of items
out of order and then sort afterwards. (One caller is doing a qsort
after calling this anyway.)
*/
static void
insert_child_to_merge(apr_array_header_t *children_with_mergeinfo,
const svn_client__merge_path_t *insert_element,
apr_pool_t *pool)
{
int insert_index;
const svn_client__merge_path_t *new_element;
/* Find where to insert the new element */
insert_index =
svn_sort__bsearch_lower_bound(children_with_mergeinfo, &insert_element,
compare_merge_path_t_as_paths);
new_element = svn_client__merge_path_dup(insert_element, pool);
svn_sort__array_insert(children_with_mergeinfo, &new_element, insert_index);
}
/* Helper for get_mergeinfo_paths().
CHILDREN_WITH_MERGEINFO, DEPTH, and POOL are
all cascaded from the arguments of the same name to get_mergeinfo_paths().
TARGET is the merge target.
*CHILD is the element in in CHILDREN_WITH_MERGEINFO that
get_mergeinfo_paths() is iterating over and *CURR_INDEX is index for
*CHILD.
If CHILD->ABSPATH is equal to MERGE_CMD_BATON->target->abspath do nothing.
Else if CHILD->ABSPATH is switched or absent then make sure its immediate
(as opposed to nearest) parent in CHILDREN_WITH_MERGEINFO is marked as
missing a child. If the immediate parent does not exist in
CHILDREN_WITH_MERGEINFO then create it (and increment *CURR_INDEX so that
caller doesn't process the inserted element). Also ensure that
CHILD->ABSPATH's siblings which are not already present in
CHILDREN_WITH_MERGEINFO are also added to the array, limited by DEPTH
(e.g. don't add directory siblings of a switched file).
Use POOL for temporary allocations only, any new CHILDREN_WITH_MERGEINFO
elements are allocated in POOL. */
static svn_error_t *
insert_parent_and_sibs_of_sw_absent_del_subtree(
apr_array_header_t *children_with_mergeinfo,
const merge_target_t *target,
int *curr_index,
svn_client__merge_path_t *child,
svn_depth_t depth,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
svn_client__merge_path_t *parent;
const char *parent_abspath;
apr_pool_t *iterpool;
const apr_array_header_t *children;
int i;
if (!(child->absent
|| (child->switched
&& strcmp(target->abspath,
child->abspath) != 0)))
return SVN_NO_ERROR;
parent_abspath = svn_dirent_dirname(child->abspath, pool);
parent = get_child_with_mergeinfo(children_with_mergeinfo, parent_abspath);
if (parent)
{
parent->missing_child = child->absent;
parent->switched_child = child->switched;
}
else
{
/* Create a new element to insert into CHILDREN_WITH_MERGEINFO. */
parent = svn_client__merge_path_create(parent_abspath, pool);
parent->missing_child = child->absent;
parent->switched_child = child->switched;
/* Insert PARENT into CHILDREN_WITH_MERGEINFO. */
insert_child_to_merge(children_with_mergeinfo, parent, pool);
/* Increment for loop index so we don't process the inserted element. */
(*curr_index)++;
} /*(parent == NULL) */
/* Add all of PARENT's non-missing children that are not already present.*/
SVN_ERR(svn_wc__node_get_children_of_working_node(&children, ctx->wc_ctx,
parent_abspath,
pool, pool));
iterpool = svn_pool_create(pool);
for (i = 0; i < children->nelts; i++)
{
const char *child_abspath = APR_ARRAY_IDX(children, i, const char *);
svn_client__merge_path_t *sibling_of_missing;
svn_pool_clear(iterpool);
/* Does this child already exist in CHILDREN_WITH_MERGEINFO? */
sibling_of_missing = get_child_with_mergeinfo(children_with_mergeinfo,
child_abspath);
/* Create the missing child and insert it into CHILDREN_WITH_MERGEINFO.*/
if (!sibling_of_missing)
{
/* Don't add directory children if DEPTH is svn_depth_files. */
if (depth == svn_depth_files)
{
svn_node_kind_t child_kind;
SVN_ERR(svn_wc_read_kind2(&child_kind,
ctx->wc_ctx, child_abspath,
FALSE, FALSE, iterpool));
if (child_kind != svn_node_file)
continue;
}
sibling_of_missing = svn_client__merge_path_create(child_abspath,
pool);
insert_child_to_merge(children_with_mergeinfo, sibling_of_missing,
pool);
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* pre_merge_status_cb's baton */
struct pre_merge_status_baton_t
{
svn_wc_context_t *wc_ctx;
/* const char *absolute_wc_path to svn_depth_t * mapping for depths
of empty, immediates, and files. */
apr_hash_t *shallow_subtrees;
/* const char *absolute_wc_path to the same, for all paths missing
from the working copy. */
apr_hash_t *missing_subtrees;
/* const char *absolute_wc_path const char * repos relative path, describing
the root of each switched subtree in the working copy and the repository
relative path it is switched to. */
apr_hash_t *switched_subtrees;
/* A pool to allocate additions to the above hashes in. */
apr_pool_t *pool;
};
/* A svn_wc_status_func4_t callback used by get_mergeinfo_paths to gather
all switched, depth filtered and missing subtrees under a merge target.
Note that this doesn't see server and user excluded trees. */
static svn_error_t *
pre_merge_status_cb(void *baton,
const char *local_abspath,
const svn_wc_status3_t *status,
apr_pool_t *scratch_pool)
{
struct pre_merge_status_baton_t *pmsb = baton;
if (status->switched && !status->file_external)
{
store_path(pmsb->switched_subtrees, local_abspath);
}
if (status->depth == svn_depth_empty
|| status->depth == svn_depth_files)
{
const char *dup_abspath;
svn_depth_t *depth = apr_pmemdup(pmsb->pool, &status->depth,
sizeof *depth);
dup_abspath = apr_pstrdup(pmsb->pool, local_abspath);
svn_hash_sets(pmsb->shallow_subtrees, dup_abspath, depth);
}
if (status->node_status == svn_wc_status_missing)
{
svn_boolean_t new_missing_root = TRUE;
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, pmsb->missing_subtrees);
hi;
hi = apr_hash_next(hi))
{
const char *missing_root_path = apr_hash_this_key(hi);
if (svn_dirent_is_ancestor(missing_root_path,
local_abspath))
{
new_missing_root = FALSE;
break;
}
}
if (new_missing_root)
store_path(pmsb->missing_subtrees, local_abspath);
}
return SVN_NO_ERROR;
}
/* Find all the subtrees in the working copy tree rooted at TARGET_ABSPATH
* that have explicit mergeinfo.
* Set *SUBTREES_WITH_MERGEINFO to a hash mapping (const char *) absolute
* WC path to (svn_mergeinfo_t *) mergeinfo.
*
* ### Is this function equivalent to:
*
* svn_client__get_wc_mergeinfo_catalog(
* subtrees_with_mergeinfo, inherited=NULL, include_descendants=TRUE,
* svn_mergeinfo_explicit, target_abspath, limit_path=NULL,
* walked_path=NULL, ignore_invalid_mergeinfo=FALSE, ...)
*
* except for the catalog keys being abspaths instead of repo-relpaths?
*/
static svn_error_t *
get_wc_explicit_mergeinfo_catalog(apr_hash_t **subtrees_with_mergeinfo,
const char *target_abspath,
svn_depth_t depth,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_opt_revision_t working_revision = { svn_opt_revision_working, { 0 } };
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_index_t *hi;
apr_hash_t *externals;
SVN_ERR(svn_client_propget5(subtrees_with_mergeinfo, NULL,
SVN_PROP_MERGEINFO, target_abspath,
&working_revision, &working_revision, NULL,
depth, NULL, ctx, result_pool, scratch_pool));
SVN_ERR(svn_wc__externals_defined_below(&externals, ctx->wc_ctx,
target_abspath, scratch_pool,
scratch_pool));
/* Convert property values to svn_mergeinfo_t. */
for (hi = apr_hash_first(scratch_pool, *subtrees_with_mergeinfo);
hi;
hi = apr_hash_next(hi))
{
const char *wc_path = apr_hash_this_key(hi);
svn_string_t *mergeinfo_string = apr_hash_this_val(hi);
svn_mergeinfo_t mergeinfo;
svn_error_t *err;
/* svn_client_propget5 picks up file externals with
mergeinfo, but we don't want those. */
if (svn_hash_gets(externals, wc_path))
{
svn_hash_sets(*subtrees_with_mergeinfo, wc_path, NULL);
continue;
}
svn_pool_clear(iterpool);
err = svn_mergeinfo_parse(&mergeinfo, mergeinfo_string->data,
result_pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
{
err = svn_error_createf(
SVN_ERR_CLIENT_INVALID_MERGEINFO_NO_MERGETRACKING, err,
_("Invalid mergeinfo detected on '%s', "
"merge tracking not possible"),
svn_dirent_local_style(wc_path, scratch_pool));
}
return svn_error_trace(err);
}
svn_hash_sets(*subtrees_with_mergeinfo, wc_path, mergeinfo);
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge() when performing merge-tracking aware
merges.
Walk of the working copy tree rooted at TARGET->abspath to
depth DEPTH. Create an svn_client__merge_path_t * for any path which meets
one or more of the following criteria:
1) Path has working svn:mergeinfo.
2) Path is switched.
3) Path is a subtree of the merge target (i.e. is not equal to
TARGET->abspath) and has no mergeinfo of its own but
its immediate parent has mergeinfo with non-inheritable ranges. If
this isn't a dry-run and the merge is between differences in the same
repository, then this function will set working mergeinfo on the path
equal to the mergeinfo inheritable from its parent.
4) Path has an immediate child (or children) missing from the WC because
the child is switched or absent from the WC, or due to a sparse
checkout.
5) Path has a sibling (or siblings) missing from the WC because the
sibling is switched, absent, scheduled for deletion, or missing due to
a sparse checkout.
6) Path is absent from disk due to an authz restriction.
7) Path is equal to TARGET->abspath.
8) Path is an immediate *directory* child of
TARGET->abspath and DEPTH is svn_depth_immediates.
9) Path is an immediate *file* child of TARGET->abspath
and DEPTH is svn_depth_files.
10) Path is at a depth of 'empty' or 'files'.
11) Path is missing from disk (e.g. due to an OS-level deletion).
If subtrees within the requested DEPTH are unexpectedly missing disk,
then raise SVN_ERR_CLIENT_NOT_READY_TO_MERGE.
Store the svn_client__merge_path_t *'s in *CHILDREN_WITH_MERGEINFO in
depth-first order based on the svn_client__merge_path_t *s path member as
sorted by svn_path_compare_paths(). Set the remaining_ranges field of each
element to NULL.
Note: Since the walk is rooted at TARGET->abspath, the
latter is guaranteed to be in *CHILDREN_WITH_MERGEINFO and due to the
depth-first ordering it is guaranteed to be the first element in
*CHILDREN_WITH_MERGEINFO.
MERGE_CMD_BATON is cascaded from the argument of the same name in
do_directory_merge().
*/
static svn_error_t *
get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
const merge_target_t *target,
svn_depth_t depth,
svn_boolean_t dry_run,
svn_boolean_t same_repos,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_t *subtrees_with_mergeinfo;
apr_hash_t *excluded_subtrees;
apr_hash_t *switched_subtrees;
apr_hash_t *shallow_subtrees;
apr_hash_t *missing_subtrees;
struct pre_merge_status_baton_t pre_merge_status_baton;
/* Case 1: Subtrees with explicit mergeinfo. */
SVN_ERR(get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo,
target->abspath,
depth, ctx,
result_pool, scratch_pool));
if (subtrees_with_mergeinfo)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, subtrees_with_mergeinfo);
hi;
hi = apr_hash_next(hi))
{
const char *wc_path = apr_hash_this_key(hi);
svn_mergeinfo_t mergeinfo = apr_hash_this_val(hi);
svn_client__merge_path_t *mergeinfo_child =
svn_client__merge_path_create(wc_path, result_pool);
svn_pool_clear(iterpool);
/* Stash this child's pre-existing mergeinfo. */
mergeinfo_child->pre_merge_mergeinfo = mergeinfo;
/* Note if this child has non-inheritable mergeinfo */
mergeinfo_child->has_noninheritable
= svn_mergeinfo__is_noninheritable(
mergeinfo_child->pre_merge_mergeinfo, iterpool);
/* Append it. We'll sort below. */
APR_ARRAY_PUSH(children_with_mergeinfo, svn_client__merge_path_t *)
= svn_client__merge_path_dup(mergeinfo_child, result_pool);
}
/* Sort CHILDREN_WITH_MERGEINFO by each child's path (i.e. as per
compare_merge_path_t_as_paths). Any subsequent insertions of new
children with insert_child_to_merge() require this ordering. */
qsort(children_with_mergeinfo->elts,
children_with_mergeinfo->nelts,
children_with_mergeinfo->elt_size,
compare_merge_path_t_as_paths);
}
/* Case 2: Switched subtrees
Case 10: Paths at depths of 'empty' or 'files'
Case 11: Paths missing from disk */
pre_merge_status_baton.wc_ctx = ctx->wc_ctx;
switched_subtrees = apr_hash_make(scratch_pool);
pre_merge_status_baton.switched_subtrees = switched_subtrees;
shallow_subtrees = apr_hash_make(scratch_pool);
pre_merge_status_baton.shallow_subtrees = shallow_subtrees;
missing_subtrees = apr_hash_make(scratch_pool);
pre_merge_status_baton.missing_subtrees = missing_subtrees;
pre_merge_status_baton.pool = scratch_pool;
SVN_ERR(svn_wc_walk_status(ctx->wc_ctx,
target->abspath,
depth,
TRUE /* get_all */,
FALSE /* no_ignore */,
TRUE /* ignore_text_mods */,
NULL /* ingore_patterns */,
pre_merge_status_cb, &pre_merge_status_baton,
ctx->cancel_func, ctx->cancel_baton,
scratch_pool));
/* Issue #2915: Raise an error describing the roots of any missing
subtrees, i.e. those that the WC thinks are on disk but have been
removed outside of Subversion. */
if (apr_hash_count(missing_subtrees))
{
apr_hash_index_t *hi;
svn_stringbuf_t *missing_subtree_err_buf =
svn_stringbuf_create(_("Merge tracking not allowed with missing "
"subtrees; try restoring these items "
"first:\n"), scratch_pool);
for (hi = apr_hash_first(scratch_pool, missing_subtrees);
hi;
hi = apr_hash_next(hi))
{
svn_pool_clear(iterpool);
svn_stringbuf_appendcstr(missing_subtree_err_buf,
svn_dirent_local_style(
apr_hash_this_key(hi), iterpool));
svn_stringbuf_appendcstr(missing_subtree_err_buf, "\n");
}
return svn_error_create(SVN_ERR_CLIENT_NOT_READY_TO_MERGE,
NULL, missing_subtree_err_buf->data);
}
if (apr_hash_count(switched_subtrees))
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, switched_subtrees);
hi;
hi = apr_hash_next(hi))
{
const char *wc_path = apr_hash_this_key(hi);
svn_client__merge_path_t *child = get_child_with_mergeinfo(
children_with_mergeinfo, wc_path);
if (child)
{
child->switched = TRUE;
}
else
{
svn_client__merge_path_t *switched_child =
svn_client__merge_path_create(wc_path, result_pool);
switched_child->switched = TRUE;
insert_child_to_merge(children_with_mergeinfo, switched_child,
result_pool);
}
}
}
if (apr_hash_count(shallow_subtrees))
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, shallow_subtrees);
hi;
hi = apr_hash_next(hi))
{
svn_boolean_t new_shallow_child = FALSE;
const char *wc_path = apr_hash_this_key(hi);
svn_depth_t *child_depth = apr_hash_this_val(hi);
svn_client__merge_path_t *shallow_child = get_child_with_mergeinfo(
children_with_mergeinfo, wc_path);
if (shallow_child)
{
if (*child_depth == svn_depth_empty
|| *child_depth == svn_depth_files)
shallow_child->missing_child = TRUE;
}
else
{
shallow_child = svn_client__merge_path_create(wc_path,
result_pool);
new_shallow_child = TRUE;
if (*child_depth == svn_depth_empty
|| *child_depth == svn_depth_files)
shallow_child->missing_child = TRUE;
}
/* A little trickery: If PATH doesn't have any mergeinfo or has
only inheritable mergeinfo, we still describe it as having
non-inheritable mergeinfo if it is missing a child due to
a shallow depth. Why? Because the mergeinfo we'll add to PATH
to describe the merge must be non-inheritable, so PATH's missing
children don't inherit it. Marking these PATHs as non-
inheritable allows the logic for case 3 to properly account
for PATH's children. */
if (!shallow_child->has_noninheritable
&& (*child_depth == svn_depth_empty
|| *child_depth == svn_depth_files))
{
shallow_child->has_noninheritable = TRUE;
}
if (new_shallow_child)
insert_child_to_merge(children_with_mergeinfo, shallow_child,
result_pool);
}
}
/* Case 6: Paths absent from disk due to server or user exclusion. */
SVN_ERR(svn_wc__get_excluded_subtrees(&excluded_subtrees,
ctx->wc_ctx, target->abspath,
result_pool, scratch_pool));
if (excluded_subtrees)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, excluded_subtrees);
hi;
hi = apr_hash_next(hi))
{
const char *wc_path = apr_hash_this_key(hi);
svn_client__merge_path_t *child = get_child_with_mergeinfo(
children_with_mergeinfo, wc_path);
if (child)
{
child->absent = TRUE;
}
else
{
svn_client__merge_path_t *absent_child =
svn_client__merge_path_create(wc_path, result_pool);
absent_child->absent = TRUE;
insert_child_to_merge(children_with_mergeinfo, absent_child,
result_pool);
}
}
}
/* Case 7: The merge target MERGE_CMD_BATON->target->abspath is always
present. */
if (!get_child_with_mergeinfo(children_with_mergeinfo,
target->abspath))
{
svn_client__merge_path_t *target_child =
svn_client__merge_path_create(target->abspath,
result_pool);
insert_child_to_merge(children_with_mergeinfo, target_child,
result_pool);
}
/* Case 8: Path is an immediate *directory* child of
MERGE_CMD_BATON->target->abspath and DEPTH is svn_depth_immediates.
Case 9: Path is an immediate *file* child of
MERGE_CMD_BATON->target->abspath and DEPTH is svn_depth_files. */
if (depth == svn_depth_immediates || depth == svn_depth_files)
{
int j;
const apr_array_header_t *immediate_children;
SVN_ERR(svn_wc__node_get_children_of_working_node(
&immediate_children, ctx->wc_ctx,
target->abspath, scratch_pool, scratch_pool));
for (j = 0; j < immediate_children->nelts; j++)
{
const char *immediate_child_abspath =
APR_ARRAY_IDX(immediate_children, j, const char *);
svn_node_kind_t immediate_child_kind;
svn_pool_clear(iterpool);
SVN_ERR(svn_wc_read_kind2(&immediate_child_kind,
ctx->wc_ctx, immediate_child_abspath,
FALSE, FALSE, iterpool));
if ((immediate_child_kind == svn_node_dir
&& depth == svn_depth_immediates)
|| (immediate_child_kind == svn_node_file
&& depth == svn_depth_files))
{
if (!get_child_with_mergeinfo(children_with_mergeinfo,
immediate_child_abspath))
{
svn_client__merge_path_t *immediate_child =
svn_client__merge_path_create(immediate_child_abspath,
result_pool);
if (immediate_child_kind == svn_node_dir
&& depth == svn_depth_immediates)
immediate_child->immediate_child_dir = TRUE;
insert_child_to_merge(children_with_mergeinfo,
immediate_child, result_pool);
}
}
}
}
/* If DEPTH isn't empty then cover cases 3), 4), and 5), possibly adding
elements to CHILDREN_WITH_MERGEINFO. */
if (depth <= svn_depth_empty)
return SVN_NO_ERROR;
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
svn_pool_clear(iterpool);
/* Case 3) Where merging to a path with a switched child the path
gets non-inheritable mergeinfo for the merge range performed and
the child gets its own set of mergeinfo. If the switched child
later "returns", e.g. a switched path is unswitched, the child
may not have any explicit mergeinfo. If the initial merge is
repeated we don't want to repeat the merge for the path, but we
do want to repeat it for the previously switched child. To
ensure this we check if all of CHILD's non-missing children have
explicit mergeinfo (they should already be present in
CHILDREN_WITH_MERGEINFO if they do). If not,
add the children without mergeinfo to CHILDREN_WITH_MERGEINFO so
do_directory_merge() will merge them independently.
But that's not enough! Since do_directory_merge() performs
the merges on the paths in CHILDREN_WITH_MERGEINFO in a depth
first manner it will merge the previously switched path's parent
first. As part of this merge it will update the parent's
previously non-inheritable mergeinfo and make it inheritable
(since it notices the path has no missing children), then when
do_directory_merge() finally merges the previously missing
child it needs to get mergeinfo from the child's nearest
ancestor, but since do_directory_merge() already tweaked that
mergeinfo, removing the non-inheritable flag, it appears that the
child already has been merged to. To prevent this we set
override mergeinfo on the child now, before any merging is done,
so it has explicit mergeinfo that reflects only CHILD's
inheritable mergeinfo. */
/* If depth is immediates or files then don't add new children if
CHILD is a subtree of the merge target; those children are below
the operational depth of the merge. */
if (child->has_noninheritable
&& (i == 0 || depth == svn_depth_infinity))
{
const apr_array_header_t *children;
int j;
SVN_ERR(svn_wc__node_get_children_of_working_node(
&children,
ctx->wc_ctx,
child->abspath,
iterpool, iterpool));
for (j = 0; j < children->nelts; j++)
{
svn_client__merge_path_t *child_of_noninheritable;
const char *child_abspath = APR_ARRAY_IDX(children, j,
const char*);
/* Does this child already exist in CHILDREN_WITH_MERGEINFO?
If not, create it and insert it into
CHILDREN_WITH_MERGEINFO and set override mergeinfo on
it. */
child_of_noninheritable =
get_child_with_mergeinfo(children_with_mergeinfo,
child_abspath);
if (!child_of_noninheritable)
{
/* Don't add directory children if DEPTH
is svn_depth_files. */
if (depth == svn_depth_files)
{
svn_node_kind_t child_kind;
SVN_ERR(svn_wc_read_kind2(&child_kind,
ctx->wc_ctx, child_abspath,
FALSE, FALSE, iterpool));
if (child_kind != svn_node_file)
continue;
}
/* else DEPTH is infinity or immediates so we want both
directory and file children. */
child_of_noninheritable =
svn_client__merge_path_create(child_abspath, result_pool);
child_of_noninheritable->child_of_noninheritable = TRUE;
insert_child_to_merge(children_with_mergeinfo,
child_of_noninheritable,
result_pool);
if (!dry_run && same_repos)
{
svn_mergeinfo_t mergeinfo;
SVN_ERR(svn_client__get_wc_mergeinfo(
&mergeinfo, NULL,
svn_mergeinfo_nearest_ancestor,
child_of_noninheritable->abspath,
target->abspath, NULL, FALSE,
ctx, iterpool, iterpool));
SVN_ERR(svn_client__record_wc_mergeinfo(
child_of_noninheritable->abspath, mergeinfo,
FALSE, ctx, iterpool));
}
}
}
}
/* Case 4 and 5 are handled by the following function. */
SVN_ERR(insert_parent_and_sibs_of_sw_absent_del_subtree(
children_with_mergeinfo, target, &i, child,
depth, ctx, result_pool));
} /* i < children_with_mergeinfo->nelts */
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Implements the svn_log_entry_receiver_t interface.
*
* BATON is an 'apr_array_header_t *' array of 'svn_revnum_t'.
* Push a copy of LOG_ENTRY->revision onto BATON. Thus, a
* series of invocations of this callback accumulates the
* corresponding set of revisions into BATON.
*/
static svn_error_t *
log_changed_revs(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
apr_array_header_t *revs = baton;
APR_ARRAY_PUSH(revs, svn_revnum_t) = log_entry->revision;
return SVN_NO_ERROR;
}
/* Set *MIN_REV_P to the oldest and *MAX_REV_P to the youngest start or end
* revision occurring in RANGELIST, or to SVN_INVALID_REVNUM if RANGELIST
* is empty. */
static void
merge_range_find_extremes(svn_revnum_t *min_rev_p,
svn_revnum_t *max_rev_p,
const svn_rangelist_t *rangelist)
{
int i;
*min_rev_p = SVN_INVALID_REVNUM;
*max_rev_p = SVN_INVALID_REVNUM;
for (i = 0; i < rangelist->nelts; i++)
{
svn_merge_range_t *range
= APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
svn_revnum_t range_min = MIN(range->start, range->end);
svn_revnum_t range_max = MAX(range->start, range->end);
if ((! SVN_IS_VALID_REVNUM(*min_rev_p)) || (range_min < *min_rev_p))
*min_rev_p = range_min;
if ((! SVN_IS_VALID_REVNUM(*max_rev_p)) || (range_max > *max_rev_p))
*max_rev_p = range_max;
}
}
/* Wrapper around svn_ra_get_log2(). Invoke RECEIVER with RECEIVER_BATON
* on each commit from YOUNGEST_REV to OLDEST_REV in which TARGET_RELPATH
* changed. TARGET_RELPATH is relative to RA_SESSION's URL.
* Important: Revision properties are not retrieved by this function for
* performance reasons.
*/
static svn_error_t *
get_log(svn_ra_session_t *ra_session,
const char *target_relpath,
svn_revnum_t youngest_rev,
svn_revnum_t oldest_rev,
svn_boolean_t discover_changed_paths,
svn_log_entry_receiver_t receiver,
void *receiver_baton,
apr_pool_t *pool)
{
apr_array_header_t *log_targets;
apr_array_header_t *revprops;
log_targets = apr_array_make(pool, 1, sizeof(const char *));
APR_ARRAY_PUSH(log_targets, const char *) = target_relpath;
revprops = apr_array_make(pool, 0, sizeof(const char *));
SVN_ERR(svn_ra_get_log2(ra_session, log_targets, youngest_rev,
oldest_rev, 0 /* limit */, discover_changed_paths,
FALSE /* strict_node_history */,
FALSE /* include_merged_revisions */,
revprops, receiver, receiver_baton, pool));
return SVN_NO_ERROR;
}
/* Set *OPERATIVE_RANGES_P to an array of svn_merge_range_t * merge
range objects copied wholesale from RANGES which have the property
that in some revision within that range the object identified by
RA_SESSION was modified (if by "modified" we mean "'svn log' would
return that revision). *OPERATIVE_RANGES_P is allocated from the
same pool as RANGES, and the ranges within it are shared with
RANGES, too.
*OPERATIVE_RANGES_P may be the same as RANGES (that is, the output
parameter is set only after the input is no longer used).
Use POOL for temporary allocations. */
static svn_error_t *
remove_noop_merge_ranges(svn_rangelist_t **operative_ranges_p,
svn_ra_session_t *ra_session,
const svn_rangelist_t *ranges,
apr_pool_t *pool)
{
int i;
svn_revnum_t oldest_rev, youngest_rev;
apr_array_header_t *changed_revs =
apr_array_make(pool, ranges->nelts, sizeof(svn_revnum_t));
svn_rangelist_t *operative_ranges =
apr_array_make(ranges->pool, ranges->nelts, ranges->elt_size);
/* Find the revision extremes of the RANGES we have. */
merge_range_find_extremes(&oldest_rev, &youngest_rev, ranges);
if (SVN_IS_VALID_REVNUM(oldest_rev))
oldest_rev++; /* make it inclusive */
/* Get logs across those ranges, recording which revisions hold
changes to our object's history. */
SVN_ERR(get_log(ra_session, "", youngest_rev, oldest_rev, FALSE,
log_changed_revs, changed_revs, pool));
/* Are there *any* changes? */
if (changed_revs->nelts)
{
/* Our list of changed revisions should be in youngest-to-oldest
order. */
svn_revnum_t youngest_changed_rev
= APR_ARRAY_IDX(changed_revs, 0, svn_revnum_t);
svn_revnum_t oldest_changed_rev
= APR_ARRAY_IDX(changed_revs, changed_revs->nelts - 1, svn_revnum_t);
/* Now, copy from RANGES to *OPERATIVE_RANGES, filtering out ranges
that aren't operative (by virtue of not having any revisions
represented in the CHANGED_REVS array). */
for (i = 0; i < ranges->nelts; i++)
{
svn_merge_range_t *range = APR_ARRAY_IDX(ranges, i,
svn_merge_range_t *);
svn_revnum_t range_min = MIN(range->start, range->end) + 1;
svn_revnum_t range_max = MAX(range->start, range->end);
int j;
/* If the merge range is entirely outside the range of changed
revisions, we've no use for it. */
if ((range_min > youngest_changed_rev)
|| (range_max < oldest_changed_rev))
continue;
/* Walk through the changed_revs to see if any of them fall
inside our current range. */
for (j = 0; j < changed_revs->nelts; j++)
{
svn_revnum_t changed_rev
= APR_ARRAY_IDX(changed_revs, j, svn_revnum_t);
if ((changed_rev >= range_min) && (changed_rev <= range_max))
{
APR_ARRAY_PUSH(operative_ranges, svn_merge_range_t *) =
range;
break;
}
}
}
}
*operative_ranges_p = operative_ranges;
return SVN_NO_ERROR;
}
/*-----------------------------------------------------------------------*/
/*** Merge Source Normalization ***/
/* qsort-compatible sort routine, rating merge_source_t * objects to
be in descending (youngest-to-oldest) order based on their ->loc1->rev
component. */
static int
compare_merge_source_ts(const void *a,
const void *b)
{
svn_revnum_t a_rev = (*(const merge_source_t *const *)a)->loc1->rev;
svn_revnum_t b_rev = (*(const merge_source_t *const *)b)->loc1->rev;
if (a_rev == b_rev)
return 0;
return a_rev < b_rev ? 1 : -1;
}
/* Set *MERGE_SOURCE_TS_P to a list of merge sources generated by
slicing history location SEGMENTS with a given requested merge
RANGE. Use SOURCE_LOC for full source URL calculation.
Order the merge sources in *MERGE_SOURCE_TS_P from oldest to
youngest. */
static svn_error_t *
combine_range_with_segments(apr_array_header_t **merge_source_ts_p,
const svn_merge_range_t *range,
const apr_array_header_t *segments,
const svn_client__pathrev_t *source_loc,
apr_pool_t *pool)
{
apr_array_header_t *merge_source_ts =
apr_array_make(pool, 1, sizeof(merge_source_t *));
svn_revnum_t minrev = MIN(range->start, range->end) + 1;
svn_revnum_t maxrev = MAX(range->start, range->end);
svn_boolean_t subtractive = (range->start > range->end);
int i;
for (i = 0; i < segments->nelts; i++)
{
svn_location_segment_t *segment =
APR_ARRAY_IDX(segments, i, svn_location_segment_t *);
svn_client__pathrev_t *loc1, *loc2;
merge_source_t *merge_source;
const char *path1 = NULL;
svn_revnum_t rev1;
/* If this segment doesn't overlap our range at all, or
represents a gap, ignore it. */
if ((segment->range_end < minrev)
|| (segment->range_start > maxrev)
|| (! segment->path))
continue;
/* If our range spans a segment boundary, we have to point our
merge_source_t's path1 to the path of the immediately older
segment, else it points to the same location as its path2. */
rev1 = MAX(segment->range_start, minrev) - 1;
if (minrev <= segment->range_start)
{
if (i > 0)
{
path1 = (APR_ARRAY_IDX(segments, i - 1,
svn_location_segment_t *))->path;
}
/* If we've backed PATH1 up into a segment gap, let's back
it up further still to the segment before the gap. We'll
have to adjust rev1, too. */
if ((! path1) && (i > 1))
{
path1 = (APR_ARRAY_IDX(segments, i - 2,
svn_location_segment_t *))->path;
rev1 = (APR_ARRAY_IDX(segments, i - 2,
svn_location_segment_t *))->range_end;
}
}
else
{
path1 = apr_pstrdup(pool, segment->path);
}
/* If we don't have two valid paths, we won't know what to do
when merging. This could happen if someone requested a merge
where the source didn't exist in a particular revision or
something. The merge code would probably bomb out anyway, so
we'll just *not* create a merge source in this case. */
if (! (path1 && segment->path))
continue;
/* Build our merge source structure. */
loc1 = svn_client__pathrev_create_with_relpath(
source_loc->repos_root_url, source_loc->repos_uuid,
rev1, path1, pool);
loc2 = svn_client__pathrev_create_with_relpath(
source_loc->repos_root_url, source_loc->repos_uuid,
MIN(segment->range_end, maxrev), segment->path, pool);
/* If this is subtractive, reverse the whole calculation. */
if (subtractive)
merge_source = merge_source_create(loc2, loc1, TRUE /* ancestral */,
pool);
else
merge_source = merge_source_create(loc1, loc2, TRUE /* ancestral */,
pool);
APR_ARRAY_PUSH(merge_source_ts, merge_source_t *) = merge_source;
}
/* If this was a subtractive merge, and we created more than one
merge source, we need to reverse the sort ordering of our sources. */
if (subtractive && (merge_source_ts->nelts > 1))
qsort(merge_source_ts->elts, merge_source_ts->nelts,
merge_source_ts->elt_size, compare_merge_source_ts);
*merge_source_ts_p = merge_source_ts;
return SVN_NO_ERROR;
}
/* Similar to normalize_merge_sources() except the input MERGE_RANGE_TS is a
* rangelist.
*/
static svn_error_t *
normalize_merge_sources_internal(apr_array_header_t **merge_sources_p,
const svn_client__pathrev_t *source_loc,
const svn_rangelist_t *merge_range_ts,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_revnum_t source_peg_revnum = source_loc->rev;
svn_revnum_t oldest_requested, youngest_requested;
svn_revnum_t trim_revision = SVN_INVALID_REVNUM;
apr_array_header_t *segments;
int i;
/* Initialize our return variable. */
*merge_sources_p = apr_array_make(result_pool, 1, sizeof(merge_source_t *));
/* No ranges to merge? No problem. */
if (merge_range_ts->nelts == 0)
return SVN_NO_ERROR;
/* Find the extremes of the revisions across our set of ranges. */
merge_range_find_extremes(&oldest_requested, &youngest_requested,
merge_range_ts);
/* ### FIXME: Our underlying APIs can't yet handle the case where
the peg revision isn't the youngest of the three revisions. So
we'll just verify that the source in the peg revision is related
to the source in the youngest requested revision (which is
all the underlying APIs would do in this case right now anyway). */
if (source_peg_revnum < youngest_requested)
{
svn_client__pathrev_t *start_loc;
SVN_ERR(svn_client__repos_location(&start_loc,
ra_session, source_loc,
youngest_requested,
ctx, scratch_pool, scratch_pool));
source_peg_revnum = youngest_requested;
}
/* Fetch the locations for our merge range span. */
SVN_ERR(svn_client__repos_location_segments(&segments,
ra_session, source_loc->url,
source_peg_revnum,
youngest_requested,
oldest_requested,
ctx, result_pool));
/* See if we fetched enough history to do the job. "Surely we did,"
you say. "After all, we covered the entire requested merge
range." Yes, that's true, but if our first segment doesn't
extend back to the oldest request revision, we've got a special
case to deal with. Or if the first segment represents a gap,
that's another special case. */
trim_revision = SVN_INVALID_REVNUM;
if (segments->nelts)
{
svn_location_segment_t *first_segment =
APR_ARRAY_IDX(segments, 0, svn_location_segment_t *);
/* If the first segment doesn't start with the OLDEST_REQUESTED
revision, we'll need to pass a trim revision to our range
cruncher. */
if (first_segment->range_start != oldest_requested)
{
trim_revision = first_segment->range_start;
}
/* Else, if the first segment has no path (and therefore is a
gap), then we'll fetch the copy source revision from the
second segment (provided there is one, of course) and use it
to prepend an extra pathful segment to our list.
### We could avoid this bit entirely if we'd passed
### SVN_INVALID_REVNUM instead of OLDEST_REQUESTED to
### svn_client__repos_location_segments(), but that would
### really penalize clients hitting pre-1.5 repositories with
### the typical small merge range request (because of the
### lack of a node-origins cache in the repository). */
else if (! first_segment->path)
{
if (segments->nelts > 1)
{
svn_location_segment_t *second_segment =
APR_ARRAY_IDX(segments, 1, svn_location_segment_t *);
const char *segment_url;
const char *original_repos_relpath;
svn_revnum_t original_revision;
svn_opt_revision_t range_start_rev;
range_start_rev.kind = svn_opt_revision_number;
range_start_rev.value.number = second_segment->range_start;
segment_url = svn_path_url_add_component2(
source_loc->repos_root_url, second_segment->path,
scratch_pool);
SVN_ERR(svn_client__get_copy_source(&original_repos_relpath,
&original_revision,
segment_url,
&range_start_rev,
ra_session, ctx,
result_pool, scratch_pool));
/* Got copyfrom data? Fix up the first segment to cover
back to COPYFROM_REV + 1, and then prepend a new
segment covering just COPYFROM_REV. */
if (original_repos_relpath)
{
svn_location_segment_t *new_segment =
apr_pcalloc(result_pool, sizeof(*new_segment));
new_segment->path = original_repos_relpath;
new_segment->range_start = original_revision;
new_segment->range_end = original_revision;
svn_sort__array_insert(segments, &new_segment, 0);
}
}
}
}
/* For each range in our requested range set, try to determine the
path(s) associated with that range. */
for (i = 0; i < merge_range_ts->nelts; i++)
{
svn_merge_range_t *range =
APR_ARRAY_IDX(merge_range_ts, i, svn_merge_range_t *);
apr_array_header_t *merge_sources;
if (SVN_IS_VALID_REVNUM(trim_revision))
{
/* If the range predates the trim revision, discard it. */
if (MAX(range->start, range->end) < trim_revision)
continue;
/* If the range overlaps the trim revision, trim it. */
if (range->start < trim_revision)
range->start = trim_revision;
if (range->end < trim_revision)
range->end = trim_revision;
}
/* Copy the resulting merge sources into master list thereof. */
SVN_ERR(combine_range_with_segments(&merge_sources, range,
segments, source_loc,
result_pool));
apr_array_cat(*merge_sources_p, merge_sources);
}
return SVN_NO_ERROR;
}
/* Determine the normalized ranges to merge from a given line of history.
Calculate the result by intersecting the list of location segments at
which SOURCE_LOC existed along its line of history with the requested
revision ranges in RANGES_TO_MERGE. RANGES_TO_MERGE is an array of
(svn_opt_revision_range_t *) revision ranges. Use SOURCE_PATH_OR_URL to
resolve any WC-relative revision specifiers (such as 'base') in
RANGES_TO_MERGE.
Set *MERGE_SOURCES_P to an array of merge_source_t * objects, each
describing a normalized range of revisions to be merged from the line
history of SOURCE_LOC. Order the objects from oldest to youngest.
RA_SESSION is an RA session open to the repository of SOURCE_LOC; it may
be temporarily reparented within this function. Use RA_SESSION to find
the location segments along the line of history of SOURCE_LOC.
Allocate MERGE_SOURCES_P and its contents in RESULT_POOL.
See `MERGEINFO MERGE SOURCE NORMALIZATION' for more on the
background of this function.
*/
static svn_error_t *
normalize_merge_sources(apr_array_header_t **merge_sources_p,
const char *source_path_or_url,
const svn_client__pathrev_t *source_loc,
const apr_array_header_t *ranges_to_merge,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *source_abspath_or_url;
svn_revnum_t youngest_rev = SVN_INVALID_REVNUM;
svn_rangelist_t *merge_range_ts;
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
if(!svn_path_is_url(source_path_or_url))
SVN_ERR(svn_dirent_get_absolute(&source_abspath_or_url, source_path_or_url,
scratch_pool));
else
source_abspath_or_url = source_path_or_url;
/* Create a list to hold svn_merge_range_t's. */
merge_range_ts = apr_array_make(scratch_pool, ranges_to_merge->nelts,
sizeof(svn_merge_range_t *));
for (i = 0; i < ranges_to_merge->nelts; i++)
{
svn_opt_revision_range_t *range
= APR_ARRAY_IDX(ranges_to_merge, i, svn_opt_revision_range_t *);
svn_merge_range_t mrange;
svn_pool_clear(iterpool);
/* Resolve revisions to real numbers, validating as we go. */
if ((range->start.kind == svn_opt_revision_unspecified)
|| (range->end.kind == svn_opt_revision_unspecified))
return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL,
_("Not all required revisions are specified"));
SVN_ERR(svn_client__get_revision_number(&mrange.start, &youngest_rev,
ctx->wc_ctx,
source_abspath_or_url,
ra_session, &range->start,
iterpool));
SVN_ERR(svn_client__get_revision_number(&mrange.end, &youngest_rev,
ctx->wc_ctx,
source_abspath_or_url,
ra_session, &range->end,
iterpool));
/* If this isn't a no-op range... */
if (mrange.start != mrange.end)
{
/* ...then add it to the list. */
mrange.inheritable = TRUE;
APR_ARRAY_PUSH(merge_range_ts, svn_merge_range_t *)
= svn_merge_range_dup(&mrange, scratch_pool);
}
}
SVN_ERR(normalize_merge_sources_internal(
merge_sources_p, source_loc,
merge_range_ts, ra_session, ctx, result_pool, scratch_pool));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/*-----------------------------------------------------------------------*/
/*** Merge Workhorse Functions ***/
/* Helper for do_directory_merge() and do_file_merge() which filters out a
path's own natural history from the mergeinfo describing a merge.
Given the natural history IMPLICIT_MERGEINFO of some wc merge target path,
the repository-relative merge source path SOURCE_REL_PATH, and the
requested merge range REQUESTED_RANGE from SOURCE_REL_PATH, remove any
portion of REQUESTED_RANGE which is already described in
IMPLICIT_MERGEINFO. Store the result in *FILTERED_RANGELIST.
This function only filters natural history for mergeinfo that will be
*added* during a forward merge. Removing natural history from explicit
mergeinfo is harmless. If REQUESTED_RANGE describes a reverse merge,
then *FILTERED_RANGELIST is simply populated with one range described
by REQUESTED_RANGE. *FILTERED_RANGELIST is never NULL.
Allocate *FILTERED_RANGELIST in POOL. */
static svn_error_t *
filter_natural_history_from_mergeinfo(svn_rangelist_t **filtered_rangelist,
const char *source_rel_path,
svn_mergeinfo_t implicit_mergeinfo,
svn_merge_range_t *requested_range,
apr_pool_t *pool)
{
/* Make the REQUESTED_RANGE into a rangelist. */
svn_rangelist_t *requested_rangelist =
svn_rangelist__initialize(requested_range->start, requested_range->end,
requested_range->inheritable, pool);
*filtered_rangelist = NULL;
/* For forward merges: If the IMPLICIT_MERGEINFO already describes ranges
associated with SOURCE_REL_PATH then filter those ranges out. */
if (implicit_mergeinfo
&& (requested_range->start < requested_range->end))
{
svn_rangelist_t *implied_rangelist =
svn_hash_gets(implicit_mergeinfo, source_rel_path);
if (implied_rangelist)
SVN_ERR(svn_rangelist_remove(filtered_rangelist,
implied_rangelist,
requested_rangelist,
FALSE, pool));
}
/* If no filtering was performed the filtered rangelist is
simply the requested rangelist.*/
if (! (*filtered_rangelist))
*filtered_rangelist = requested_rangelist;
return SVN_NO_ERROR;
}
/* Return a merge source representing the sub-range from START_REV to
END_REV of SOURCE. SOURCE obeys the rules described in the
'MERGEINFO MERGE SOURCE NORMALIZATION' comment at the top of this file.
The younger of START_REV and END_REV is inclusive while the older is
exclusive.
Allocate the result structure in POOL but leave the URLs in it as shallow
copies of the URLs in SOURCE.
*/
static merge_source_t *
subrange_source(const merge_source_t *source,
svn_revnum_t start_rev,
svn_revnum_t end_rev,
apr_pool_t *pool)
{
svn_boolean_t is_rollback = (source->loc1->rev > source->loc2->rev);
svn_boolean_t same_urls = (strcmp(source->loc1->url, source->loc2->url) == 0);
svn_client__pathrev_t loc1 = *source->loc1;
svn_client__pathrev_t loc2 = *source->loc2;
/* For this function we require that the input source is 'ancestral'. */
SVN_ERR_ASSERT_NO_RETURN(source->ancestral);
SVN_ERR_ASSERT_NO_RETURN(start_rev != end_rev);
loc1.rev = start_rev;
loc2.rev = end_rev;
if (! same_urls)
{
if (is_rollback && (end_rev != source->loc2->rev))
{
loc2.url = source->loc1->url;
}
if ((! is_rollback) && (start_rev != source->loc1->rev))
{
loc1.url = source->loc2->url;
}
}
return merge_source_create(&loc1, &loc2, source->ancestral, pool);
}
/* The single-file, simplified version of do_directory_merge(), which see for
parameter descriptions.
Additional parameters:
If SOURCES_RELATED is set, the "left" and "right" sides of SOURCE are
historically related (ancestors, uncles, second
cousins thrice removed, etc...). (This is used to simulate the
history checks that the repository logic does in the directory case.)
If mergeinfo is being recorded to describe this merge, and RESULT_CATALOG
is not NULL, then don't record the new mergeinfo on the TARGET_ABSPATH,
but instead record it in RESULT_CATALOG, where the key is TARGET_ABSPATH
and the value is the new mergeinfo for that path. Allocate additions
to RESULT_CATALOG in pool which RESULT_CATALOG was created in.
CONFLICTED_RANGE is as documented for do_directory_merge().
Note: MERGE_B->RA_SESSION1 must be associated with SOURCE->loc1->url and
MERGE_B->RA_SESSION2 with SOURCE->loc2->url.
*/
static svn_error_t *
do_file_merge(svn_mergeinfo_catalog_t result_catalog,
single_range_conflict_report_t **conflict_report,
const merge_source_t *source,
const char *target_abspath,
const svn_diff_tree_processor_t *processor,
svn_boolean_t sources_related,
svn_boolean_t squelch_mergeinfo_notifications,
merge_cmd_baton_t *merge_b,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_rangelist_t *remaining_ranges;
svn_client_ctx_t *ctx = merge_b->ctx;
svn_merge_range_t range;
svn_mergeinfo_t target_mergeinfo;
svn_boolean_t inherited = FALSE;
svn_boolean_t is_rollback = (source->loc1->rev > source->loc2->rev);
const svn_client__pathrev_t *primary_src
= is_rollback ? source->loc1 : source->loc2;
svn_boolean_t honor_mergeinfo = HONOR_MERGEINFO(merge_b);
svn_client__merge_path_t *merge_target = NULL;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
*conflict_report = NULL;
/* Note that this is a single-file merge. */
range.start = source->loc1->rev;
range.end = source->loc2->rev;
range.inheritable = TRUE;
merge_target = svn_client__merge_path_create(target_abspath, scratch_pool);
if (honor_mergeinfo)
{
svn_error_t *err;
/* Fetch mergeinfo. */
err = get_full_mergeinfo(&target_mergeinfo,
&(merge_target->implicit_mergeinfo),
&inherited, svn_mergeinfo_inherited,
merge_b->ra_session1, target_abspath,
MAX(source->loc1->rev, source->loc2->rev),
MIN(source->loc1->rev, source->loc2->rev),
ctx, scratch_pool, iterpool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
{
err = svn_error_createf(
SVN_ERR_CLIENT_INVALID_MERGEINFO_NO_MERGETRACKING, err,
_("Invalid mergeinfo detected on merge target '%s', "
"merge tracking not possible"),
svn_dirent_local_style(target_abspath, scratch_pool));
}
return svn_error_trace(err);
}
/* Calculate remaining merges unless this is a record only merge.
In that case the remaining range is the whole range described
by SOURCE->rev1:rev2. */
if (!merge_b->record_only)
{
/* ### Bug? calculate_remaining_ranges() needs 'source' to adhere
* to the requirements of 'MERGEINFO MERGE SOURCE NORMALIZATION'
* here, but it doesn't appear to be guaranteed so. */
SVN_ERR(calculate_remaining_ranges(NULL, merge_target,
source,
target_mergeinfo,
merge_b->implicit_src_gap, FALSE,
merge_b->ra_session1,
ctx, scratch_pool,
iterpool));
remaining_ranges = merge_target->remaining_ranges;
/* We are honoring mergeinfo and this is not a simple record only
merge which blindly records mergeinfo describing the merge of
SOURCE->LOC1->URL@SOURCE->LOC1->REV through
SOURCE->LOC2->URL@SOURCE->LOC2->REV. This means that the oldest
and youngest revisions merged (as determined above by
calculate_remaining_ranges) might differ from those described
in SOURCE. To keep the '--- Merging *' notifications consistent
with the '--- Recording mergeinfo *' notifications, we adjust
RANGE to account for such changes. */
if (remaining_ranges->nelts)
{
svn_merge_range_t *adj_start_range =
APR_ARRAY_IDX(remaining_ranges, 0, svn_merge_range_t *);
svn_merge_range_t *adj_end_range =
APR_ARRAY_IDX(remaining_ranges, remaining_ranges->nelts - 1,
svn_merge_range_t *);
range.start = adj_start_range->start;
range.end = adj_end_range->end;
}
}
}
/* The simple cases where our remaining range is SOURCE->rev1:rev2. */
if (!honor_mergeinfo || merge_b->record_only)
{
remaining_ranges = apr_array_make(scratch_pool, 1, sizeof(&range));
APR_ARRAY_PUSH(remaining_ranges, svn_merge_range_t *) = &range;
}
if (!merge_b->record_only)
{
svn_rangelist_t *ranges_to_merge = apr_array_copy(scratch_pool,
remaining_ranges);
const char *target_relpath = ""; /* relative to root of merge */
if (source->ancestral)
{
apr_array_header_t *child_with_mergeinfo;
svn_client__merge_path_t *target_info;
/* If we have ancestrally related sources and more than one
range to merge, eliminate no-op ranges before going through
the effort of downloading the many copies of the file
required to do these merges (two copies per range). */
if (remaining_ranges->nelts > 1)
{
const char *old_sess_url;
svn_error_t *err;
SVN_ERR(svn_client__ensure_ra_session_url(&old_sess_url,
merge_b->ra_session1,
primary_src->url,
iterpool));
err = remove_noop_merge_ranges(&ranges_to_merge,
merge_b->ra_session1,
remaining_ranges, scratch_pool);
SVN_ERR(svn_error_compose_create(
err, svn_ra_reparent(merge_b->ra_session1,
old_sess_url, iterpool)));
}
/* To support notify_merge_begin() initialize our
CHILD_WITH_MERGEINFO. See the comment
'THE CHILDREN_WITH_MERGEINFO ARRAY' at the start of this file. */
child_with_mergeinfo = apr_array_make(scratch_pool, 1,
sizeof(svn_client__merge_path_t *));
/* ### Create a fake copy of merge_target as we don't keep
remaining_ranges in sync (yet). */
target_info = apr_pcalloc(scratch_pool, sizeof(*target_info));
target_info->abspath = merge_target->abspath;
target_info->remaining_ranges = ranges_to_merge;
APR_ARRAY_PUSH(child_with_mergeinfo, svn_client__merge_path_t *)
= target_info;
/* And store in baton to allow using it from notify_merge_begin() */
merge_b->notify_begin.nodes_with_mergeinfo = child_with_mergeinfo;
}
while (ranges_to_merge->nelts > 0)
{
svn_merge_range_t *r = APR_ARRAY_IDX(ranges_to_merge, 0,
svn_merge_range_t *);
const merge_source_t *real_source;
const char *left_file, *right_file;
apr_hash_t *left_props, *right_props;
const svn_diff_source_t *left_source;
const svn_diff_source_t *right_source;
svn_pool_clear(iterpool);
/* Ensure any subsequent drives gets their own notification. */
merge_b->notify_begin.last_abspath = NULL;
/* While we currently don't allow it, in theory we could be
fetching two fulltexts from two different repositories here. */
if (source->ancestral)
real_source = subrange_source(source, r->start, r->end, iterpool);
else
real_source = source;
SVN_ERR(single_file_merge_get_file(&left_file, &left_props,
merge_b->ra_session1,
real_source->loc1,
target_abspath,
iterpool, iterpool));
SVN_ERR(single_file_merge_get_file(&right_file, &right_props,
merge_b->ra_session2,
real_source->loc2,
target_abspath,
iterpool, iterpool));
/* Calculate sources for the diff processor */
left_source = svn_diff__source_create(r->start, iterpool);
right_source = svn_diff__source_create(r->end, iterpool);
/* If the sources are related or we're ignoring ancestry in diffs,
do a text-n-props merge; otherwise, do a delete-n-add merge. */
if (! (merge_b->diff_ignore_ancestry || sources_related))
{
struct merge_dir_baton_t dir_baton;
void *file_baton;
svn_boolean_t skip;
/* Initialize minimal dir baton to allow calculating 'R'eplace
from 'D'elete + 'A'dd. */
memset(&dir_baton, 0, sizeof(dir_baton));
dir_baton.pool = iterpool;
dir_baton.tree_conflict_reason = CONFLICT_REASON_NONE;
dir_baton.tree_conflict_action = svn_wc_conflict_action_edit;
dir_baton.skip_reason = svn_wc_notify_state_unknown;
/* Delete... */
file_baton = NULL;
skip = FALSE;
SVN_ERR(processor->file_opened(&file_baton, &skip, target_relpath,
left_source,
NULL /* right_source */,
NULL /* copyfrom_source */,
&dir_baton,
processor,
iterpool, iterpool));
if (! skip)
SVN_ERR(processor->file_deleted(target_relpath,
left_source,
left_file,
left_props,
file_baton,
processor,
iterpool));
/* ...plus add... */
file_baton = NULL;
skip = FALSE;
SVN_ERR(processor->file_opened(&file_baton, &skip, target_relpath,
NULL /* left_source */,
right_source,
NULL /* copyfrom_source */,
&dir_baton,
processor,
iterpool, iterpool));
if (! skip)
SVN_ERR(processor->file_added(target_relpath,
NULL /* copyfrom_source */,
right_source,
NULL /* copyfrom_file */,
right_file,
NULL /* copyfrom_props */,
right_props,
file_baton,
processor,
iterpool));
/* ... equals replace. */
}
else
{
void *file_baton = NULL;
svn_boolean_t skip = FALSE;
apr_array_header_t *propchanges;
/* Deduce property diffs. */
SVN_ERR(svn_prop_diffs(&propchanges, right_props, left_props,
iterpool));
SVN_ERR(processor->file_opened(&file_baton, &skip, target_relpath,
left_source,
right_source,
NULL /* copyfrom_source */,
NULL /* dir_baton */,
processor,
iterpool, iterpool));
if (! skip)
SVN_ERR(processor->file_changed(target_relpath,
left_source,
right_source,
left_file,
right_file,
left_props,
right_props,
TRUE /* file changed */,
propchanges,
file_baton,
processor,
iterpool));
}
if (is_path_conflicted_by_merge(merge_b))
{
merge_source_t *remaining_range = NULL;
if (real_source->loc2->rev != source->loc2->rev)
remaining_range = subrange_source(source,
real_source->loc2->rev,
source->loc2->rev,
scratch_pool);
*conflict_report = single_range_conflict_report_create(
real_source, remaining_range, result_pool);
/* Only record partial mergeinfo if only a partial merge was
performed before a conflict was encountered. */
range.end = r->end;
break;
}
/* Now delete the just merged range from the hash
(This list is used from notify_merge_begin)
Directory merges use remove_first_range_from_remaining_ranges() */
svn_sort__array_delete(ranges_to_merge, 0, 1);
}
merge_b->notify_begin.last_abspath = NULL;
} /* !merge_b->record_only */
/* Record updated WC mergeinfo to account for our new merges, minus
any unresolved conflicts and skips. We use the original
REMAINING_RANGES here because we want to record all the requested
merge ranges, include the noop ones. */
if (RECORD_MERGEINFO(merge_b) && remaining_ranges->nelts)
{
const char *mergeinfo_path = svn_client__pathrev_fspath(primary_src,
scratch_pool);
svn_rangelist_t *filtered_rangelist;
/* Filter any ranges from TARGET_WCPATH's own history, there is no
need to record this explicitly in mergeinfo, it is already part
of TARGET_WCPATH's natural history (implicit mergeinfo). */
SVN_ERR(filter_natural_history_from_mergeinfo(
&filtered_rangelist,
mergeinfo_path,
merge_target->implicit_mergeinfo,
&range,
iterpool));
/* Only record mergeinfo if there is something other than
self-referential mergeinfo, but don't record mergeinfo if
TARGET_WCPATH was skipped. */
if (filtered_rangelist->nelts
&& (apr_hash_count(merge_b->skipped_abspaths) == 0))
{
apr_hash_t *merges = apr_hash_make(iterpool);
/* If merge target has inherited mergeinfo set it before
recording the first merge range. */
if (inherited)
SVN_ERR(svn_client__record_wc_mergeinfo(target_abspath,
target_mergeinfo,
FALSE, ctx,
iterpool));
svn_hash_sets(merges, target_abspath, filtered_rangelist);
if (!squelch_mergeinfo_notifications)
{
/* Notify that we are recording mergeinfo describing a merge. */
svn_merge_range_t n_range;
SVN_ERR(svn_mergeinfo__get_range_endpoints(
&n_range.end, &n_range.start, merges, iterpool));
n_range.inheritable = TRUE;
notify_mergeinfo_recording(target_abspath, &n_range,
merge_b->ctx, iterpool);
}
SVN_ERR(update_wc_mergeinfo(result_catalog, target_abspath,
mergeinfo_path, merges, is_rollback,
ctx, iterpool));
}
}
merge_b->notify_begin.nodes_with_mergeinfo = NULL;
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge() to handle the case where a merge editor
drive adds explicit mergeinfo to a path which didn't have any explicit
mergeinfo previously.
MERGE_B is cascaded from the argument of the same
name in do_directory_merge(). Should be called only after
do_directory_merge() has called populate_remaining_ranges() and populated
the remaining_ranges field of each child in
CHILDREN_WITH_MERGEINFO (i.e. the remaining_ranges fields can be
empty but never NULL).
If MERGE_B->DRY_RUN is true do nothing, if it is false then
for each path (if any) in MERGE_B->PATHS_WITH_NEW_MERGEINFO merge that
path's inherited mergeinfo (if any) with its working explicit mergeinfo
and set that as the path's new explicit mergeinfo. Then add an
svn_client__merge_path_t * element representing the path to
CHILDREN_WITH_MERGEINFO if it isn't already present. All fields
in any elements added to CHILDREN_WITH_MERGEINFO are initialized
to FALSE/NULL with the exception of 'path' and 'remaining_ranges'. The
latter is set to a rangelist equal to the remaining_ranges of the path's
nearest path-wise ancestor in CHILDREN_WITH_MERGEINFO.
Any elements added to CHILDREN_WITH_MERGEINFO are allocated
in POOL. */
static svn_error_t *
process_children_with_new_mergeinfo(merge_cmd_baton_t *merge_b,
apr_array_header_t *children_with_mergeinfo,
apr_pool_t *pool)
{
apr_pool_t *iterpool;
apr_hash_index_t *hi;
if (!merge_b->paths_with_new_mergeinfo || merge_b->dry_run)
return SVN_NO_ERROR;
/* Iterate over each path with explicit mergeinfo added by the merge. */
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, merge_b->paths_with_new_mergeinfo);
hi;
hi = apr_hash_next(hi))
{
const char *abspath_with_new_mergeinfo = apr_hash_this_key(hi);
svn_mergeinfo_t path_inherited_mergeinfo;
svn_mergeinfo_t path_explicit_mergeinfo;
svn_client__merge_path_t *new_child;
svn_pool_clear(iterpool);
/* Note: We could skip recording inherited mergeinfo here if this path
was added (with preexisting mergeinfo) by the merge. That's actually
more correct, since the inherited mergeinfo likely describes
non-existent or unrelated merge history, but it's not quite so simple
as that, see http://subversion.tigris.org/issues/show_bug.cgi?id=4309
*/
/* Get the path's new explicit mergeinfo... */
SVN_ERR(svn_client__get_wc_mergeinfo(&path_explicit_mergeinfo, NULL,
svn_mergeinfo_explicit,
abspath_with_new_mergeinfo,
NULL, NULL, FALSE,
merge_b->ctx,
iterpool, iterpool));
/* ...there *should* always be explicit mergeinfo at this point
but you can't be too careful. */
if (path_explicit_mergeinfo)
{
/* Get the mergeinfo the path would have inherited before
the merge. */
SVN_ERR(svn_client__get_wc_or_repos_mergeinfo(
&path_inherited_mergeinfo,
NULL, NULL,
FALSE,
svn_mergeinfo_nearest_ancestor, /* We only want inherited MI */
merge_b->ra_session2,
abspath_with_new_mergeinfo,
merge_b->ctx,
iterpool));
/* If the path inherited any mergeinfo then merge that with the
explicit mergeinfo and record the result as the path's new
explicit mergeinfo. */
if (path_inherited_mergeinfo)
{
SVN_ERR(svn_mergeinfo_merge2(path_explicit_mergeinfo,
path_inherited_mergeinfo,
iterpool, iterpool));
SVN_ERR(svn_client__record_wc_mergeinfo(
abspath_with_new_mergeinfo,
path_explicit_mergeinfo,
FALSE, merge_b->ctx, iterpool));
}
/* If the path is not in CHILDREN_WITH_MERGEINFO then add it. */
new_child =
get_child_with_mergeinfo(children_with_mergeinfo,
abspath_with_new_mergeinfo);
if (!new_child)
{
const svn_client__merge_path_t *parent
= find_nearest_ancestor(children_with_mergeinfo,
FALSE, abspath_with_new_mergeinfo);
new_child
= svn_client__merge_path_create(abspath_with_new_mergeinfo,
pool);
/* If path_with_new_mergeinfo is the merge target itself
then it should already be in
CHILDREN_WITH_MERGEINFO per the criteria of
get_mergeinfo_paths() and we shouldn't be in this block.
If path_with_new_mergeinfo is a subtree then it must have
a parent in CHILDREN_WITH_MERGEINFO if only
the merge target itself...so if we don't find a parent
the caller has done something quite wrong. */
SVN_ERR_ASSERT(parent);
SVN_ERR_ASSERT(parent->remaining_ranges);
/* Set the path's remaining_ranges equal to its parent's. */
new_child->remaining_ranges = svn_rangelist_dup(
parent->remaining_ranges, pool);
insert_child_to_merge(children_with_mergeinfo, new_child, pool);
}
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Return true if any path in SUBTREES is equal to, or is a subtree of,
LOCAL_ABSPATH. Return false otherwise. The keys of SUBTREES are
(const char *) absolute paths and its values are irrelevant.
If SUBTREES is NULL return false. */
static svn_boolean_t
path_is_subtree(const char *local_abspath,
apr_hash_t *subtrees,
apr_pool_t *pool)
{
if (subtrees)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(pool, subtrees);
hi; hi = apr_hash_next(hi))
{
const char *path_touched_by_merge = apr_hash_this_key(hi);
if (svn_dirent_is_ancestor(local_abspath, path_touched_by_merge))
return TRUE;
}
}
return FALSE;
}
/* Return true if any merged, skipped, added or tree-conflicted path
recorded in MERGE_B is equal to, or is a subtree of LOCAL_ABSPATH. Return
false otherwise.
### Why not text- or prop-conflicted paths? Are such paths guaranteed
to be recorded as 'merged' or 'skipped' or 'added', perhaps?
*/
static svn_boolean_t
subtree_touched_by_merge(const char *local_abspath,
merge_cmd_baton_t *merge_b,
apr_pool_t *pool)
{
return (path_is_subtree(local_abspath, merge_b->merged_abspaths, pool)
|| path_is_subtree(local_abspath, merge_b->skipped_abspaths, pool)
|| path_is_subtree(local_abspath, merge_b->added_abspaths, pool)
|| path_is_subtree(local_abspath, merge_b->tree_conflicted_abspaths,
pool));
}
/* Helper for do_directory_merge() when performing mergeinfo unaware merges.
Merge the SOURCE diff into TARGET_DIR_WCPATH.
SOURCE, DEPTH, NOTIFY_B, and MERGE_B
are all cascaded from do_directory_merge's arguments of the same names.
CONFLICT_REPORT is as documented for do_directory_merge().
NOTE: This is a very thin wrapper around drive_merge_report_editor() and
exists only to populate CHILDREN_WITH_MERGEINFO with the single element
expected during mergeinfo unaware merges.
*/
static svn_error_t *
do_mergeinfo_unaware_dir_merge(single_range_conflict_report_t **conflict_report,
const merge_source_t *source,
const char *target_dir_wcpath,
apr_array_header_t *children_with_mergeinfo,
const svn_diff_tree_processor_t *processor,
svn_depth_t depth,
merge_cmd_baton_t *merge_b,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* Initialize CHILDREN_WITH_MERGEINFO and populate it with
one element describing the merge of SOURCE->rev1:rev2 to
TARGET_DIR_WCPATH. */
svn_client__merge_path_t *item
= svn_client__merge_path_create(target_dir_wcpath, scratch_pool);
*conflict_report = NULL;
item->remaining_ranges = svn_rangelist__initialize(source->loc1->rev,
source->loc2->rev,
TRUE, scratch_pool);
APR_ARRAY_PUSH(children_with_mergeinfo,
svn_client__merge_path_t *) = item;
SVN_ERR(drive_merge_report_editor(target_dir_wcpath,
source,
NULL, processor, depth,
merge_b, scratch_pool));
if (is_path_conflicted_by_merge(merge_b))
{
*conflict_report = single_range_conflict_report_create(
source, NULL, result_pool);
}
return SVN_NO_ERROR;
}
/* A svn_log_entry_receiver_t baton for log_find_operative_subtree_revs(). */
typedef struct log_find_operative_subtree_baton_t
{
/* Mapping of const char * absolute working copy paths to those
path's const char * repos absolute paths. */
apr_hash_t *operative_children;
/* As per the arguments of the same name to
get_operative_immediate_children(). */
const char *merge_source_fspath;
const char *merge_target_abspath;
svn_depth_t depth;
svn_wc_context_t *wc_ctx;
/* A pool to allocate additions to the hashes in. */
apr_pool_t *result_pool;
} log_find_operative_subtree_baton_t;
/* A svn_log_entry_receiver_t callback for
get_inoperative_immediate_children(). */
static svn_error_t *
log_find_operative_subtree_revs(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
log_find_operative_subtree_baton_t *log_baton = baton;
apr_hash_index_t *hi;
apr_pool_t *iterpool;
/* It's possible that authz restrictions on the merge source prevent us
from knowing about any of the changes for LOG_ENTRY->REVISION. */
if (!log_entry->changed_paths2)
return SVN_NO_ERROR;
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, log_entry->changed_paths2);
hi;
hi = apr_hash_next(hi))
{
const char *path = apr_hash_this_key(hi);
svn_log_changed_path2_t *change = apr_hash_this_val(hi);
{
const char *child;
const char *potential_child;
const char *rel_path =
svn_fspath__skip_ancestor(log_baton->merge_source_fspath, path);
/* Some affected paths might be the root of the merge source or
entirely outside our subtree of interest. In either case they
are not operative *immediate* children. */
if (rel_path == NULL
|| rel_path[0] == '\0')
continue;
svn_pool_clear(iterpool);
child = svn_relpath_dirname(rel_path, iterpool);
if (child[0] == '\0')
{
/* The svn_log_changed_path2_t.node_kind members in
LOG_ENTRY->CHANGED_PATHS2 may be set to
svn_node_unknown, see svn_log_changed_path2_t and
svn_fs_paths_changed2. In that case we check the
type of the corresponding subtree in the merge
target. */
svn_node_kind_t node_kind;
if (change->node_kind == svn_node_unknown)
{
const char *wc_child_abspath =
svn_dirent_join(log_baton->merge_target_abspath,
rel_path, iterpool);
SVN_ERR(svn_wc_read_kind2(&node_kind, log_baton->wc_ctx,
wc_child_abspath, FALSE, FALSE,
iterpool));
}
else
{
node_kind = change->node_kind;
}
/* We only care about immediate directory children if
DEPTH is svn_depth_files. */
if (log_baton->depth == svn_depth_files
&& node_kind != svn_node_dir)
continue;
/* If depth is svn_depth_immediates, then we only care
about changes to proper subtrees of PATH. If the change
is to PATH itself then PATH is within the operational
depth of the merge. */
if (log_baton->depth == svn_depth_immediates)
continue;
child = rel_path;
}
potential_child = svn_dirent_join(log_baton->merge_target_abspath,
child, iterpool);
if (change->action == 'A'
|| !svn_hash_gets(log_baton->operative_children,
potential_child))
{
svn_hash_sets(log_baton->operative_children,
apr_pstrdup(log_baton->result_pool,
potential_child),
apr_pstrdup(log_baton->result_pool, path));
}
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Find immediate subtrees of MERGE_TARGET_ABSPATH which would have
additional differences applied if record_mergeinfo_for_dir_merge() were
recording mergeinfo describing a merge at svn_depth_infinity, rather
than at DEPTH (which is assumed to be shallow; if
DEPTH == svn_depth_infinity then this function does nothing beyond
setting *OPERATIVE_CHILDREN to an empty hash).
MERGE_SOURCE_FSPATH is the absolute repository path of the merge
source. OLDEST_REV and YOUNGEST_REV are the revisions merged from
MERGE_SOURCE_FSPATH to MERGE_TARGET_ABSPATH.
RA_SESSION points to MERGE_SOURCE_FSPATH.
Set *OPERATIVE_CHILDREN to a hash (mapping const char * absolute
working copy paths to those path's const char * repos absolute paths)
containing all the immediate subtrees of MERGE_TARGET_ABSPATH which would
have a different diff applied if MERGE_SOURCE_FSPATH
-r(OLDEST_REV - 1):YOUNGEST_REV were merged to MERGE_TARGET_ABSPATH at
svn_depth_infinity rather than DEPTH.
RESULT_POOL is used to allocate the contents of *OPERATIVE_CHILDREN.
SCRATCH_POOL is used for temporary allocations. */
static svn_error_t *
get_operative_immediate_children(apr_hash_t **operative_children,
const char *merge_source_fspath,
svn_revnum_t oldest_rev,
svn_revnum_t youngest_rev,
const char *merge_target_abspath,
svn_depth_t depth,
svn_wc_context_t *wc_ctx,
svn_ra_session_t *ra_session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
log_find_operative_subtree_baton_t log_baton;
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(oldest_rev));
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
SVN_ERR_ASSERT(oldest_rev <= youngest_rev);
*operative_children = apr_hash_make(result_pool);
if (depth == svn_depth_infinity)
return SVN_NO_ERROR;
/* Now remove any paths from *OPERATIVE_CHILDREN that are inoperative when
merging MERGE_SOURCE_REPOS_PATH -r(OLDEST_REV - 1):YOUNGEST_REV to
MERGE_TARGET_ABSPATH at --depth infinity. */
log_baton.operative_children = *operative_children;
log_baton.merge_source_fspath = merge_source_fspath;
log_baton.merge_target_abspath = merge_target_abspath;
log_baton.depth = depth;
log_baton.wc_ctx = wc_ctx;
log_baton.result_pool = result_pool;
SVN_ERR(get_log(ra_session, "", youngest_rev, oldest_rev,
TRUE, /* discover_changed_paths */
log_find_operative_subtree_revs,
&log_baton, scratch_pool));
return SVN_NO_ERROR;
}
/* Helper for record_mergeinfo_for_dir_merge(): Identify which elements of
CHILDREN_WITH_MERGEINFO need new mergeinfo set to accurately
describe a merge, what inheritance type such new mergeinfo should have,
and what subtrees can be ignored altogether.
For each svn_client__merge_path_t CHILD in CHILDREN_WITH_MERGEINFO,
set CHILD->RECORD_MERGEINFO and CHILD->RECORD_NONINHERITABLE to true
if the subtree needs mergeinfo to describe the merge and if that
mergeinfo should be non-inheritable respectively.
If OPERATIVE_MERGE is true, then the merge being described is operative
as per subtree_touched_by_merge(). OPERATIVE_MERGE is false otherwise.
MERGED_RANGE, MERGEINFO_FSPATH, DEPTH, NOTIFY_B, and MERGE_B are all
cascaded from record_mergeinfo_for_dir_merge's arguments of the same
names.
SCRATCH_POOL is used for temporary allocations.
*/
static svn_error_t *
flag_subtrees_needing_mergeinfo(svn_boolean_t operative_merge,
const svn_merge_range_t *merged_range,
apr_array_header_t *children_with_mergeinfo,
const char *mergeinfo_fspath,
svn_depth_t depth,
merge_cmd_baton_t *merge_b,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
apr_hash_t *operative_immediate_children = NULL;
assert(! merge_b->dry_run);
if (!merge_b->record_only
&& merged_range->start <= merged_range->end
&& (depth < svn_depth_infinity))
SVN_ERR(get_operative_immediate_children(
&operative_immediate_children,
mergeinfo_fspath, merged_range->start + 1, merged_range->end,
merge_b->target->abspath, depth, merge_b->ctx->wc_ctx,
merge_b->ra_session1, scratch_pool, iterpool));
/* Issue #4056: Walk NOTIFY_B->CHILDREN_WITH_MERGEINFO reverse depth-first
order. This way each child knows if it has operative missing/switched
children which necessitates non-inheritable mergeinfo. */
for (i = children_with_mergeinfo->nelts - 1; i >= 0; i--)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
/* Can't record mergeinfo on something that isn't here. */
if (child->absent)
continue;
/* Verify that remove_children_with_deleted_mergeinfo() did its job */
assert((i == 0)
||! merge_b->paths_with_deleted_mergeinfo
|| !svn_hash_gets(merge_b->paths_with_deleted_mergeinfo,
child->abspath));
/* Don't record mergeinfo on skipped paths. */
if (svn_hash_gets(merge_b->skipped_abspaths, child->abspath))
continue;
/* ### ptb: Yes, we could combine the following into a single
### conditional, but clarity would suffer (even more than
### it does now). */
if (i == 0)
{
/* Always record mergeinfo on the merge target. */
child->record_mergeinfo = TRUE;
}
else if (merge_b->record_only && !merge_b->reintegrate_merge)
{
/* Always record mergeinfo for --record-only merges. */
child->record_mergeinfo = TRUE;
}
else if (child->immediate_child_dir
&& !child->pre_merge_mergeinfo
&& operative_immediate_children
&& svn_hash_gets(operative_immediate_children, child->abspath))
{
/* We must record mergeinfo on those issue #3642 children
that are operative at a greater depth. */
child->record_mergeinfo = TRUE;
}
if (operative_merge
&& subtree_touched_by_merge(child->abspath, merge_b, iterpool))
{
svn_pool_clear(iterpool);
/* This subtree was affected by the merge. */
child->record_mergeinfo = TRUE;
/* Were any CHILD's missing children skipped by the merge?
If not, then CHILD's missing children don't need to be
considered when recording mergeinfo describing the merge. */
if (! merge_b->reintegrate_merge
&& child->missing_child
&& !path_is_subtree(child->abspath,
merge_b->skipped_abspaths,
iterpool))
{
child->missing_child = FALSE;
}
/* If CHILD has an immediate switched child or children and
none of these were touched by the merge, then we don't need
need to do any special handling of those switched subtrees
(e.g. record non-inheritable mergeinfo) when recording
mergeinfo describing the merge. */
if (child->switched_child)
{
int j;
svn_boolean_t operative_switched_child = FALSE;
for (j = i + 1;
j < children_with_mergeinfo->nelts;
j++)
{
svn_client__merge_path_t *potential_child =
APR_ARRAY_IDX(children_with_mergeinfo, j,
svn_client__merge_path_t *);
if (!svn_dirent_is_ancestor(child->abspath,
potential_child->abspath))
break;
/* POTENTIAL_CHILD is a subtree of CHILD, but is it
an immediate child? */
if (strcmp(child->abspath,
svn_dirent_dirname(potential_child->abspath,
iterpool)))
continue;
if (potential_child->switched
&& potential_child->record_mergeinfo)
{
operative_switched_child = TRUE;
break;
}
}
/* Can we treat CHILD as if it has no switched children? */
if (! operative_switched_child)
child->switched_child = FALSE;
}
}
if (child->record_mergeinfo)
{
/* We need to record mergeinfo, but should that mergeinfo be
non-inheritable? */
svn_node_kind_t path_kind;
SVN_ERR(svn_wc_read_kind2(&path_kind, merge_b->ctx->wc_ctx,
child->abspath, FALSE, FALSE, iterpool));
/* Only directories can have non-inheritable mergeinfo. */
if (path_kind == svn_node_dir)
{
/* There are two general cases where non-inheritable mergeinfo
is required:
1) There merge target has missing subtrees (due to authz
restrictions, switched subtrees, or a shallow working
copy).
2) The operational depth of the merge itself is shallow. */
/* We've already determined the first case. */
child->record_noninheritable =
child->missing_child || child->switched_child;
/* The second case requires a bit more work. */
if (i == 0)
{
/* If CHILD is the root of the merge target and the
operational depth is empty or files, then the mere
existence of operative immediate children means we
must record non-inheritable mergeinfo.
### What about svn_depth_immediates? In that case
### the merge target needs only normal inheritable
### mergeinfo and the target's immediate children will
### get non-inheritable mergeinfo, assuming they
### need even that. */
if (depth < svn_depth_immediates
&& operative_immediate_children
&& apr_hash_count(operative_immediate_children))
child->record_noninheritable = TRUE;
}
else if (depth == svn_depth_immediates)
{
/* An immediate directory child of the merge target, which
was affected by a --depth=immediates merge, needs
non-inheritable mergeinfo. */
if (svn_hash_gets(operative_immediate_children,
child->abspath))
child->record_noninheritable = TRUE;
}
}
}
else /* child->record_mergeinfo */
{
/* If CHILD is in NOTIFY_B->CHILDREN_WITH_MERGEINFO simply
because it had no explicit mergeinfo of its own at the
start of the merge but is the child of of some path with
non-inheritable mergeinfo, then the explicit mergeinfo it
has *now* was set by get_mergeinfo_paths() -- see criteria
3 in that function's doc string. So since CHILD->ABSPATH
was not touched by the merge we can remove the
mergeinfo. */
if (child->child_of_noninheritable)
SVN_ERR(svn_client__record_wc_mergeinfo(child->abspath,
NULL, FALSE,
merge_b->ctx,
iterpool));
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge().
If RESULT_CATALOG is NULL then record mergeinfo describing a merge of
MERGED_RANGE->START:MERGED_RANGE->END from the repository relative path
MERGEINFO_FSPATH to the merge target (and possibly its subtrees) described
by NOTIFY_B->CHILDREN_WITH_MERGEINFO -- see the global comment
'THE CHILDREN_WITH_MERGEINFO ARRAY'. Obviously this should only
be called if recording mergeinfo -- see doc string for RECORD_MERGEINFO().
If RESULT_CATALOG is not NULL, then don't record the new mergeinfo on the
WC, but instead record it in RESULT_CATALOG, where the keys are absolute
working copy paths and the values are the new mergeinfos for each.
Allocate additions to RESULT_CATALOG in pool which RESULT_CATALOG was
created in.
DEPTH, NOTIFY_B, MERGE_B, and SQUELCH_MERGEINFO_NOTIFICATIONS are all
cascaded from do_directory_merge's arguments of the same names.
SCRATCH_POOL is used for temporary allocations.
*/
static svn_error_t *
record_mergeinfo_for_dir_merge(svn_mergeinfo_catalog_t result_catalog,
const svn_merge_range_t *merged_range,
const char *mergeinfo_fspath,
apr_array_header_t *children_with_mergeinfo,
svn_depth_t depth,
svn_boolean_t squelch_mergeinfo_notifications,
merge_cmd_baton_t *merge_b,
apr_pool_t *scratch_pool)
{
int i;
svn_boolean_t is_rollback = (merged_range->start > merged_range->end);
svn_boolean_t operative_merge;
/* Update the WC mergeinfo here to account for our new
merges, minus any unresolved conflicts and skips. */
/* We need a scratch pool for iterations below. */
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
svn_merge_range_t range = *merged_range;
assert(! merge_b->dry_run);
/* Regardless of what subtrees in MERGE_B->target->abspath might be missing
could this merge have been operative? */
operative_merge = subtree_touched_by_merge(merge_b->target->abspath,
merge_b, iterpool);
/* If this couldn't be an operative merge then don't bother with
the added complexity (and user confusion) of non-inheritable ranges.
There is no harm in subtrees inheriting inoperative mergeinfo. */
if (!operative_merge)
range.inheritable = TRUE;
/* Remove absent children at or under MERGE_B->target->abspath from
NOTIFY_B->CHILDREN_WITH_MERGEINFO
before we calculate the merges performed. */
remove_absent_children(merge_b->target->abspath,
children_with_mergeinfo);
/* Determine which subtrees of interest need mergeinfo recorded... */
SVN_ERR(flag_subtrees_needing_mergeinfo(operative_merge, &range,
children_with_mergeinfo,
mergeinfo_fspath, depth,
merge_b, iterpool));
/* ...and then record it. */
for (i = 0; i < children_with_mergeinfo->nelts; i++)
{
const char *child_repos_path;
const char *child_merge_src_fspath;
svn_rangelist_t *child_merge_rangelist;
apr_hash_t *child_merges;
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
SVN_ERR_ASSERT(child);
svn_pool_clear(iterpool);
if (child->record_mergeinfo)
{
child_repos_path = svn_dirent_skip_ancestor(merge_b->target->abspath,
child->abspath);
SVN_ERR_ASSERT(child_repos_path != NULL);
child_merge_src_fspath = svn_fspath__join(mergeinfo_fspath,
child_repos_path,
iterpool);
/* Filter any ranges from each child's natural history before
setting mergeinfo describing the merge. */
SVN_ERR(filter_natural_history_from_mergeinfo(
&child_merge_rangelist, child_merge_src_fspath,
child->implicit_mergeinfo, &range, iterpool));
if (child_merge_rangelist->nelts == 0)
continue;
if (!squelch_mergeinfo_notifications)
{
/* If the merge source has a gap, then don't mention
those gap revisions in the notification. */
remove_source_gap(&range, merge_b->implicit_src_gap);
notify_mergeinfo_recording(child->abspath, &range,
merge_b->ctx, iterpool);
}
/* If we are here we know we will be recording some mergeinfo, but
before we do, set override mergeinfo on skipped paths so they
don't incorrectly inherit the mergeinfo we are about to set. */
if (i == 0)
SVN_ERR(record_skips_in_mergeinfo(mergeinfo_fspath,
child_merge_rangelist,
is_rollback, merge_b, iterpool));
/* We may need to record non-inheritable mergeinfo that applies
only to CHILD->ABSPATH. */
if (child->record_noninheritable)
svn_rangelist__set_inheritance(child_merge_rangelist, FALSE);
/* If CHILD has inherited mergeinfo set it before
recording the first merge range. */
if (child->inherited_mergeinfo)
SVN_ERR(svn_client__record_wc_mergeinfo(
child->abspath,
child->pre_merge_mergeinfo,
FALSE, merge_b->ctx,
iterpool));
if (merge_b->implicit_src_gap)
{
/* If this is a reverse merge reorder CHILD->REMAINING_RANGES
so it will work with the svn_rangelist_remove API. */
if (is_rollback)
SVN_ERR(svn_rangelist_reverse(child_merge_rangelist,
iterpool));
SVN_ERR(svn_rangelist_remove(&child_merge_rangelist,
merge_b->implicit_src_gap,
child_merge_rangelist, FALSE,
iterpool));
if (is_rollback)
SVN_ERR(svn_rangelist_reverse(child_merge_rangelist,
iterpool));
}
child_merges = apr_hash_make(iterpool);
/* The short story:
If we are describing a forward merge, then the naive mergeinfo
defined by MERGE_SOURCE_PATH:MERGED_RANGE->START:
MERGE_SOURCE_PATH:MERGED_RANGE->END may contain non-existent
path-revs or may describe other lines of history. We must
remove these invalid portion(s) before recording mergeinfo
describing the merge.
The long story:
If CHILD is the merge target we know that
MERGE_SOURCE_PATH:MERGED_RANGE->END exists. Further, if there
were no copies in MERGE_SOURCE_PATH's history going back to
RANGE->START then we know that
MERGE_SOURCE_PATH:MERGED_RANGE->START exists too and the two
describe an unbroken line of history, and thus
MERGE_SOURCE_PATH:MERGED_RANGE->START:
MERGE_SOURCE_PATH:MERGED_RANGE->END is a valid description of
the merge -- see normalize_merge_sources() and the global comment
'MERGEINFO MERGE SOURCE NORMALIZATION'.
However, if there *was* a copy, then
MERGE_SOURCE_PATH:MERGED_RANGE->START doesn't exist or is
unrelated to MERGE_SOURCE_PATH:MERGED_RANGE->END. Also, we
don't know if (MERGE_SOURCE_PATH:MERGED_RANGE->START)+1 through
(MERGE_SOURCE_PATH:MERGED_RANGE->END)-1 actually exist.
If CHILD is a subtree of the merge target, then nothing is
guaranteed beyond the fact that MERGE_SOURCE_PATH exists at
MERGED_RANGE->END. */
if ((!merge_b->record_only || merge_b->reintegrate_merge)
&& (!is_rollback))
{
svn_error_t *err;
svn_mergeinfo_t subtree_history_as_mergeinfo;
svn_rangelist_t *child_merge_src_rangelist;
svn_client__pathrev_t *subtree_mergeinfo_pathrev
= svn_client__pathrev_create_with_relpath(
merge_b->target->loc.repos_root_url,
merge_b->target->loc.repos_uuid,
merged_range->end, child_merge_src_fspath + 1,
iterpool);
/* Confirm that the naive mergeinfo we want to set on
CHILD->ABSPATH both exists and is part of
(MERGE_SOURCE_PATH+CHILD_REPOS_PATH)@MERGED_RANGE->END's
history. */
/* We know MERGED_RANGE->END is younger than MERGE_RANGE->START
because we only do this for forward merges. */
err = svn_client__get_history_as_mergeinfo(
&subtree_history_as_mergeinfo, NULL,
subtree_mergeinfo_pathrev,
merged_range->end, merged_range->start,
merge_b->ra_session2, merge_b->ctx, iterpool);
/* If CHILD is a subtree it may have been deleted prior to
MERGED_RANGE->END so the above call to get its history
will fail. */
if (err)
{
if (err->apr_err != SVN_ERR_FS_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
}
else
{
child_merge_src_rangelist = svn_hash_gets(
subtree_history_as_mergeinfo,
child_merge_src_fspath);
SVN_ERR(svn_rangelist_intersect(&child_merge_rangelist,
child_merge_rangelist,
child_merge_src_rangelist,
FALSE, iterpool));
if (child->record_noninheritable)
svn_rangelist__set_inheritance(child_merge_rangelist,
FALSE);
}
}
svn_hash_sets(child_merges, child->abspath, child_merge_rangelist);
SVN_ERR(update_wc_mergeinfo(result_catalog,
child->abspath,
child_merge_src_fspath,
child_merges, is_rollback,
merge_b->ctx, iterpool));
/* Once is enough: We don't need to record mergeinfo describing
the merge a second. If CHILD->ABSPATH is in
MERGE_B->ADDED_ABSPATHS, we'll do just that, so remove the
former from the latter. */
svn_hash_sets(merge_b->added_abspaths, child->abspath, NULL);
}
/* Elide explicit subtree mergeinfo whether or not we updated it. */
if (i > 0)
{
svn_boolean_t in_switched_subtree = FALSE;
if (child->switched)
in_switched_subtree = TRUE;
else if (i > 1)
{
/* Check if CHILD is part of a switched subtree */
svn_client__merge_path_t *parent;
int j = i - 1;
for (; j > 0; j--)
{
parent = APR_ARRAY_IDX(children_with_mergeinfo,
j, svn_client__merge_path_t *);
if (parent
&& parent->switched
&& svn_dirent_is_ancestor(parent->abspath,
child->abspath))
{
in_switched_subtree = TRUE;
break;
}
}
}
/* Allow mergeinfo on switched subtrees to elide to the
repository. Otherwise limit elision to the merge target
for now. do_merge() will eventually try to
elide that when the merge is complete. */
SVN_ERR(svn_client__elide_mergeinfo(
child->abspath,
in_switched_subtree ? NULL : merge_b->target->abspath,
merge_b->ctx, iterpool));
}
} /* (i = 0; i < notify_b->children_with_mergeinfo->nelts; i++) */
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge().
Record mergeinfo describing a merge of
MERGED_RANGE->START:MERGED_RANGE->END from the repository relative path
MERGEINFO_FSPATH to each path in ADDED_ABSPATHS which has explicit
mergeinfo or is the immediate child of a parent with explicit
non-inheritable mergeinfo.
DEPTH, MERGE_B, and SQUELCH_MERGEINFO_NOTIFICATIONS, are
cascaded from do_directory_merge's arguments of the same names.
Note: This is intended to support forward merges only, i.e.
MERGED_RANGE->START must be older than MERGED_RANGE->END.
*/
static svn_error_t *
record_mergeinfo_for_added_subtrees(
svn_merge_range_t *merged_range,
const char *mergeinfo_fspath,
svn_depth_t depth,
svn_boolean_t squelch_mergeinfo_notifications,
apr_hash_t *added_abspaths,
merge_cmd_baton_t *merge_b,
apr_pool_t *pool)
{
apr_pool_t *iterpool;
apr_hash_index_t *hi;
/* If no paths were added by the merge then we have nothing to do. */
if (!added_abspaths)
return SVN_NO_ERROR;
SVN_ERR_ASSERT(merged_range->start < merged_range->end);
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, added_abspaths); hi; hi = apr_hash_next(hi))
{
const char *added_abspath = apr_hash_this_key(hi);
const char *dir_abspath;
svn_mergeinfo_t parent_mergeinfo;
svn_mergeinfo_t added_path_mergeinfo;
svn_pool_clear(iterpool);
dir_abspath = svn_dirent_dirname(added_abspath, iterpool);
/* Grab the added path's explicit mergeinfo. */
SVN_ERR(svn_client__get_wc_mergeinfo(&added_path_mergeinfo, NULL,
svn_mergeinfo_explicit,
added_abspath, NULL, NULL, FALSE,
merge_b->ctx, iterpool, iterpool));
/* If the added path doesn't have explicit mergeinfo, does its immediate
parent have non-inheritable mergeinfo? */
if (!added_path_mergeinfo)
SVN_ERR(svn_client__get_wc_mergeinfo(&parent_mergeinfo, NULL,
svn_mergeinfo_explicit,
dir_abspath, NULL, NULL, FALSE,
merge_b->ctx,
iterpool, iterpool));
if (added_path_mergeinfo
|| svn_mergeinfo__is_noninheritable(parent_mergeinfo, iterpool))
{
svn_node_kind_t added_path_kind;
svn_mergeinfo_t merge_mergeinfo;
svn_mergeinfo_t adds_history_as_mergeinfo;
svn_rangelist_t *rangelist;
const char *rel_added_path;
const char *added_path_mergeinfo_fspath;
svn_client__pathrev_t *added_path_pathrev;
SVN_ERR(svn_wc_read_kind2(&added_path_kind, merge_b->ctx->wc_ctx,
added_abspath, FALSE, FALSE, iterpool));
/* Calculate the naive mergeinfo describing the merge. */
merge_mergeinfo = apr_hash_make(iterpool);
rangelist = svn_rangelist__initialize(
merged_range->start, merged_range->end,
((added_path_kind == svn_node_file)
|| (!(depth == svn_depth_infinity
|| depth == svn_depth_immediates))),
iterpool);
/* Create the new mergeinfo path for added_path's mergeinfo.
(added_abspath had better be a child of MERGE_B->target->abspath
or something is *really* wrong.) */
rel_added_path = svn_dirent_is_child(merge_b->target->abspath,
added_abspath, iterpool);
SVN_ERR_ASSERT(rel_added_path);
added_path_mergeinfo_fspath = svn_fspath__join(mergeinfo_fspath,
rel_added_path,
iterpool);
svn_hash_sets(merge_mergeinfo, added_path_mergeinfo_fspath,
rangelist);
/* Don't add new mergeinfo to describe the merge if that mergeinfo
contains non-existent merge sources.
We know that MERGEINFO_PATH/rel_added_path's history does not
span MERGED_RANGE->START:MERGED_RANGE->END but rather that it
was added at some revions greater than MERGED_RANGE->START
(assuming this is a forward merge). It may have been added,
deleted, and re-added many times. The point is that we cannot
blindly apply the naive mergeinfo calculated above because it
will describe non-existent merge sources. To avoid this we get
take the intersection of the naive mergeinfo with
MERGEINFO_PATH/rel_added_path's history. */
added_path_pathrev = svn_client__pathrev_create_with_relpath(
merge_b->target->loc.repos_root_url,
merge_b->target->loc.repos_uuid,
MAX(merged_range->start, merged_range->end),
added_path_mergeinfo_fspath + 1, iterpool);
SVN_ERR(svn_client__get_history_as_mergeinfo(
&adds_history_as_mergeinfo, NULL,
added_path_pathrev,
MAX(merged_range->start, merged_range->end),
MIN(merged_range->start, merged_range->end),
merge_b->ra_session2, merge_b->ctx, iterpool));
SVN_ERR(svn_mergeinfo_intersect2(&merge_mergeinfo,
merge_mergeinfo,
adds_history_as_mergeinfo,
FALSE, iterpool, iterpool));
/* Combine the explicit mergeinfo on the added path (if any)
with the mergeinfo describing this merge. */
if (added_path_mergeinfo)
SVN_ERR(svn_mergeinfo_merge2(merge_mergeinfo,
added_path_mergeinfo,
iterpool, iterpool));
SVN_ERR(svn_client__record_wc_mergeinfo(
added_abspath, merge_mergeinfo,
!squelch_mergeinfo_notifications, merge_b->ctx, iterpool));
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Baton structure for log_noop_revs. */
typedef struct log_noop_baton_t
{
/* See the comment 'THE CHILDREN_WITH_MERGEINFO ARRAY' at the start
of this file.*/
apr_array_header_t *children_with_mergeinfo;
/* Absolute repository path of younger of the two merge sources
being diffed. */
const char *source_fspath;
/* The merge target. */
const merge_target_t *target;
/* Initially empty rangelists allocated in POOL. The rangelists are
* populated across multiple invocations of log_noop_revs(). */
svn_rangelist_t *operative_ranges;
svn_rangelist_t *merged_ranges;
/* Pool to store the rangelists. */
apr_pool_t *pool;
} log_noop_baton_t;
/* Helper for log_noop_revs: Merge a svn_merge_range_t representation of
REVISION into RANGELIST. New elements added to rangelist are allocated
in RESULT_POOL.
This is *not* a general purpose rangelist merge but a special replacement
for svn_rangelist_merge when REVISION is guaranteed to be younger than any
element in RANGELIST. svn_rangelist_merge is O(n) worst-case (i.e. when
all the ranges in output rangelist are older than the incoming changes).
This turns the special case of a single incoming younger range into O(1).
*/
static svn_error_t *
rangelist_merge_revision(svn_rangelist_t *rangelist,
svn_revnum_t revision,
apr_pool_t *result_pool)
{
svn_merge_range_t *new_range;
if (rangelist->nelts)
{
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, rangelist->nelts - 1,
svn_merge_range_t *);
if (range->end == revision - 1)
{
/* REVISION is adjacent to the youngest range in RANGELIST
so we can simply expand that range to encompass REVISION. */
range->end = revision;
return SVN_NO_ERROR;
}
}
new_range = apr_palloc(result_pool, sizeof(*new_range));
new_range->start = revision - 1;
new_range->end = revision;
new_range->inheritable = TRUE;
APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = new_range;
return SVN_NO_ERROR;
}
/* Implements the svn_log_entry_receiver_t interface.
BATON is an log_noop_baton_t *.
Add LOG_ENTRY->REVISION to BATON->OPERATIVE_RANGES.
If LOG_ENTRY->REVISION has already been fully merged to
BATON->target->abspath per the mergeinfo in BATON->CHILDREN_WITH_MERGEINFO,
then add LOG_ENTRY->REVISION to BATON->MERGED_RANGES.
Use SCRATCH_POOL for temporary allocations. Allocate additions to
BATON->MERGED_RANGES and BATON->OPERATIVE_RANGES in BATON->POOL.
Note: This callback must be invoked from oldest LOG_ENTRY->REVISION
to youngest LOG_ENTRY->REVISION -- see rangelist_merge_revision().
*/
static svn_error_t *
log_noop_revs(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *scratch_pool)
{
log_noop_baton_t *log_gap_baton = baton;
apr_hash_index_t *hi;
svn_revnum_t revision;
svn_boolean_t log_entry_rev_required = FALSE;
revision = log_entry->revision;
/* It's possible that authz restrictions on the merge source prevent us
from knowing about any of the changes for LOG_ENTRY->REVISION. */
if (!log_entry->changed_paths2)
return SVN_NO_ERROR;
/* Unconditionally add LOG_ENTRY->REVISION to BATON->OPERATIVE_MERGES. */
SVN_ERR(rangelist_merge_revision(log_gap_baton->operative_ranges,
revision,
log_gap_baton->pool));
/* Examine each path affected by LOG_ENTRY->REVISION. If the explicit or
inherited mergeinfo for *all* of the corresponding paths under
BATON->target->abspath reflects that LOG_ENTRY->REVISION has been
merged, then add LOG_ENTRY->REVISION to BATON->MERGED_RANGES. */
for (hi = apr_hash_first(scratch_pool, log_entry->changed_paths2);
hi;
hi = apr_hash_next(hi))
{
const char *fspath = apr_hash_this_key(hi);
const char *rel_path;
const char *cwmi_abspath;
svn_rangelist_t *paths_explicit_rangelist = NULL;
svn_boolean_t mergeinfo_inherited = FALSE;
/* Adjust REL_PATH so it is relative to the merge source then use it to
calculate what path in the merge target would be affected by this
revision. */
rel_path = svn_fspath__skip_ancestor(log_gap_baton->source_fspath,
fspath);
/* Is PATH even within the merge target? If it isn't we
can disregard it altogether. */
if (rel_path == NULL)
continue;
cwmi_abspath = svn_dirent_join(log_gap_baton->target->abspath,
rel_path, scratch_pool);
/* Find any explicit or inherited mergeinfo for PATH. */
while (!log_entry_rev_required)
{
svn_client__merge_path_t *child = get_child_with_mergeinfo(
log_gap_baton->children_with_mergeinfo, cwmi_abspath);
if (child && child->pre_merge_mergeinfo)
{
/* Found some explicit mergeinfo, grab any ranges
for PATH. */
paths_explicit_rangelist =
svn_hash_gets(child->pre_merge_mergeinfo, fspath);
break;
}
if (cwmi_abspath[0] == '\0'
|| svn_dirent_is_root(cwmi_abspath, strlen(cwmi_abspath))
|| strcmp(log_gap_baton->target->abspath, cwmi_abspath) == 0)
{
/* Can't crawl any higher. */
break;
}
/* Didn't find anything so crawl up to the parent. */
cwmi_abspath = svn_dirent_dirname(cwmi_abspath, scratch_pool);
fspath = svn_fspath__dirname(fspath, scratch_pool);
/* At this point *if* we find mergeinfo it will be inherited. */
mergeinfo_inherited = TRUE;
}
if (paths_explicit_rangelist)
{
svn_rangelist_t *intersecting_range;
svn_rangelist_t *rangelist;
rangelist = svn_rangelist__initialize(revision - 1, revision, TRUE,
scratch_pool);
/* If PATH inherited mergeinfo we must consider inheritance in the
event the inherited mergeinfo is actually non-inheritable. */
SVN_ERR(svn_rangelist_intersect(&intersecting_range,
paths_explicit_rangelist,
rangelist,
mergeinfo_inherited, scratch_pool));
if (intersecting_range->nelts == 0)
log_entry_rev_required = TRUE;
}
else
{
log_entry_rev_required = TRUE;
}
}
if (!log_entry_rev_required)
SVN_ERR(rangelist_merge_revision(log_gap_baton->merged_ranges,
revision,
log_gap_baton->pool));
return SVN_NO_ERROR;
}
/* Helper for do_directory_merge().
SOURCE is cascaded from the argument of the same name in
do_directory_merge(). TARGET is the merge target. RA_SESSION is the
session for SOURCE->loc2.
Find all the ranges required by subtrees in
CHILDREN_WITH_MERGEINFO that are *not* required by
TARGET->abspath (i.e. CHILDREN_WITH_MERGEINFO[0]). If such
ranges exist, then find any subset of ranges which, if merged, would be
inoperative. Finally, if any inoperative ranges are found then remove
these ranges from all of the subtree's REMAINING_RANGES.
This function should only be called when honoring mergeinfo during
forward merges (i.e. SOURCE->rev1 < SOURCE->rev2).
*/
static svn_error_t *
remove_noop_subtree_ranges(const merge_source_t *source,
const merge_target_t *target,
svn_ra_session_t *ra_session,
apr_array_header_t *children_with_mergeinfo,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* ### Do we need to check that we are at a uniform working revision? */
int i;
svn_client__merge_path_t *root_child =
APR_ARRAY_IDX(children_with_mergeinfo, 0, svn_client__merge_path_t *);
svn_rangelist_t *requested_ranges;
svn_rangelist_t *subtree_gap_ranges;
svn_rangelist_t *subtree_remaining_ranges;
log_noop_baton_t log_gap_baton;
svn_merge_range_t *oldest_gap_rev;
svn_merge_range_t *youngest_gap_rev;
svn_rangelist_t *inoperative_ranges;
apr_pool_t *iterpool;
const char *longest_common_subtree_ancestor = NULL;
svn_error_t *err;
assert(session_url_is(ra_session, source->loc2->url, scratch_pool));
/* This function is only intended to work with forward merges. */
if (source->loc1->rev > source->loc2->rev)
return SVN_NO_ERROR;
/* Another easy out: There are no subtrees. */
if (children_with_mergeinfo->nelts < 2)
return SVN_NO_ERROR;
subtree_remaining_ranges = apr_array_make(scratch_pool, 1,
sizeof(svn_merge_range_t *));
/* Given the requested merge of SOURCE->rev1:rev2 might there be any
part of this range required for subtrees but not for the target? */
requested_ranges = svn_rangelist__initialize(MIN(source->loc1->rev,
source->loc2->rev),
MAX(source->loc1->rev,
source->loc2->rev),
TRUE, scratch_pool);
SVN_ERR(svn_rangelist_remove(&subtree_gap_ranges,
root_child->remaining_ranges,
requested_ranges, FALSE, scratch_pool));
/* Early out, nothing to operate on */
if (!subtree_gap_ranges->nelts)
return SVN_NO_ERROR;
/* Create a rangelist describing every range required across all subtrees. */
iterpool = svn_pool_create(scratch_pool);
for (i = 1; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
svn_pool_clear(iterpool);
/* CHILD->REMAINING_RANGES will be NULL if child is absent. */
if (child->remaining_ranges && child->remaining_ranges->nelts)
{
/* Issue #4269: Keep track of the longest common ancestor of all the
subtrees which require merges. This may be a child of
TARGET->ABSPATH, which will allow us to narrow the log request
below. */
if (longest_common_subtree_ancestor)
longest_common_subtree_ancestor = svn_dirent_get_longest_ancestor(
longest_common_subtree_ancestor, child->abspath, scratch_pool);
else
longest_common_subtree_ancestor = child->abspath;
SVN_ERR(svn_rangelist_merge2(subtree_remaining_ranges,
child->remaining_ranges,
scratch_pool, iterpool));
}
}
svn_pool_destroy(iterpool);
/* It's possible that none of the subtrees had any remaining ranges. */
if (!subtree_remaining_ranges->nelts)
return SVN_NO_ERROR;
/* Ok, *finally* we can answer what part(s) of SOURCE->rev1:rev2 are
required for the subtrees but not the target. */
SVN_ERR(svn_rangelist_intersect(&subtree_gap_ranges,
subtree_gap_ranges,
subtree_remaining_ranges, FALSE,
scratch_pool));
/* Another early out */
if (!subtree_gap_ranges->nelts)
return SVN_NO_ERROR;
/* One or more subtrees need some revisions that the target doesn't need.
Use log to determine if any of these revisions are inoperative. */
oldest_gap_rev = APR_ARRAY_IDX(subtree_gap_ranges, 0, svn_merge_range_t *);
youngest_gap_rev = APR_ARRAY_IDX(subtree_gap_ranges,
subtree_gap_ranges->nelts - 1, svn_merge_range_t *);
/* Set up the log baton. */
log_gap_baton.children_with_mergeinfo = children_with_mergeinfo;
log_gap_baton.source_fspath
= svn_client__pathrev_fspath(source->loc2, result_pool);
log_gap_baton.target = target;
log_gap_baton.merged_ranges = apr_array_make(scratch_pool, 0,
sizeof(svn_revnum_t *));
log_gap_baton.operative_ranges = apr_array_make(scratch_pool, 0,
sizeof(svn_revnum_t *));
log_gap_baton.pool = svn_pool_create(scratch_pool);
/* Find the longest common ancestor of all subtrees relative to
RA_SESSION's URL. */
if (longest_common_subtree_ancestor)
longest_common_subtree_ancestor =
svn_dirent_skip_ancestor(target->abspath,
longest_common_subtree_ancestor);
else
longest_common_subtree_ancestor = "";
/* Invoke the svn_log_entry_receiver_t receiver log_noop_revs() from
oldest to youngest. The receiver is optimized to add ranges to
log_gap_baton.merged_ranges and log_gap_baton.operative_ranges, but
requires that the revs arrive oldest to youngest -- see log_noop_revs()
and rangelist_merge_revision(). */
err = get_log(ra_session, longest_common_subtree_ancestor,
oldest_gap_rev->start + 1, youngest_gap_rev->end, TRUE,
log_noop_revs, &log_gap_baton, scratch_pool);
/* It's possible that the only subtrees with mergeinfo in TARGET don't have
any corresponding subtree in SOURCE between SOURCE->REV1 < SOURCE->REV2.
So it's also possible that we may ask for the logs of non-existent paths.
If we do, then assume that no subtree requires any ranges that are not
already required by the TARGET. */
if (err)
{
if (err->apr_err != SVN_ERR_FS_NOT_FOUND
&& longest_common_subtree_ancestor[0] != '\0')
return svn_error_trace(err);
/* Asked about a non-existent subtree in SOURCE. */
svn_error_clear(err);
log_gap_baton.merged_ranges =
svn_rangelist__initialize(oldest_gap_rev->start,
youngest_gap_rev->end,
TRUE, scratch_pool);
}
else
{
inoperative_ranges = svn_rangelist__initialize(oldest_gap_rev->start,
youngest_gap_rev->end,
TRUE, scratch_pool);
SVN_ERR(svn_rangelist_remove(&(inoperative_ranges),
log_gap_baton.operative_ranges,
inoperative_ranges, FALSE, scratch_pool));
SVN_ERR(svn_rangelist_merge2(log_gap_baton.merged_ranges, inoperative_ranges,
scratch_pool, scratch_pool));
}
for (i = 1; i < children_with_mergeinfo->nelts; i++)
{
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
/* CHILD->REMAINING_RANGES will be NULL if child is absent. */
if (child->remaining_ranges && child->remaining_ranges->nelts)
{
/* Remove inoperative ranges from all children so we don't perform
inoperative editor drives. */
SVN_ERR(svn_rangelist_remove(&(child->remaining_ranges),
log_gap_baton.merged_ranges,
child->remaining_ranges,
FALSE, result_pool));
}
}
svn_pool_destroy(log_gap_baton.pool);
return SVN_NO_ERROR;
}
/* Perform a merge of changes in SOURCE to the working copy path
TARGET_ABSPATH. Both URLs in SOURCE, and TARGET_ABSPATH all represent
directories -- for the single file case, the caller should use
do_file_merge().
CHILDREN_WITH_MERGEINFO and MERGE_B describe the merge being performed
As this function is for a mergeinfo-aware merge, SOURCE->ancestral
should be TRUE, and SOURCE->loc1 must be a historical ancestor of
SOURCE->loc2, or vice-versa (see `MERGEINFO MERGE SOURCE NORMALIZATION'
for more requirements around SOURCE).
Mergeinfo changes will be recorded unless MERGE_B->dry_run is true.
If mergeinfo is being recorded, SQUELCH_MERGEINFO_NOTIFICATIONS is FALSE,
and MERGE_B->CTX->NOTIFY_FUNC2 is not NULL, then call
MERGE_B->CTX->NOTIFY_FUNC2 with MERGE_B->CTX->NOTIFY_BATON2 and a
svn_wc_notify_merge_record_info_begin notification before any mergeinfo
changes are made to describe the merge performed.
If mergeinfo is being recorded to describe this merge, and RESULT_CATALOG
is not NULL, then don't record the new mergeinfo on the WC, but instead
record it in RESULT_CATALOG, where the keys are absolute working copy
paths and the values are the new mergeinfos for each. Allocate additions
to RESULT_CATALOG in pool which RESULT_CATALOG was created in.
Handle DEPTH as documented for svn_client_merge5().
CONFLICT_REPORT is as documented for do_directory_merge().
Perform any temporary allocations in SCRATCH_POOL.
NOTE: This is a wrapper around drive_merge_report_editor() which
handles the complexities inherent to situations where a given
directory's children may have intersecting merges (because they
meet one or more of the criteria described in get_mergeinfo_paths()).
*/
static svn_error_t *
do_mergeinfo_aware_dir_merge(svn_mergeinfo_catalog_t result_catalog,
single_range_conflict_report_t **conflict_report,
const merge_source_t *source,
const char *target_abspath,
apr_array_header_t *children_with_mergeinfo,
const svn_diff_tree_processor_t *processor,
svn_depth_t depth,
svn_boolean_t squelch_mergeinfo_notifications,
merge_cmd_baton_t *merge_b,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* The range defining the mergeinfo we will record to describe the merge
(assuming we are recording mergeinfo
Note: This may be a subset of SOURCE->rev1:rev2 if
populate_remaining_ranges() determines that some part of
SOURCE->rev1:rev2 has already been wholly merged to TARGET_ABSPATH.
Also, the actual editor drive(s) may be a subset of RANGE, if
remove_noop_subtree_ranges() and/or fix_deleted_subtree_ranges()
further tweak things. */
svn_merge_range_t range;
svn_ra_session_t *ra_session;
svn_client__merge_path_t *target_merge_path;
svn_boolean_t is_rollback = (source->loc1->rev > source->loc2->rev);
SVN_ERR_ASSERT(source->ancestral);
/*** If we get here, we're dealing with related sources from the
same repository as the target -- merge tracking might be
happenin'! ***/
*conflict_report = NULL;
/* Point our RA_SESSION to the URL of our youngest merge source side. */
ra_session = is_rollback ? merge_b->ra_session1 : merge_b->ra_session2;
/* Fill NOTIFY_B->CHILDREN_WITH_MERGEINFO with child paths (const
svn_client__merge_path_t *) which might have intersecting merges
because they meet one or more of the criteria described in
get_mergeinfo_paths(). Here the paths are arranged in a depth
first order. */
SVN_ERR(get_mergeinfo_paths(children_with_mergeinfo,
merge_b->target, depth,
merge_b->dry_run, merge_b->same_repos,
merge_b->ctx, scratch_pool, scratch_pool));
/* The first item from the NOTIFY_B->CHILDREN_WITH_MERGEINFO is always
the target thanks to depth-first ordering. */
target_merge_path = APR_ARRAY_IDX(children_with_mergeinfo, 0,
svn_client__merge_path_t *);
/* If we are honoring mergeinfo, then for each item in
NOTIFY_B->CHILDREN_WITH_MERGEINFO, we need to calculate what needs to be
merged, and then merge it. Otherwise, we just merge what we were asked
to merge across the whole tree. */
SVN_ERR(populate_remaining_ranges(children_with_mergeinfo,
source, ra_session,
merge_b, scratch_pool, scratch_pool));
/* Always start with a range which describes the most inclusive merge
possible, i.e. SOURCE->rev1:rev2. */
range.start = source->loc1->rev;
range.end = source->loc2->rev;
range.inheritable = TRUE;
if (!merge_b->reintegrate_merge)
{
svn_revnum_t new_range_start, start_rev;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
/* The merge target TARGET_ABSPATH and/or its subtrees may not need all
of SOURCE->rev1:rev2 applied. So examine
NOTIFY_B->CHILDREN_WITH_MERGEINFO to find the oldest starting
revision that actually needs to be merged (for reverse merges this is
the youngest starting revision).
We'll do this twice, right now for the start of the mergeinfo we will
ultimately record to describe this merge and then later for the
start of the actual editor drive. */
new_range_start = get_most_inclusive_rev(
children_with_mergeinfo, is_rollback, TRUE);
if (SVN_IS_VALID_REVNUM(new_range_start))
range.start = new_range_start;
/* Remove inoperative ranges from any subtrees' remaining_ranges
to spare the expense of noop editor drives. */
if (!is_rollback)
SVN_ERR(remove_noop_subtree_ranges(source, merge_b->target,
ra_session,
children_with_mergeinfo,
scratch_pool, iterpool));
/* Adjust subtrees' remaining_ranges to deal with issue #3067:
* "subtrees that don't exist at the start or end of a merge range
* shouldn't break the merge". */
SVN_ERR(fix_deleted_subtree_ranges(source, merge_b->target,
ra_session,
children_with_mergeinfo,
merge_b->ctx, scratch_pool, iterpool));
/* remove_noop_subtree_ranges() and/or fix_deleted_subtree_range()
may have further refined the starting revision for our editor
drive. */
start_rev =
get_most_inclusive_rev(children_with_mergeinfo,
is_rollback, TRUE);
/* Is there anything to merge? */
if (SVN_IS_VALID_REVNUM(start_rev))
{
/* Now examine NOTIFY_B->CHILDREN_WITH_MERGEINFO to find the oldest
ending revision that actually needs to be merged (for reverse
merges this is the youngest ending revision). */
svn_revnum_t end_rev =
get_most_inclusive_rev(children_with_mergeinfo,
is_rollback, FALSE);
/* While END_REV is valid, do the following:
1. Tweak each NOTIFY_B->CHILDREN_WITH_MERGEINFO element so that
the element's remaining_ranges member has as its first element
a range that ends with end_rev.
2. Starting with start_rev, call drive_merge_report_editor()
on MERGE_B->target->abspath for start_rev:end_rev.
3. Remove the first element from each
NOTIFY_B->CHILDREN_WITH_MERGEINFO element's remaining_ranges
member.
4. Again examine NOTIFY_B->CHILDREN_WITH_MERGEINFO to find the most
inclusive starting revision that actually needs to be merged and
update start_rev. This prevents us from needlessly contacting the
repository and doing a diff where we describe the entire target
tree as *not* needing any of the requested range. This can happen
whenever we have mergeinfo with gaps in it for the merge source.
5. Again examine NOTIFY_B->CHILDREN_WITH_MERGEINFO to find the most
inclusive ending revision that actually needs to be merged and
update end_rev.
6. Lather, rinse, repeat.
*/
while (end_rev != SVN_INVALID_REVNUM)
{
merge_source_t *real_source;
svn_merge_range_t *first_target_range
= (target_merge_path->remaining_ranges->nelts == 0 ? NULL
: APR_ARRAY_IDX(target_merge_path->remaining_ranges, 0,
svn_merge_range_t *));
/* Issue #3324: Stop editor abuse! Don't call
drive_merge_report_editor() in such a way that we request an
editor with svn_client__get_diff_editor() for some rev X,
then call svn_ra_do_diff3() for some revision Y, and then
call reporter->set_path(PATH=="") to set the root revision
for the editor drive to revision Z where
(X != Z && X < Z < Y). This is bogus because the server will
send us the diff between X:Y but the client is expecting the
diff between Y:Z. See issue #3324 for full details on the
problems this can cause. */
if (first_target_range
&& start_rev != first_target_range->start)
{
if (is_rollback)
{
if (end_rev < first_target_range->start)
end_rev = first_target_range->start;
}
else
{
if (end_rev > first_target_range->start)
end_rev = first_target_range->start;
}
}
svn_pool_clear(iterpool);
slice_remaining_ranges(children_with_mergeinfo,
is_rollback, end_rev, scratch_pool);
/* Reset variables that must be reset for every drive */
merge_b->notify_begin.last_abspath = NULL;
real_source = subrange_source(source, start_rev, end_rev, iterpool);
SVN_ERR(drive_merge_report_editor(
merge_b->target->abspath,
real_source,
children_with_mergeinfo,
processor,
depth,
merge_b,
iterpool));
/* If any paths picked up explicit mergeinfo as a result of
the merge we need to make sure any mergeinfo those paths
inherited is recorded and then add these paths to
NOTIFY_B->CHILDREN_WITH_MERGEINFO.*/
SVN_ERR(process_children_with_new_mergeinfo(
merge_b, children_with_mergeinfo,
scratch_pool));
/* If any subtrees had their explicit mergeinfo deleted as a
result of the merge then remove these paths from
NOTIFY_B->CHILDREN_WITH_MERGEINFO since there is no need
to consider these subtrees for subsequent editor drives
nor do we want to record mergeinfo on them describing
the merge itself. */
remove_children_with_deleted_mergeinfo(
merge_b, children_with_mergeinfo);
/* Prepare for the next iteration (if any). */
remove_first_range_from_remaining_ranges(
end_rev, children_with_mergeinfo, scratch_pool);
/* If we raised any conflicts, break out and report how much
we have merged. */
if (is_path_conflicted_by_merge(merge_b))
{
merge_source_t *remaining_range = NULL;
if (real_source->loc2->rev != source->loc2->rev)
remaining_range = subrange_source(source,
real_source->loc2->rev,
source->loc2->rev,
scratch_pool);
*conflict_report = single_range_conflict_report_create(
real_source, remaining_range,
result_pool);
range.end = end_rev;
break;
}
start_rev =
get_most_inclusive_rev(children_with_mergeinfo,
is_rollback, TRUE);
end_rev =
get_most_inclusive_rev(children_with_mergeinfo,
is_rollback, FALSE);
}
}
svn_pool_destroy(iterpool);
}
else
{
if (!merge_b->record_only)
{
/* Reset the last notification path so that subsequent cherry
picked revision ranges will be notified upon subsequent
operative merge. */
merge_b->notify_begin.last_abspath = NULL;
SVN_ERR(drive_merge_report_editor(merge_b->target->abspath,
source,
NULL,
processor,
depth,
merge_b,
scratch_pool));
}
}
/* Record mergeinfo where appropriate.*/
if (RECORD_MERGEINFO(merge_b))
{
const svn_client__pathrev_t *primary_src
= is_rollback ? source->loc1 : source->loc2;
const char *mergeinfo_path
= svn_client__pathrev_fspath(primary_src, scratch_pool);
SVN_ERR(record_mergeinfo_for_dir_merge(result_catalog,
&range,
mergeinfo_path,
children_with_mergeinfo,
depth,
squelch_mergeinfo_notifications,
merge_b,
scratch_pool));
/* If a path has an immediate parent with non-inheritable mergeinfo at
this point, then it meets criteria 3 or 5 described in
get_mergeinfo_paths' doc string. For paths which exist prior to a
merge explicit mergeinfo has already been set. But for paths added
during the merge this is not the case. The path might have explicit
mergeinfo from the merge source, but no mergeinfo yet exists
describing *this* merge. So the added path has either incomplete
explicit mergeinfo or inherits incomplete mergeinfo from its
immediate parent (if any, the parent might have only non-inheritable
ranges in which case the path simply inherits empty mergeinfo).
So here we look at the root path of each subtree added during the
merge and set explicit mergeinfo on it if it meets the aforementioned
conditions. */
if (range.start < range.end) /* Nothing to record on added subtrees
resulting from reverse merges. */
{
SVN_ERR(record_mergeinfo_for_added_subtrees(
&range, mergeinfo_path, depth,
squelch_mergeinfo_notifications,
merge_b->added_abspaths, merge_b, scratch_pool));
}
}
return SVN_NO_ERROR;
}
/* Helper for do_merge() when the merge target is a directory.
*
* If any conflict is raised during the merge, set *CONFLICTED_RANGE to
* the revision sub-range that raised the conflict. In this case, the
* merge will have ended at revision CONFLICTED_RANGE and mergeinfo will
* have been recorded for all revision sub-ranges up to and including
* CONFLICTED_RANGE. Otherwise, set *CONFLICTED_RANGE to NULL.
*/
static svn_error_t *
do_directory_merge(svn_mergeinfo_catalog_t result_catalog,
single_range_conflict_report_t **conflict_report,
const merge_source_t *source,
const char *target_abspath,
const svn_diff_tree_processor_t *processor,
svn_depth_t depth,
svn_boolean_t squelch_mergeinfo_notifications,
merge_cmd_baton_t *merge_b,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_array_header_t *children_with_mergeinfo;
/* Initialize CHILDREN_WITH_MERGEINFO. See the comment
'THE CHILDREN_WITH_MERGEINFO ARRAY' at the start of this file. */
children_with_mergeinfo =
apr_array_make(scratch_pool, 16, sizeof(svn_client__merge_path_t *));
/* And make it read-only accessible from the baton */
merge_b->notify_begin.nodes_with_mergeinfo = children_with_mergeinfo;
/* If we are not honoring mergeinfo we can skip right to the
business of merging changes! */
if (HONOR_MERGEINFO(merge_b))
SVN_ERR(do_mergeinfo_aware_dir_merge(result_catalog, conflict_report,
source, target_abspath,
children_with_mergeinfo,
processor, depth,
squelch_mergeinfo_notifications,
merge_b, result_pool, scratch_pool));
else
SVN_ERR(do_mergeinfo_unaware_dir_merge(conflict_report,
source, target_abspath,
children_with_mergeinfo,
processor, depth,
merge_b, result_pool, scratch_pool));
merge_b->notify_begin.nodes_with_mergeinfo = NULL;
return SVN_NO_ERROR;
}
/** Ensure that *RA_SESSION is opened to URL, either by reusing
* *RA_SESSION if it is non-null and already opened to URL's
* repository, or by allocating a new *RA_SESSION in POOL.
* (RA_SESSION itself cannot be null, of course.)
*
* CTX is used as for svn_client_open_ra_session().
*/
static svn_error_t *
ensure_ra_session_url(svn_ra_session_t **ra_session,
const char *url,
const char *wri_abspath,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
svn_error_t *err = SVN_NO_ERROR;
if (*ra_session)
{
err = svn_ra_reparent(*ra_session, url, pool);
}
/* SVN_ERR_RA_ILLEGAL_URL is raised when url doesn't point to the same
repository as ra_session. */
if (! *ra_session || (err && err->apr_err == SVN_ERR_RA_ILLEGAL_URL))
{
svn_error_clear(err);
err = svn_client_open_ra_session2(ra_session, url, wri_abspath,
ctx, pool, pool);
}
SVN_ERR(err);
return SVN_NO_ERROR;
}
/* Drive a merge of MERGE_SOURCES into working copy node TARGET
and possibly record mergeinfo describing the merge -- see
RECORD_MERGEINFO().
If MODIFIED_SUBTREES is not NULL and all the MERGE_SOURCES are 'ancestral'
or REINTEGRATE_MERGE is true, then replace *MODIFIED_SUBTREES with a new
hash containing all the paths that *MODIFIED_SUBTREES contained before,
and also every path modified, skipped, added, or tree-conflicted
by the merge. Keys and values of the hash are both (const char *)
absolute paths. The contents of the hash are allocated in RESULT_POOL.
If the merge raises any conflicts while merging a revision range, return
early and set *CONFLICT_REPORT to describe the details. (In this case,
notify that the merge is complete if and only if this was the last
revision range of the merge.) If there are no conflicts, set
*CONFLICT_REPORT to NULL. A revision range here can be one specified
in MERGE_SOURCES or an internally generated sub-range of one of those
when merge tracking is in use.
For every (const merge_source_t *) merge source in MERGE_SOURCES, if
SOURCE->ANCESTRAL is set, then the "left" and "right" side are
ancestrally related. (See 'MERGEINFO MERGE SOURCE NORMALIZATION'
for more on what that means and how it matters.)
If SOURCES_RELATED is set, the "left" and "right" sides of the
merge source are historically related (ancestors, uncles, second
cousins thrice removed, etc...). (This is passed through to
do_file_merge() to simulate the history checks that the repository
logic does in the directory case.)
SAME_REPOS is TRUE iff the merge sources live in the same
repository as the one from which the target working copy has been
checked out.
If mergeinfo is being recorded, SQUELCH_MERGEINFO_NOTIFICATIONS is FALSE,
and CTX->NOTIFY_FUNC2 is not NULL, then call CTX->NOTIFY_FUNC2 with
CTX->NOTIFY_BATON2 and a svn_wc_notify_merge_record_info_begin
notification before any mergeinfo changes are made to describe the merge
performed.
If mergeinfo is being recorded to describe this merge, and RESULT_CATALOG
is not NULL, then don't record the new mergeinfo on the WC, but instead
record it in RESULT_CATALOG, where the keys are absolute working copy
paths and the values are the new mergeinfos for each. Allocate additions
to RESULT_CATALOG in pool which RESULT_CATALOG was created in.
FORCE_DELETE, DRY_RUN, RECORD_ONLY, DEPTH, MERGE_OPTIONS,
and CTX are as described in the docstring for svn_client_merge_peg3().
If IGNORE_MERGEINFO is true, disable merge tracking, by treating the two
sources as unrelated even if they actually have a common ancestor. See
the macro HONOR_MERGEINFO().
If DIFF_IGNORE_ANCESTRY is true, diff the 'left' and 'right' versions
of a node (if they are the same kind) as if they were related, even if
they are not related. Otherwise, diff unrelated items as a deletion
of one thing and the addition of another.
If not NULL, RECORD_ONLY_PATHS is a hash of (const char *) paths mapped
to the same. If RECORD_ONLY is true and RECORD_ONLY_PATHS is not NULL,
then record mergeinfo describing the merge only on subtrees which contain
items from RECORD_ONLY_PATHS. If RECORD_ONLY is true and RECORD_ONLY_PATHS
is NULL, then record mergeinfo on every subtree with mergeinfo in
TARGET.
REINTEGRATE_MERGE is TRUE if this is a reintegrate merge.
*USE_SLEEP will be set TRUE if a sleep is required to ensure timestamp
integrity, *USE_SLEEP will be unchanged if no sleep is required.
SCRATCH_POOL is used for all temporary allocations.
*/
static svn_error_t *
do_merge(apr_hash_t **modified_subtrees,
svn_mergeinfo_catalog_t result_catalog,
conflict_report_t **conflict_report,
svn_boolean_t *use_sleep,
const apr_array_header_t *merge_sources,
const merge_target_t *target,
svn_ra_session_t *src_session,
svn_boolean_t sources_related,
svn_boolean_t same_repos,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t dry_run,
svn_boolean_t record_only,
apr_hash_t *record_only_paths,
svn_boolean_t reintegrate_merge,
svn_boolean_t squelch_mergeinfo_notifications,
svn_depth_t depth,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_cmd_baton_t merge_cmd_baton = { 0 };
svn_config_t *cfg;
const char *diff3_cmd;
const char *preserved_exts_str;
int i;
svn_boolean_t checked_mergeinfo_capability = FALSE;
svn_ra_session_t *ra_session1 = NULL, *ra_session2 = NULL;
const char *old_src_session_url = NULL;
apr_pool_t *iterpool;
const svn_diff_tree_processor_t *processor;
SVN_ERR_ASSERT(svn_dirent_is_absolute(target->abspath));
*conflict_report = NULL;
/* Check from some special conditions when in record-only mode
(which is a merge-tracking thing). */
if (record_only)
{
svn_boolean_t sources_ancestral = TRUE;
int j;
/* Find out whether all of the sources are 'ancestral'. */
for (j = 0; j < merge_sources->nelts; j++)
if (! APR_ARRAY_IDX(merge_sources, j, merge_source_t *)->ancestral)
{
sources_ancestral = FALSE;
break;
}
/* We can't do a record-only merge if the sources aren't related. */
if (! sources_ancestral)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Use of two URLs is not compatible with "
"mergeinfo modification"));
/* We can't do a record-only merge if the sources aren't from
the same repository as the target. */
if (! same_repos)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Merge from foreign repository is not "
"compatible with mergeinfo modification"));
/* If this is a dry-run record-only merge, there's nothing to do. */
if (dry_run)
return SVN_NO_ERROR;
}
iterpool = svn_pool_create(scratch_pool);
/* Ensure a known depth. */
if (depth == svn_depth_unknown)
depth = svn_depth_infinity;
/* Set up the diff3 command, so various callers don't have to. */
cfg = ctx->config
? svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG)
: NULL;
svn_config_get(cfg, &diff3_cmd, SVN_CONFIG_SECTION_HELPERS,
SVN_CONFIG_OPTION_DIFF3_CMD, NULL);
if (diff3_cmd != NULL)
SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, scratch_pool));
/* See which files the user wants to preserve the extension of when
conflict files are made. */
svn_config_get(cfg, &preserved_exts_str, SVN_CONFIG_SECTION_MISCELLANY,
SVN_CONFIG_OPTION_PRESERVED_CF_EXTS, "");
/* Build the merge context baton (or at least the parts of it that
don't need to be reset for each merge source). */
merge_cmd_baton.force_delete = force_delete;
merge_cmd_baton.dry_run = dry_run;
merge_cmd_baton.record_only = record_only;
merge_cmd_baton.ignore_mergeinfo = ignore_mergeinfo;
merge_cmd_baton.diff_ignore_ancestry = diff_ignore_ancestry;
merge_cmd_baton.same_repos = same_repos;
merge_cmd_baton.mergeinfo_capable = FALSE;
merge_cmd_baton.ctx = ctx;
merge_cmd_baton.reintegrate_merge = reintegrate_merge;
merge_cmd_baton.target = target;
merge_cmd_baton.pool = iterpool;
merge_cmd_baton.merge_options = merge_options;
merge_cmd_baton.diff3_cmd = diff3_cmd;
merge_cmd_baton.ext_patterns = *preserved_exts_str
? svn_cstring_split(preserved_exts_str, "\n\r\t\v ",
FALSE, scratch_pool)
: NULL;
merge_cmd_baton.use_sleep = use_sleep;
/* Do we already know the specific subtrees with mergeinfo we want
to record-only mergeinfo on? */
if (record_only && record_only_paths)
merge_cmd_baton.merged_abspaths = record_only_paths;
else
merge_cmd_baton.merged_abspaths = apr_hash_make(result_pool);
merge_cmd_baton.skipped_abspaths = apr_hash_make(result_pool);
merge_cmd_baton.added_abspaths = apr_hash_make(result_pool);
merge_cmd_baton.tree_conflicted_abspaths = apr_hash_make(result_pool);
{
svn_diff_tree_processor_t *merge_processor;
merge_processor = svn_diff__tree_processor_create(&merge_cmd_baton,
scratch_pool);
merge_processor->dir_opened = merge_dir_opened;
merge_processor->dir_changed = merge_dir_changed;
merge_processor->dir_added = merge_dir_added;
merge_processor->dir_deleted = merge_dir_deleted;
merge_processor->dir_closed = merge_dir_closed;
merge_processor->file_opened = merge_file_opened;
merge_processor->file_changed = merge_file_changed;
merge_processor->file_added = merge_file_added;
merge_processor->file_deleted = merge_file_deleted;
/* Not interested in file_closed() */
merge_processor->node_absent = merge_node_absent;
processor = merge_processor;
}
if (src_session)
{
SVN_ERR(svn_ra_get_session_url(src_session, &old_src_session_url,
scratch_pool));
ra_session1 = src_session;
}
for (i = 0; i < merge_sources->nelts; i++)
{
svn_node_kind_t src1_kind;
merge_source_t *source =
APR_ARRAY_IDX(merge_sources, i, merge_source_t *);
single_range_conflict_report_t *conflicted_range_report;
svn_pool_clear(iterpool);
/* Sanity check: if our left- and right-side merge sources are
the same, there's nothing to here. */
if ((strcmp(source->loc1->url, source->loc2->url) == 0)
&& (source->loc1->rev == source->loc2->rev))
continue;
/* Establish RA sessions to our URLs, reuse where possible. */
SVN_ERR(ensure_ra_session_url(&ra_session1, source->loc1->url,
target->abspath, ctx, scratch_pool));
SVN_ERR(ensure_ra_session_url(&ra_session2, source->loc2->url,
target->abspath, ctx, scratch_pool));
/* Populate the portions of the merge context baton that need to
be reset for each merge source iteration. */
merge_cmd_baton.merge_source = *source;
merge_cmd_baton.implicit_src_gap = NULL;
merge_cmd_baton.conflicted_paths = NULL;
merge_cmd_baton.paths_with_new_mergeinfo = NULL;
merge_cmd_baton.paths_with_deleted_mergeinfo = NULL;
merge_cmd_baton.ra_session1 = ra_session1;
merge_cmd_baton.ra_session2 = ra_session2;
merge_cmd_baton.notify_begin.last_abspath = NULL;
/* Populate the portions of the merge context baton that require
an RA session to set, but shouldn't be reset for each iteration. */
if (! checked_mergeinfo_capability)
{
SVN_ERR(svn_ra_has_capability(ra_session1,
&merge_cmd_baton.mergeinfo_capable,
SVN_RA_CAPABILITY_MERGEINFO,
iterpool));
checked_mergeinfo_capability = TRUE;
}
SVN_ERR(svn_ra_check_path(ra_session1, "", source->loc1->rev,
&src1_kind, iterpool));
/* Run the merge; if there are conflicts, allow the callback to
* resolve them, and if it resolves all of them, then run the
* merge again with the remaining revision range, until it is all
* done. */
do
{
/* Merge as far as possible without resolving any conflicts */
if (src1_kind != svn_node_dir)
{
SVN_ERR(do_file_merge(result_catalog, &conflicted_range_report,
source, target->abspath,
processor,
sources_related,
squelch_mergeinfo_notifications,
&merge_cmd_baton, iterpool, iterpool));
}
else /* Directory */
{
SVN_ERR(do_directory_merge(result_catalog, &conflicted_range_report,
source, target->abspath,
processor,
depth, squelch_mergeinfo_notifications,
&merge_cmd_baton, iterpool, iterpool));
}
/* Give the conflict resolver callback the opportunity to
* resolve any conflicts that were raised. If it resolves all
* of them, go around again to merge the next sub-range (if any). */
if (conflicted_range_report && ctx->conflict_func2 && ! dry_run)
{
svn_boolean_t conflicts_remain;
SVN_ERR(svn_client__resolve_conflicts(
&conflicts_remain, merge_cmd_baton.conflicted_paths,
ctx, iterpool));
if (conflicts_remain)
break;
merge_cmd_baton.conflicted_paths = NULL;
/* Caution: this source is in iterpool */
source = conflicted_range_report->remaining_source;
conflicted_range_report = NULL;
}
else
break;
}
while (source);
/* The final mergeinfo on TARGET_WCPATH may itself elide. */
if (! dry_run)
SVN_ERR(svn_client__elide_mergeinfo(target->abspath, NULL,
ctx, iterpool));
/* If conflicts occurred while merging any but the very last
* range of a multi-pass merge, we raise an error that aborts
* the merge. The user will be asked to resolve conflicts
* before merging subsequent revision ranges. */
if (conflicted_range_report)
{
*conflict_report = conflict_report_create(
target->abspath, conflicted_range_report->conflicted_range,
(i == merge_sources->nelts - 1
&& ! conflicted_range_report->remaining_source),
result_pool);
break;
}
}
if (! *conflict_report || (*conflict_report)->was_last_range)
{
/* Let everyone know we're finished here. */
notify_merge_completed(target->abspath, ctx, iterpool);
}
/* Does the caller want to know what the merge has done? */
if (modified_subtrees)
{
*modified_subtrees =
apr_hash_overlay(result_pool, *modified_subtrees,
merge_cmd_baton.merged_abspaths);
*modified_subtrees =
apr_hash_overlay(result_pool, *modified_subtrees,
merge_cmd_baton.added_abspaths);
*modified_subtrees =
apr_hash_overlay(result_pool, *modified_subtrees,
merge_cmd_baton.skipped_abspaths);
*modified_subtrees =
apr_hash_overlay(result_pool, *modified_subtrees,
merge_cmd_baton.tree_conflicted_abspaths);
}
if (src_session)
SVN_ERR(svn_ra_reparent(src_session, old_src_session_url, iterpool));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Perform a two-URL merge between URLs which are related, but neither
is a direct ancestor of the other. This first does a real two-URL
merge (unless this is record-only), followed by record-only merges
to represent the changed mergeinfo.
Set *CONFLICT_REPORT to indicate if there were any conflicts, as in
do_merge().
The diff to be merged is between SOURCE->loc1 (in URL1_RA_SESSION1)
and SOURCE->loc2 (in URL2_RA_SESSION2); YCA is their youngest
common ancestor.
SAME_REPOS must be true if and only if the source URLs are in the same
repository as the target working copy.
DIFF_IGNORE_ANCESTRY is as in do_merge().
Other arguments are as in all of the public merge APIs.
*USE_SLEEP will be set TRUE if a sleep is required to ensure timestamp
integrity, *USE_SLEEP will be unchanged if no sleep is required.
SCRATCH_POOL is used for all temporary allocations.
*/
static svn_error_t *
merge_cousins_and_supplement_mergeinfo(conflict_report_t **conflict_report,
svn_boolean_t *use_sleep,
const merge_target_t *target,
svn_ra_session_t *URL1_ra_session,
svn_ra_session_t *URL2_ra_session,
const merge_source_t *source,
const svn_client__pathrev_t *yca,
svn_boolean_t same_repos,
svn_depth_t depth,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_array_header_t *remove_sources, *add_sources;
apr_hash_t *modified_subtrees = NULL;
/* Sure we could use SCRATCH_POOL throughout this function, but since this
is a wrapper around three separate merges we'll create a subpool we can
clear between each of the three. If the merge target has a lot of
subtree mergeinfo, then this will help keep memory use in check. */
apr_pool_t *subpool = svn_pool_create(scratch_pool);
assert(session_url_is(URL1_ra_session, source->loc1->url, scratch_pool));
assert(session_url_is(URL2_ra_session, source->loc2->url, scratch_pool));
SVN_ERR_ASSERT(svn_dirent_is_absolute(target->abspath));
SVN_ERR_ASSERT(! source->ancestral);
SVN_ERR(normalize_merge_sources_internal(
&remove_sources, source->loc1,
svn_rangelist__initialize(source->loc1->rev, yca->rev, TRUE,
scratch_pool),
URL1_ra_session, ctx, scratch_pool, subpool));
SVN_ERR(normalize_merge_sources_internal(
&add_sources, source->loc2,
svn_rangelist__initialize(yca->rev, source->loc2->rev, TRUE,
scratch_pool),
URL2_ra_session, ctx, scratch_pool, subpool));
*conflict_report = NULL;
/* If this isn't a record-only merge, we'll first do a stupid
point-to-point merge... */
if (! record_only)
{
apr_array_header_t *faux_sources =
apr_array_make(scratch_pool, 1, sizeof(merge_source_t *));
modified_subtrees = apr_hash_make(scratch_pool);
APR_ARRAY_PUSH(faux_sources, const merge_source_t *) = source;
SVN_ERR(do_merge(&modified_subtrees, NULL, conflict_report, use_sleep,
faux_sources, target,
URL1_ra_session, TRUE, same_repos,
FALSE /*ignore_mergeinfo*/, diff_ignore_ancestry,
force_delete, dry_run, FALSE, NULL, TRUE,
FALSE, depth, merge_options, ctx,
scratch_pool, subpool));
if (*conflict_report)
{
*conflict_report = conflict_report_dup(*conflict_report, result_pool);
if (! (*conflict_report)->was_last_range)
return SVN_NO_ERROR;
}
}
else if (! same_repos)
{
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Merge from foreign repository is not "
"compatible with mergeinfo modification"));
}
/* ... and now, if we're doing the mergeinfo thang, we execute a
pair of record-only merges using the real sources we've
calculated.
Issue #3648: We don't actually perform these two record-only merges
on the WC at first, but rather see what each would do and store that
in two mergeinfo catalogs. We then merge the catalogs together and
then record the result in the WC. This prevents the second record
only merge from removing legitimate mergeinfo history, from the same
source, that was made in prior merges. */
if (same_repos && !dry_run)
{
svn_mergeinfo_catalog_t add_result_catalog =
apr_hash_make(scratch_pool);
svn_mergeinfo_catalog_t remove_result_catalog =
apr_hash_make(scratch_pool);
notify_mergeinfo_recording(target->abspath, NULL, ctx, scratch_pool);
svn_pool_clear(subpool);
SVN_ERR(do_merge(NULL, add_result_catalog, conflict_report, use_sleep,
add_sources, target,
URL1_ra_session, TRUE, same_repos,
FALSE /*ignore_mergeinfo*/, diff_ignore_ancestry,
force_delete, dry_run, TRUE,
modified_subtrees, TRUE,
TRUE, depth, merge_options, ctx,
scratch_pool, subpool));
if (*conflict_report)
{
*conflict_report = conflict_report_dup(*conflict_report, result_pool);
if (! (*conflict_report)->was_last_range)
return SVN_NO_ERROR;
}
svn_pool_clear(subpool);
SVN_ERR(do_merge(NULL, remove_result_catalog, conflict_report, use_sleep,
remove_sources, target,
URL1_ra_session, TRUE, same_repos,
FALSE /*ignore_mergeinfo*/, diff_ignore_ancestry,
force_delete, dry_run, TRUE,
modified_subtrees, TRUE,
TRUE, depth, merge_options, ctx,
scratch_pool, subpool));
if (*conflict_report)
{
*conflict_report = conflict_report_dup(*conflict_report, result_pool);
if (! (*conflict_report)->was_last_range)
return SVN_NO_ERROR;
}
SVN_ERR(svn_mergeinfo_catalog_merge(add_result_catalog,
remove_result_catalog,
scratch_pool, scratch_pool));
SVN_ERR(svn_client__record_wc_mergeinfo_catalog(add_result_catalog,
ctx, scratch_pool));
}
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
/* Perform checks to determine whether the working copy at TARGET_ABSPATH
* can safely be used as a merge target. Checks are performed according to
* the ALLOW_MIXED_REV, ALLOW_LOCAL_MODS, and ALLOW_SWITCHED_SUBTREES
* parameters. If any checks fail, raise SVN_ERR_CLIENT_NOT_READY_TO_MERGE.
*
* E.g. if all the ALLOW_* parameters are FALSE, TARGET_ABSPATH must
* be a single-revision, pristine, unswitched working copy.
* In other words, it must reflect a subtree of the repository as found
* at single revision -- although sparse checkouts are permitted. */
static svn_error_t *
ensure_wc_is_suitable_merge_target(const char *target_abspath,
svn_client_ctx_t *ctx,
svn_boolean_t allow_mixed_rev,
svn_boolean_t allow_local_mods,
svn_boolean_t allow_switched_subtrees,
apr_pool_t *scratch_pool)
{
svn_node_kind_t target_kind;
/* Check the target exists. */
SVN_ERR(svn_io_check_path(target_abspath, &target_kind, scratch_pool));
if (target_kind == svn_node_none)
return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
_("Path '%s' does not exist"),
svn_dirent_local_style(target_abspath,
scratch_pool));
SVN_ERR(svn_wc_read_kind2(&target_kind, ctx->wc_ctx, target_abspath,
FALSE, FALSE, scratch_pool));
if (target_kind != svn_node_dir && target_kind != svn_node_file)
return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
_("Merge target '%s' does not exist in the "
"working copy"), target_abspath);
/* Perform the mixed-revision check first because it's the cheapest one. */
if (! allow_mixed_rev)
{
svn_revnum_t min_rev;
svn_revnum_t max_rev;
SVN_ERR(svn_client_min_max_revisions(&min_rev, &max_rev, target_abspath,
FALSE, ctx, scratch_pool));
if (!(SVN_IS_VALID_REVNUM(min_rev) && SVN_IS_VALID_REVNUM(max_rev)))
{
svn_boolean_t is_added;
/* Allow merge into added nodes. */
SVN_ERR(svn_wc__node_is_added(&is_added, ctx->wc_ctx, target_abspath,
scratch_pool));
if (is_added)
return SVN_NO_ERROR;
else
return svn_error_create(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("Cannot determine revision of working "
"copy"));
}
if (min_rev != max_rev)
return svn_error_createf(SVN_ERR_CLIENT_MERGE_UPDATE_REQUIRED, NULL,
_("Cannot merge into mixed-revision working "
"copy [%ld:%ld]; try updating first"),
min_rev, max_rev);
}
/* Next, check for switched subtrees. */
if (! allow_switched_subtrees)
{
svn_boolean_t is_switched;
SVN_ERR(svn_wc__has_switched_subtrees(&is_switched, ctx->wc_ctx,
target_abspath, NULL,
scratch_pool));
if (is_switched)
return svn_error_create(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("Cannot merge into a working copy "
"with a switched subtree"));
}
/* This is the most expensive check, so it is performed last.*/
if (! allow_local_mods)
{
svn_boolean_t is_modified;
SVN_ERR(svn_wc__has_local_mods(&is_modified, ctx->wc_ctx,
target_abspath, TRUE,
ctx->cancel_func,
ctx->cancel_baton,
scratch_pool));
if (is_modified)
return svn_error_create(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("Cannot merge into a working copy "
"that has local modifications"));
}
return SVN_NO_ERROR;
}
/* Throw an error if PATH_OR_URL is a path and REVISION isn't a repository
* revision. */
static svn_error_t *
ensure_wc_path_has_repo_revision(const char *path_or_url,
const svn_opt_revision_t *revision,
apr_pool_t *scratch_pool)
{
if (revision->kind != svn_opt_revision_number
&& revision->kind != svn_opt_revision_date
&& revision->kind != svn_opt_revision_head
&& ! svn_path_is_url(path_or_url))
return svn_error_createf(
SVN_ERR_CLIENT_BAD_REVISION, NULL,
_("Invalid merge source '%s'; a working copy path can only be "
"used with a repository revision (a number, a date, or head)"),
svn_dirent_local_style(path_or_url, scratch_pool));
return SVN_NO_ERROR;
}
/* "Open" the target WC for a merge. That means:
* - find out its exact repository location
* - check the WC for suitability (throw an error if unsuitable)
*
* Set *TARGET_P to a new, fully initialized, target description structure.
*
* ALLOW_MIXED_REV, ALLOW_LOCAL_MODS, ALLOW_SWITCHED_SUBTREES determine
* whether the WC is deemed suitable; see ensure_wc_is_suitable_merge_target()
* for details.
*
* If the node is locally added, the rev and URL will be null/invalid. Some
* kinds of merge can use such a target; others can't.
*/
static svn_error_t *
open_target_wc(merge_target_t **target_p,
const char *wc_abspath,
svn_boolean_t allow_mixed_rev,
svn_boolean_t allow_local_mods,
svn_boolean_t allow_switched_subtrees,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_target_t *target = apr_palloc(result_pool, sizeof(*target));
svn_client__pathrev_t *origin;
target->abspath = apr_pstrdup(result_pool, wc_abspath);
SVN_ERR(svn_client__wc_node_get_origin(&origin, wc_abspath, ctx,
result_pool, scratch_pool));
if (origin)
{
target->loc = *origin;
}
else
{
svn_error_t *err;
/* The node has no location in the repository. It's unversioned or
* locally added or locally deleted.
*
* If it's locally added or deleted, find the repository root
* URL and UUID anyway, and leave the node URL and revision as NULL
* and INVALID. If it's unversioned, this will throw an error. */
err = svn_wc__node_get_repos_info(NULL, NULL,
&target->loc.repos_root_url,
&target->loc.repos_uuid,
ctx->wc_ctx, wc_abspath,
result_pool, scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND
&& err->apr_err != SVN_ERR_WC_NOT_WORKING_COPY
&& err->apr_err != SVN_ERR_WC_UPGRADE_REQUIRED)
return svn_error_trace(err);
return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, err,
_("Merge target '%s' does not exist in the "
"working copy"),
svn_dirent_local_style(wc_abspath,
scratch_pool));
}
target->loc.rev = SVN_INVALID_REVNUM;
target->loc.url = NULL;
}
SVN_ERR(ensure_wc_is_suitable_merge_target(
wc_abspath, ctx,
allow_mixed_rev, allow_local_mods, allow_switched_subtrees,
scratch_pool));
*target_p = target;
return SVN_NO_ERROR;
}
/*-----------------------------------------------------------------------*/
/*** Public APIs ***/
/* The body of svn_client_merge5(), which see for details.
*
* If SOURCE1 @ REVISION1 is related to SOURCE2 @ REVISION2 then use merge
* tracking (subject to other constraints -- see HONOR_MERGEINFO());
* otherwise disable merge tracking.
*
* IGNORE_MERGEINFO and DIFF_IGNORE_ANCESTRY are as in do_merge().
*/
static svn_error_t *
merge_locked(conflict_report_t **conflict_report,
const char *source1,
const svn_opt_revision_t *revision1,
const char *source2,
const svn_opt_revision_t *revision2,
const char *target_abspath,
svn_depth_t depth,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
svn_boolean_t allow_mixed_rev,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_target_t *target;
svn_client__pathrev_t *source1_loc, *source2_loc;
svn_boolean_t sources_related = FALSE;
svn_ra_session_t *ra_session1, *ra_session2;
apr_array_header_t *merge_sources;
svn_error_t *err;
svn_boolean_t use_sleep = FALSE;
svn_client__pathrev_t *yca = NULL;
apr_pool_t *sesspool;
svn_boolean_t same_repos;
/* ### FIXME: This function really ought to do a history check on
the left and right sides of the merge source, and -- if one is an
ancestor of the other -- just call svn_client_merge_peg3() with
the appropriate args. */
SVN_ERR(open_target_wc(&target, target_abspath,
allow_mixed_rev, TRUE, TRUE,
ctx, scratch_pool, scratch_pool));
/* Open RA sessions to both sides of our merge source, and resolve URLs
* and revisions. */
sesspool = svn_pool_create(scratch_pool);
SVN_ERR(svn_client__ra_session_from_path2(
&ra_session1, &source1_loc,
source1, NULL, revision1, revision1, ctx, sesspool));
SVN_ERR(svn_client__ra_session_from_path2(
&ra_session2, &source2_loc,
source2, NULL, revision2, revision2, ctx, sesspool));
/* We can't do a diff between different repositories. */
/* ### We should also insist that the root URLs of the two sources match,
* as we are only carrying around a single source-repos-root from now
* on, and URL calculations will go wrong if they differ.
* Alternatively, teach the code to cope with differing root URLs. */
SVN_ERR(check_same_repos(source1_loc, source1_loc->url,
source2_loc, source2_loc->url,
FALSE /* strict_urls */, scratch_pool));
/* Do our working copy and sources come from the same repository? */
same_repos = is_same_repos(&target->loc, source1_loc, TRUE /* strict_urls */);
/* Unless we're ignoring ancestry, see if the two sources are related. */
if (! ignore_mergeinfo)
SVN_ERR(svn_client__get_youngest_common_ancestor(
&yca, source1_loc, source2_loc, ra_session1, ctx,
scratch_pool, scratch_pool));
/* Check for a youngest common ancestor. If we have one, we'll be
doing merge tracking.
So, given a requested merge of the differences between A and
B, and a common ancestor of C, we will find ourselves in one of
four positions, and four different approaches:
A == B == C there's nothing to merge
A == C != B we merge the changes between A (or C) and B
B == C != A we merge the changes between B (or C) and A
A != B != C we merge the changes between A and B without
merge recording, then record-only two merges:
from A to C, and from C to B
*/
if (yca)
{
/* Note that our merge sources are related. */
sources_related = TRUE;
/* If the common ancestor matches the right side of our merge,
then we only need to reverse-merge the left side. */
if ((strcmp(yca->url, source2_loc->url) == 0)
&& (yca->rev == source2_loc->rev))
{
SVN_ERR(normalize_merge_sources_internal(
&merge_sources, source1_loc,
svn_rangelist__initialize(source1_loc->rev, yca->rev, TRUE,
scratch_pool),
ra_session1, ctx, scratch_pool, scratch_pool));
}
/* If the common ancestor matches the left side of our merge,
then we only need to merge the right side. */
else if ((strcmp(yca->url, source1_loc->url) == 0)
&& (yca->rev == source1_loc->rev))
{
SVN_ERR(normalize_merge_sources_internal(
&merge_sources, source2_loc,
svn_rangelist__initialize(yca->rev, source2_loc->rev, TRUE,
scratch_pool),
ra_session2, ctx, scratch_pool, scratch_pool));
}
/* And otherwise, we need to do both: reverse merge the left
side, and merge the right. */
else
{
merge_source_t source;
source.loc1 = source1_loc;
source.loc2 = source2_loc;
source.ancestral = FALSE;
err = merge_cousins_and_supplement_mergeinfo(conflict_report,
&use_sleep,
target,
ra_session1,
ra_session2,
&source,
yca,
same_repos,
depth,
diff_ignore_ancestry,
force_delete,
record_only, dry_run,
merge_options,
ctx,
result_pool,
scratch_pool);
/* Close our temporary RA sessions (this could've happened
after the second call to normalize_merge_sources() inside
the merge_cousins_and_supplement_mergeinfo() routine). */
svn_pool_destroy(sesspool);
if (use_sleep)
svn_io_sleep_for_timestamps(target->abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
}
else
{
/* Build a single-item merge_source_t array. */
merge_sources = apr_array_make(scratch_pool, 1, sizeof(merge_source_t *));
APR_ARRAY_PUSH(merge_sources, merge_source_t *)
= merge_source_create(source1_loc, source2_loc, FALSE, scratch_pool);
}
err = do_merge(NULL, NULL, conflict_report, &use_sleep,
merge_sources, target,
ra_session1, sources_related, same_repos,
ignore_mergeinfo, diff_ignore_ancestry, force_delete, dry_run,
record_only, NULL, FALSE, FALSE, depth, merge_options,
ctx, result_pool, scratch_pool);
/* Close our temporary RA sessions. */
svn_pool_destroy(sesspool);
if (use_sleep)
svn_io_sleep_for_timestamps(target->abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
/* Set *TARGET_ABSPATH to the absolute path of, and *LOCK_ABSPATH to
the absolute path to lock for, TARGET_WCPATH. */
static svn_error_t *
get_target_and_lock_abspath(const char **target_abspath,
const char **lock_abspath,
const char *target_wcpath,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool)
{
svn_node_kind_t kind;
SVN_ERR(svn_dirent_get_absolute(target_abspath, target_wcpath,
result_pool));
SVN_ERR(svn_wc_read_kind2(&kind, ctx->wc_ctx, *target_abspath,
FALSE, FALSE, result_pool));
if (kind == svn_node_dir)
*lock_abspath = *target_abspath;
else
*lock_abspath = svn_dirent_dirname(*target_abspath, result_pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_client_merge5(const char *source1,
const svn_opt_revision_t *revision1,
const char *source2,
const svn_opt_revision_t *revision2,
const char *target_wcpath,
svn_depth_t depth,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
svn_boolean_t allow_mixed_rev,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
const char *target_abspath, *lock_abspath;
conflict_report_t *conflict_report;
/* Sanity check our input -- we require specified revisions,
* and either 2 paths or 2 URLs. */
if ((revision1->kind == svn_opt_revision_unspecified)
|| (revision2->kind == svn_opt_revision_unspecified))
return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL,
_("Not all required revisions are specified"));
if (svn_path_is_url(source1) != svn_path_is_url(source2))
return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
_("Merge sources must both be "
"either paths or URLs"));
/* A WC path must be used with a repository revision, as we can't
* (currently) use the WC itself as a source, we can only read the URL
* from it and use that. */
SVN_ERR(ensure_wc_path_has_repo_revision(source1, revision1, pool));
SVN_ERR(ensure_wc_path_has_repo_revision(source2, revision2, pool));
SVN_ERR(get_target_and_lock_abspath(&target_abspath, &lock_abspath,
target_wcpath, ctx, pool));
if (!dry_run)
SVN_WC__CALL_WITH_WRITE_LOCK(
merge_locked(&conflict_report,
source1, revision1, source2, revision2,
target_abspath, depth, ignore_mergeinfo,
diff_ignore_ancestry,
force_delete, record_only, dry_run,
allow_mixed_rev, merge_options, ctx, pool, pool),
ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
else
SVN_ERR(merge_locked(&conflict_report,
source1, revision1, source2, revision2,
target_abspath, depth, ignore_mergeinfo,
diff_ignore_ancestry,
force_delete, record_only, dry_run,
allow_mixed_rev, merge_options, ctx, pool, pool));
SVN_ERR(make_merge_conflict_error(conflict_report, pool));
return SVN_NO_ERROR;
}
/* Check if mergeinfo for a given path is described explicitly or via
inheritance in a mergeinfo catalog.
If REPOS_REL_PATH exists in CATALOG and has mergeinfo containing
MERGEINFO, then set *IN_CATALOG to TRUE. If REPOS_REL_PATH does
not exist in CATALOG, then find its nearest parent which does exist.
If the mergeinfo REPOS_REL_PATH would inherit from that parent
contains MERGEINFO then set *IN_CATALOG to TRUE. Set *IN_CATALOG
to FALSE in all other cases.
Set *CAT_KEY_PATH to the key path in CATALOG for REPOS_REL_PATH's
explicit or inherited mergeinfo. If no explicit or inherited mergeinfo
is found for REPOS_REL_PATH then set *CAT_KEY_PATH to NULL.
User RESULT_POOL to allocate *CAT_KEY_PATH. Use SCRATCH_POOL for
temporary allocations. */
static svn_error_t *
mergeinfo_in_catalog(svn_boolean_t *in_catalog,
const char **cat_key_path,
const char *repos_rel_path,
svn_mergeinfo_t mergeinfo,
svn_mergeinfo_catalog_t catalog,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *walk_path = NULL;
*in_catalog = FALSE;
*cat_key_path = NULL;
if (mergeinfo && catalog && apr_hash_count(catalog))
{
const char *path = repos_rel_path;
/* Start with the assumption there is no explicit or inherited
mergeinfo for REPOS_REL_PATH in CATALOG. */
svn_mergeinfo_t mergeinfo_in_cat = NULL;
while (1)
{
mergeinfo_in_cat = svn_hash_gets(catalog, path);
if (mergeinfo_in_cat) /* Found it! */
{
*cat_key_path = apr_pstrdup(result_pool, path);
break;
}
else /* Look for inherited mergeinfo. */
{
walk_path = svn_relpath_join(svn_relpath_basename(path,
scratch_pool),
walk_path ? walk_path : "",
scratch_pool);
path = svn_relpath_dirname(path, scratch_pool);
if (path[0] == '\0') /* No mergeinfo to inherit. */
break;
}
}
if (mergeinfo_in_cat)
{
if (walk_path)
SVN_ERR(svn_mergeinfo__add_suffix_to_mergeinfo(&mergeinfo_in_cat,
mergeinfo_in_cat,
walk_path,
scratch_pool,
scratch_pool));
SVN_ERR(svn_mergeinfo_intersect2(&mergeinfo_in_cat,
mergeinfo_in_cat, mergeinfo,
TRUE,
scratch_pool, scratch_pool));
SVN_ERR(svn_mergeinfo__equals(in_catalog, mergeinfo_in_cat,
mergeinfo, TRUE, scratch_pool));
}
}
return SVN_NO_ERROR;
}
/* A svn_log_entry_receiver_t baton for log_find_operative_revs(). */
typedef struct log_find_operative_baton_t
{
/* The catalog of explicit mergeinfo on a reintegrate source. */
svn_mergeinfo_catalog_t merged_catalog;
/* The catalog of unmerged history from the reintegrate target to
the source which we will create. Allocated in RESULT_POOL. */
svn_mergeinfo_catalog_t unmerged_catalog;
/* The repository absolute path of the reintegrate target. */
const char *target_fspath;
/* The path of the reintegrate source relative to the repository root. */
const char *source_repos_rel_path;
apr_pool_t *result_pool;
} log_find_operative_baton_t;
/* A svn_log_entry_receiver_t callback for find_unsynced_ranges(). */
static svn_error_t *
log_find_operative_revs(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
log_find_operative_baton_t *log_baton = baton;
apr_hash_index_t *hi;
svn_revnum_t revision;
/* It's possible that authz restrictions on the merge source prevent us
from knowing about any of the changes for LOG_ENTRY->REVISION. */
if (!log_entry->changed_paths2)
return SVN_NO_ERROR;
revision = log_entry->revision;
for (hi = apr_hash_first(pool, log_entry->changed_paths2);
hi;
hi = apr_hash_next(hi))
{
const char *subtree_missing_this_rev;
const char *path = apr_hash_this_key(hi);
const char *rel_path;
const char *source_rel_path;
svn_boolean_t in_catalog;
svn_mergeinfo_t log_entry_as_mergeinfo;
rel_path = svn_fspath__skip_ancestor(log_baton->target_fspath, path);
/* Easy out: The path is not within the tree of interest. */
if (rel_path == NULL)
continue;
source_rel_path = svn_relpath_join(log_baton->source_repos_rel_path,
rel_path, pool);
SVN_ERR(svn_mergeinfo_parse(&log_entry_as_mergeinfo,
apr_psprintf(pool, "%s:%ld",
path, revision),
pool));
SVN_ERR(mergeinfo_in_catalog(&in_catalog, &subtree_missing_this_rev,
source_rel_path, log_entry_as_mergeinfo,
log_baton->merged_catalog,
pool, pool));
if (!in_catalog)
{
svn_mergeinfo_t unmerged_for_key;
const char *suffix, *missing_path;
/* If there is no mergeinfo on the source tree we'll say
the "subtree" missing this revision is the root of the
source. */
if (!subtree_missing_this_rev)
subtree_missing_this_rev = log_baton->source_repos_rel_path;
suffix = svn_relpath_skip_ancestor(subtree_missing_this_rev,
source_rel_path);
if (suffix && suffix[0] != '\0')
{
missing_path = apr_pstrmemdup(pool, path,
strlen(path) - strlen(suffix) - 1);
}
else
{
missing_path = path;
}
SVN_ERR(svn_mergeinfo_parse(&log_entry_as_mergeinfo,
apr_psprintf(pool, "%s:%ld",
missing_path, revision),
log_baton->result_pool));
unmerged_for_key = svn_hash_gets(log_baton->unmerged_catalog,
subtree_missing_this_rev);
if (unmerged_for_key)
{
SVN_ERR(svn_mergeinfo_merge2(unmerged_for_key,
log_entry_as_mergeinfo,
log_baton->result_pool,
pool));
}
else
{
svn_hash_sets(log_baton->unmerged_catalog,
apr_pstrdup(log_baton->result_pool,
subtree_missing_this_rev),
log_entry_as_mergeinfo);
}
}
}
return SVN_NO_ERROR;
}
/* Determine if the mergeinfo on a reintegrate source SOURCE_LOC,
reflects that the source is fully synced with the reintegrate target
TARGET_LOC, even if a naive interpretation of the source's
mergeinfo says otherwise -- See issue #3577.
UNMERGED_CATALOG represents the history (as mergeinfo) from
TARGET_LOC that is not represented in SOURCE_LOC's
explicit/inherited mergeinfo as represented by MERGED_CATALOG.
MERGED_CATALOG may be empty if the source has no explicit or inherited
mergeinfo.
Check that all of the unmerged revisions in UNMERGED_CATALOG's
mergeinfos are "phantoms", that is, one of the following conditions holds:
1) The revision affects no corresponding paths in SOURCE_LOC.
2) The revision affects corresponding paths in SOURCE_LOC,
but based on the mergeinfo in MERGED_CATALOG, the change was
previously merged.
Make a deep copy, allocated in RESULT_POOL, of any portions of
UNMERGED_CATALOG that are not phantoms, to TRUE_UNMERGED_CATALOG.
Note: The keys in all mergeinfo catalogs used here are relative to the
root of the repository.
RA_SESSION is an RA session open to the repository of TARGET_LOC; it may
be temporarily reparented within this function.
Use SCRATCH_POOL for all temporary allocations. */
static svn_error_t *
find_unsynced_ranges(const svn_client__pathrev_t *source_loc,
const svn_client__pathrev_t *target_loc,
svn_mergeinfo_catalog_t unmerged_catalog,
svn_mergeinfo_catalog_t merged_catalog,
svn_mergeinfo_catalog_t true_unmerged_catalog,
svn_ra_session_t *ra_session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_rangelist_t *potentially_unmerged_ranges = NULL;
/* Convert all the unmerged history to a rangelist. */
if (apr_hash_count(unmerged_catalog))
{
apr_hash_index_t *hi_catalog;
potentially_unmerged_ranges =
apr_array_make(scratch_pool, 1, sizeof(svn_merge_range_t *));
for (hi_catalog = apr_hash_first(scratch_pool, unmerged_catalog);
hi_catalog;
hi_catalog = apr_hash_next(hi_catalog))
{
svn_mergeinfo_t mergeinfo = apr_hash_this_val(hi_catalog);
SVN_ERR(svn_rangelist__merge_many(potentially_unmerged_ranges,
mergeinfo,
scratch_pool, scratch_pool));
}
}
/* Find any unmerged revisions which both affect the source and
are not yet merged to it. */
if (potentially_unmerged_ranges)
{
svn_revnum_t oldest_rev =
(APR_ARRAY_IDX(potentially_unmerged_ranges,
0,
svn_merge_range_t *))->start + 1;
svn_revnum_t youngest_rev =
(APR_ARRAY_IDX(potentially_unmerged_ranges,
potentially_unmerged_ranges->nelts - 1,
svn_merge_range_t *))->end;
log_find_operative_baton_t log_baton;
- const char *old_session_url;
+ const char *old_session_url = NULL;
svn_error_t *err;
log_baton.merged_catalog = merged_catalog;
log_baton.unmerged_catalog = true_unmerged_catalog;
log_baton.source_repos_rel_path
= svn_client__pathrev_relpath(source_loc, scratch_pool);
log_baton.target_fspath
= svn_client__pathrev_fspath(target_loc, scratch_pool);
log_baton.result_pool = result_pool;
- SVN_ERR(svn_client__ensure_ra_session_url(
- &old_session_url, ra_session, target_loc->url, scratch_pool));
+ /* Reparent the session to TARGET_LOC if this target location
+ * exists within the unmerged revision range. */
+ if (target_loc->rev <= youngest_rev && target_loc->rev >= oldest_rev)
+ SVN_ERR(svn_client__ensure_ra_session_url(
+ &old_session_url, ra_session, target_loc->url, scratch_pool));
+
err = get_log(ra_session, "", youngest_rev, oldest_rev,
TRUE, /* discover_changed_paths */
log_find_operative_revs, &log_baton,
scratch_pool);
- SVN_ERR(svn_error_compose_create(
- err, svn_ra_reparent(ra_session, old_session_url, scratch_pool)));
+ if (old_session_url)
+ err = svn_error_compose_create(err,
+ svn_ra_reparent(ra_session,
+ old_session_url,
+ scratch_pool));
+ SVN_ERR(err);
}
return SVN_NO_ERROR;
}
/* Find the youngest revision that has been merged from target to source.
*
* If any location in TARGET_HISTORY_AS_MERGEINFO is mentioned in
* SOURCE_MERGEINFO, then we know that at least one merge was done from the
* target to the source. In that case, set *YOUNGEST_MERGED_REV to the
* youngest revision of that intersection (unless *YOUNGEST_MERGED_REV is
* already younger than that). Otherwise, leave *YOUNGEST_MERGED_REV alone.
*/
static svn_error_t *
find_youngest_merged_rev(svn_revnum_t *youngest_merged_rev,
svn_mergeinfo_t target_history_as_mergeinfo,
svn_mergeinfo_t source_mergeinfo,
apr_pool_t *scratch_pool)
{
svn_mergeinfo_t explicit_source_target_history_intersection;
SVN_ERR(svn_mergeinfo_intersect2(
&explicit_source_target_history_intersection,
source_mergeinfo, target_history_as_mergeinfo, TRUE,
scratch_pool, scratch_pool));
if (apr_hash_count(explicit_source_target_history_intersection))
{
svn_revnum_t old_rev, young_rev;
/* Keep track of the youngest revision merged from target to source. */
SVN_ERR(svn_mergeinfo__get_range_endpoints(
&young_rev, &old_rev,
explicit_source_target_history_intersection, scratch_pool));
if (!SVN_IS_VALID_REVNUM(*youngest_merged_rev)
|| (young_rev > *youngest_merged_rev))
*youngest_merged_rev = young_rev;
}
return SVN_NO_ERROR;
}
/* Set *FILTERED_MERGEINFO_P to the parts of TARGET_HISTORY_AS_MERGEINFO
* that are not present in the source branch.
*
* SOURCE_MERGEINFO is the explicit or inherited mergeinfo of the source
* branch SOURCE_PATHREV. Extend SOURCE_MERGEINFO, modifying it in
* place, to include the natural history (implicit mergeinfo) of
* SOURCE_PATHREV. ### But make these additions in SCRATCH_POOL.
*
* SOURCE_RA_SESSION is an RA session open to the repository containing
* SOURCE_PATHREV; it may be temporarily reparented within this function.
*
* ### [JAF] This function is named '..._subroutine' simply because I
* factored it out based on code similarity, without knowing what it's
* purpose is. We should clarify its purpose and choose a better name.
*/
static svn_error_t *
find_unmerged_mergeinfo_subroutine(svn_mergeinfo_t *filtered_mergeinfo_p,
svn_mergeinfo_t target_history_as_mergeinfo,
svn_mergeinfo_t source_mergeinfo,
const svn_client__pathrev_t *source_pathrev,
svn_ra_session_t *source_ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_mergeinfo_t source_history_as_mergeinfo;
/* Get the source path's natural history and merge it into source
path's explicit or inherited mergeinfo. */
SVN_ERR(svn_client__get_history_as_mergeinfo(
&source_history_as_mergeinfo, NULL /* has_rev_zero_history */,
source_pathrev, source_pathrev->rev, SVN_INVALID_REVNUM,
source_ra_session, ctx, scratch_pool));
SVN_ERR(svn_mergeinfo_merge2(source_mergeinfo,
source_history_as_mergeinfo,
scratch_pool, scratch_pool));
/* Now source_mergeinfo represents everything we know about
source_path's history. Now we need to know what part, if any, of the
corresponding target's history is *not* part of source_path's total
history; because it is neither shared history nor was it ever merged
from the target to the source. */
SVN_ERR(svn_mergeinfo_remove2(filtered_mergeinfo_p,
source_mergeinfo,
target_history_as_mergeinfo, TRUE,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Helper for calculate_left_hand_side() which produces a mergeinfo catalog
describing what parts of of the reintegrate target have not previously been
merged to the reintegrate source.
SOURCE_CATALOG is the collection of explicit mergeinfo on SOURCE_LOC and
all its children, i.e. the mergeinfo catalog for the reintegrate source.
TARGET_HISTORY_HASH is a hash of (const char *) paths mapped to
svn_mergeinfo_t representing the location history. Each of these
path keys represent a path in the reintegrate target, relative to the
repository root, which has explicit mergeinfo and/or is the reintegrate
target itself. The svn_mergeinfo_t's contain the natural history of each
path@TARGET_REV. Effectively this is the mergeinfo catalog on the
reintegrate target.
YC_ANCESTOR_REV is the revision of the youngest common ancestor of the
reintegrate source and the reintegrate target.
SOURCE_LOC is the reintegrate source.
SOURCE_RA_SESSION is a session opened to the URL of SOURCE_LOC
and TARGET_RA_SESSION is open to TARGET->loc.url.
For each entry in TARGET_HISTORY_HASH check that the history it
represents is contained in either the explicit mergeinfo for the
corresponding path in SOURCE_CATALOG, the corresponding path's inherited
mergeinfo (if no explicit mergeinfo for the path is found in
SOURCE_CATALOG), or the corresponding path's natural history. Populate
*UNMERGED_TO_SOURCE_CATALOG with the corresponding source paths mapped to
the mergeinfo from the target's natural history which is *not* found. Also
include any mergeinfo from SOURCE_CATALOG which explicitly describes the
target's history but for which *no* entry was found in
TARGET_HISTORY_HASH.
If no part of TARGET_HISTORY_HASH is found in SOURCE_CATALOG set
*YOUNGEST_MERGED_REV to SVN_INVALID_REVNUM; otherwise set it to the youngest
revision previously merged from the target to the source, and filter
*UNMERGED_TO_SOURCE_CATALOG so that it contains no ranges greater than
*YOUNGEST_MERGED_REV.
*UNMERGED_TO_SOURCE_CATALOG is (deeply) allocated in RESULT_POOL.
SCRATCH_POOL is used for all temporary allocations. */
static svn_error_t *
find_unmerged_mergeinfo(svn_mergeinfo_catalog_t *unmerged_to_source_catalog,
svn_revnum_t *youngest_merged_rev,
svn_revnum_t yc_ancestor_rev,
svn_mergeinfo_catalog_t source_catalog,
apr_hash_t *target_history_hash,
const svn_client__pathrev_t *source_loc,
const merge_target_t *target,
svn_ra_session_t *source_ra_session,
svn_ra_session_t *target_ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *source_repos_rel_path
= svn_client__pathrev_relpath(source_loc, scratch_pool);
const char *target_repos_rel_path
= svn_client__pathrev_relpath(&target->loc, scratch_pool);
apr_hash_index_t *hi;
svn_mergeinfo_catalog_t new_catalog = apr_hash_make(result_pool);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
assert(session_url_is(source_ra_session, source_loc->url, scratch_pool));
assert(session_url_is(target_ra_session, target->loc.url, scratch_pool));
*youngest_merged_rev = SVN_INVALID_REVNUM;
/* Examine the natural history of each path in the reintegrate target
with explicit mergeinfo. */
for (hi = apr_hash_first(scratch_pool, target_history_hash);
hi;
hi = apr_hash_next(hi))
{
const char *target_path = apr_hash_this_key(hi);
svn_mergeinfo_t target_history_as_mergeinfo = apr_hash_this_val(hi);
const char *path_rel_to_session
= svn_relpath_skip_ancestor(target_repos_rel_path, target_path);
const char *source_path;
svn_client__pathrev_t *source_pathrev;
svn_mergeinfo_t source_mergeinfo, filtered_mergeinfo;
svn_pool_clear(iterpool);
source_path = svn_relpath_join(source_repos_rel_path,
path_rel_to_session, iterpool);
source_pathrev = svn_client__pathrev_join_relpath(
source_loc, path_rel_to_session, iterpool);
/* Remove any target history that is also part of the source's history,
i.e. their common ancestry. By definition this has already been
"merged" from the target to the source. If the source has explicit
self referential mergeinfo it would intersect with the target's
history below, making it appear that some merges had been done from
the target to the source, when this might not actually be the case. */
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
&target_history_as_mergeinfo, target_history_as_mergeinfo,
source_loc->rev, yc_ancestor_rev, TRUE, iterpool, iterpool));
/* Look for any explicit mergeinfo on the source path corresponding to
the target path. If we find any remove that from SOURCE_CATALOG.
When this iteration over TARGET_HISTORY_HASH is complete all that
should be left in SOURCE_CATALOG are subtrees that have explicit
mergeinfo on the reintegrate source where there is no corresponding
explicit mergeinfo on the reintegrate target. */
source_mergeinfo = svn_hash_gets(source_catalog, source_path);
if (source_mergeinfo)
{
svn_hash_sets(source_catalog, source_path, NULL);
SVN_ERR(find_youngest_merged_rev(youngest_merged_rev,
target_history_as_mergeinfo,
source_mergeinfo,
iterpool));
}
else
{
/* There is no mergeinfo on source_path *or* source_path doesn't
exist at all. If simply doesn't exist we can ignore it
altogether. */
svn_node_kind_t kind;
SVN_ERR(svn_ra_check_path(source_ra_session,
path_rel_to_session,
source_loc->rev, &kind, iterpool));
if (kind == svn_node_none)
continue;
/* Else source_path does exist though it has no explicit mergeinfo.
Find its inherited mergeinfo. If it doesn't have any then simply
set source_mergeinfo to an empty hash. */
SVN_ERR(svn_client__get_repos_mergeinfo(
&source_mergeinfo, source_ra_session,
source_pathrev->url, source_pathrev->rev,
svn_mergeinfo_inherited, FALSE /*squelch_incapable*/,
iterpool));
if (!source_mergeinfo)
source_mergeinfo = apr_hash_make(iterpool);
}
/* Use scratch_pool rather than iterpool because filtered_mergeinfo
is going into new_catalog below and needs to last to the end of
this function. */
SVN_ERR(find_unmerged_mergeinfo_subroutine(
&filtered_mergeinfo, target_history_as_mergeinfo,
source_mergeinfo, source_pathrev,
source_ra_session, ctx, scratch_pool, iterpool));
svn_hash_sets(new_catalog, apr_pstrdup(scratch_pool, source_path),
filtered_mergeinfo);
}
/* Are there any subtrees with explicit mergeinfo still left in the merge
source where there was no explicit mergeinfo for the corresponding path
in the merge target? If so, add the intersection of those path's
mergeinfo and the corresponding target path's mergeinfo to
new_catalog. */
for (hi = apr_hash_first(scratch_pool, source_catalog);
hi;
hi = apr_hash_next(hi))
{
const char *source_path = apr_hash_this_key(hi);
const char *path_rel_to_session =
svn_relpath_skip_ancestor(source_repos_rel_path, source_path);
const char *source_url;
svn_mergeinfo_t source_mergeinfo = apr_hash_this_val(hi);
svn_mergeinfo_t filtered_mergeinfo;
svn_client__pathrev_t *target_pathrev;
svn_mergeinfo_t target_history_as_mergeinfo;
svn_error_t *err;
svn_pool_clear(iterpool);
source_url = svn_path_url_add_component2(source_loc->url,
path_rel_to_session, iterpool);
target_pathrev = svn_client__pathrev_join_relpath(
&target->loc, path_rel_to_session, iterpool);
err = svn_client__get_history_as_mergeinfo(&target_history_as_mergeinfo,
NULL /* has_rev_zero_history */,
target_pathrev,
target->loc.rev,
SVN_INVALID_REVNUM,
target_ra_session,
ctx, iterpool);
if (err)
{
if (err->apr_err == SVN_ERR_FS_NOT_FOUND
|| err->apr_err == SVN_ERR_RA_DAV_REQUEST_FAILED)
{
/* This path with explicit mergeinfo in the source doesn't
exist on the target. */
svn_error_clear(err);
err = NULL;
}
else
{
return svn_error_trace(err);
}
}
else
{
svn_client__pathrev_t *pathrev;
SVN_ERR(find_youngest_merged_rev(youngest_merged_rev,
target_history_as_mergeinfo,
source_mergeinfo,
iterpool));
/* Use scratch_pool rather than iterpool because filtered_mergeinfo
is going into new_catalog below and needs to last to the end of
this function. */
/* ### Why looking at SOURCE_url at TARGET_rev? */
SVN_ERR(svn_client__pathrev_create_with_session(
&pathrev, source_ra_session, target->loc.rev, source_url,
iterpool));
SVN_ERR(find_unmerged_mergeinfo_subroutine(
&filtered_mergeinfo, target_history_as_mergeinfo,
source_mergeinfo, pathrev,
source_ra_session, ctx, scratch_pool, iterpool));
if (apr_hash_count(filtered_mergeinfo))
svn_hash_sets(new_catalog,
apr_pstrdup(scratch_pool, source_path),
filtered_mergeinfo);
}
}
/* Limit new_catalog to the youngest revisions previously merged from
the target to the source. */
if (SVN_IS_VALID_REVNUM(*youngest_merged_rev))
SVN_ERR(svn_mergeinfo__filter_catalog_by_ranges(&new_catalog,
new_catalog,
*youngest_merged_rev,
0, /* No oldest bound. */
TRUE,
scratch_pool,
scratch_pool));
/* Make a shiny new copy before blowing away all the temporary pools. */
*unmerged_to_source_catalog = svn_mergeinfo_catalog_dup(new_catalog,
result_pool);
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Helper for svn_client_merge_reintegrate() which calculates the
'left hand side' of the underlying two-URL merge that a --reintegrate
merge actually performs. If no merge should be performed, set
*LEFT_P to NULL.
TARGET->abspath is the absolute working copy path of the reintegrate
merge.
SOURCE_LOC is the reintegrate source.
SUBTREES_WITH_MERGEINFO is a hash of (const char *) absolute paths mapped
to (svn_mergeinfo_t *) mergeinfo values for each working copy path with
explicit mergeinfo in TARGET->abspath. Actually we only need to know the
paths, not the mergeinfo.
TARGET->loc.rev is the working revision the entire WC tree rooted at
TARGET is at.
Populate *UNMERGED_TO_SOURCE_CATALOG with the mergeinfo describing what
parts of TARGET->loc have not been merged to SOURCE_LOC, up to the
youngest revision ever merged from the TARGET->abspath to the source if
such exists, see doc string for find_unmerged_mergeinfo().
SOURCE_RA_SESSION is a session opened to the SOURCE_LOC
and TARGET_RA_SESSION is open to TARGET->loc.url.
*LEFT_P, *MERGED_TO_SOURCE_CATALOG , and *UNMERGED_TO_SOURCE_CATALOG are
allocated in RESULT_POOL. SCRATCH_POOL is used for all temporary
allocations. */
static svn_error_t *
calculate_left_hand_side(svn_client__pathrev_t **left_p,
svn_mergeinfo_catalog_t *merged_to_source_catalog,
svn_mergeinfo_catalog_t *unmerged_to_source_catalog,
const merge_target_t *target,
apr_hash_t *subtrees_with_mergeinfo,
const svn_client__pathrev_t *source_loc,
svn_ra_session_t *source_ra_session,
svn_ra_session_t *target_ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_mergeinfo_catalog_t mergeinfo_catalog, unmerged_catalog;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_index_t *hi;
/* hash of paths mapped to arrays of svn_mergeinfo_t. */
apr_hash_t *target_history_hash = apr_hash_make(scratch_pool);
svn_revnum_t youngest_merged_rev;
svn_client__pathrev_t *yc_ancestor;
assert(session_url_is(source_ra_session, source_loc->url, scratch_pool));
assert(session_url_is(target_ra_session, target->loc.url, scratch_pool));
/* Initialize our return variables. */
*left_p = NULL;
/* TARGET->abspath may not have explicit mergeinfo and thus may not be
contained within SUBTREES_WITH_MERGEINFO. If this is the case then
add a dummy item for TARGET->abspath so we get its history (i.e. implicit
mergeinfo) below. */
if (!svn_hash_gets(subtrees_with_mergeinfo, target->abspath))
svn_hash_sets(subtrees_with_mergeinfo, target->abspath,
apr_hash_make(result_pool));
/* Get the history segments (as mergeinfo) for TARGET->abspath and any of
its subtrees with explicit mergeinfo. */
for (hi = apr_hash_first(scratch_pool, subtrees_with_mergeinfo);
hi;
hi = apr_hash_next(hi))
{
const char *local_abspath = apr_hash_this_key(hi);
svn_client__pathrev_t *target_child;
const char *repos_relpath;
svn_mergeinfo_t target_history_as_mergeinfo;
svn_pool_clear(iterpool);
/* Convert the absolute path with mergeinfo on it to a path relative
to the session root. */
SVN_ERR(svn_wc__node_get_repos_info(NULL, &repos_relpath, NULL, NULL,
ctx->wc_ctx, local_abspath,
scratch_pool, iterpool));
target_child = svn_client__pathrev_create_with_relpath(
target->loc.repos_root_url, target->loc.repos_uuid,
target->loc.rev, repos_relpath, iterpool);
SVN_ERR(svn_client__get_history_as_mergeinfo(&target_history_as_mergeinfo,
NULL /* has_rev_zero_hist */,
target_child,
target->loc.rev,
SVN_INVALID_REVNUM,
target_ra_session,
ctx, scratch_pool));
svn_hash_sets(target_history_hash, repos_relpath,
target_history_as_mergeinfo);
}
/* Check that SOURCE_LOC and TARGET->loc are
actually related, we can't reintegrate if they are not. Also
get an initial value for the YCA revision number. */
SVN_ERR(svn_client__get_youngest_common_ancestor(
&yc_ancestor, source_loc, &target->loc, target_ra_session, ctx,
iterpool, iterpool));
if (! yc_ancestor)
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("'%s@%ld' must be ancestrally related to "
"'%s@%ld'"), source_loc->url, source_loc->rev,
target->loc.url, target->loc.rev);
/* If the source revision is the same as the youngest common
revision, then there can't possibly be any unmerged revisions
that we need to apply to target. */
if (source_loc->rev == yc_ancestor->rev)
{
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Get the mergeinfo from the source, including its descendants
with differing explicit mergeinfo. */
SVN_ERR(svn_client__get_repos_mergeinfo_catalog(
&mergeinfo_catalog, source_ra_session,
source_loc->url, source_loc->rev,
svn_mergeinfo_inherited, FALSE /* squelch_incapable */,
TRUE /* include_descendants */, iterpool, iterpool));
if (!mergeinfo_catalog)
mergeinfo_catalog = apr_hash_make(iterpool);
*merged_to_source_catalog = svn_mergeinfo_catalog_dup(mergeinfo_catalog,
result_pool);
/* Filter the source's mergeinfo catalog so that we are left with
mergeinfo that describes what has *not* previously been merged from
TARGET->loc to SOURCE_LOC. */
SVN_ERR(find_unmerged_mergeinfo(&unmerged_catalog,
&youngest_merged_rev,
yc_ancestor->rev,
mergeinfo_catalog,
target_history_hash,
source_loc,
target,
source_ra_session,
target_ra_session,
ctx,
iterpool, iterpool));
/* Simplify unmerged_catalog through elision then make a copy in POOL. */
SVN_ERR(svn_client__elide_mergeinfo_catalog(unmerged_catalog,
iterpool));
*unmerged_to_source_catalog = svn_mergeinfo_catalog_dup(unmerged_catalog,
result_pool);
if (youngest_merged_rev == SVN_INVALID_REVNUM)
{
/* We never merged to the source. Just return the branch point. */
*left_p = svn_client__pathrev_dup(yc_ancestor, result_pool);
}
else
{
/* We've previously merged some or all of the target, up to
youngest_merged_rev, to the source. Set
*LEFT_P to cover the youngest part of this range. */
SVN_ERR(svn_client__repos_location(left_p, target_ra_session,
&target->loc, youngest_merged_rev,
ctx, result_pool, iterpool));
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Determine the URLs and revisions needed to perform a reintegrate merge
* from SOURCE_LOC into the working copy at TARGET.
*
* SOURCE_RA_SESSION and TARGET_RA_SESSION are RA sessions opened to the
* URLs of SOURCE_LOC and TARGET->loc respectively.
*
* Set *SOURCE_P to
* the source-left and source-right locations of the required merge. Set
* *YC_ANCESTOR_P to the location of the youngest ancestor.
* Any of these output pointers may be NULL if not wanted.
*
* See svn_client_find_reintegrate_merge() for other details.
*/
static svn_error_t *
find_reintegrate_merge(merge_source_t **source_p,
svn_client__pathrev_t **yc_ancestor_p,
svn_ra_session_t *source_ra_session,
const svn_client__pathrev_t *source_loc,
svn_ra_session_t *target_ra_session,
const merge_target_t *target,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_client__pathrev_t *yc_ancestor;
svn_client__pathrev_t *loc1;
merge_source_t source;
svn_mergeinfo_catalog_t unmerged_to_source_mergeinfo_catalog;
svn_mergeinfo_catalog_t merged_to_source_mergeinfo_catalog;
svn_error_t *err;
apr_hash_t *subtrees_with_mergeinfo;
assert(session_url_is(source_ra_session, source_loc->url, scratch_pool));
assert(session_url_is(target_ra_session, target->loc.url, scratch_pool));
/* As the WC tree is "pure", use its last-updated-to revision as
the default revision for the left side of our merge, since that's
what the repository sub-tree is required to be up to date with
(with regard to the WC). */
/* ### Bogus/obsolete comment? */
/* Can't reintegrate to or from the root of the repository. */
if (strcmp(source_loc->url, source_loc->repos_root_url) == 0
|| strcmp(target->loc.url, target->loc.repos_root_url) == 0)
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("Neither the reintegrate source nor target "
"can be the root of the repository"));
/* Find all the subtrees in TARGET_WCPATH that have explicit mergeinfo. */
err = get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo,
target->abspath, svn_depth_infinity,
ctx, scratch_pool, scratch_pool);
/* Issue #3896: If invalid mergeinfo in the reintegrate target
prevents us from proceeding, then raise the best error possible. */
if (err && err->apr_err == SVN_ERR_CLIENT_INVALID_MERGEINFO_NO_MERGETRACKING)
err = svn_error_quick_wrap(err, _("Reintegrate merge not possible"));
SVN_ERR(err);
SVN_ERR(calculate_left_hand_side(&loc1,
&merged_to_source_mergeinfo_catalog,
&unmerged_to_source_mergeinfo_catalog,
target,
subtrees_with_mergeinfo,
source_loc,
source_ra_session,
target_ra_session,
ctx,
scratch_pool, scratch_pool));
/* Did calculate_left_hand_side() decide that there was no merge to
be performed here? */
if (! loc1)
{
if (source_p)
*source_p = NULL;
if (yc_ancestor_p)
*yc_ancestor_p = NULL;
return SVN_NO_ERROR;
}
source.loc1 = loc1;
source.loc2 = source_loc;
/* If the target was moved after the source was branched from it,
it is possible that the left URL differs from the target's current
URL. If so, then adjust TARGET_RA_SESSION to point to the old URL. */
if (strcmp(source.loc1->url, target->loc.url))
SVN_ERR(svn_ra_reparent(target_ra_session, source.loc1->url, scratch_pool));
SVN_ERR(svn_client__get_youngest_common_ancestor(
&yc_ancestor, source.loc2, source.loc1, target_ra_session,
ctx, scratch_pool, scratch_pool));
if (! yc_ancestor)
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("'%s@%ld' must be ancestrally related to "
"'%s@%ld'"),
source.loc1->url, source.loc1->rev,
source.loc2->url, source.loc2->rev);
/* The source side of a reintegrate merge is not 'ancestral', except in
* the degenerate case where source == YCA. */
source.ancestral = (loc1->rev == yc_ancestor->rev);
if (source.loc1->rev > yc_ancestor->rev)
{
/* Have we actually merged anything to the source from the
target? If so, make sure we've merged a contiguous
prefix. */
svn_mergeinfo_catalog_t final_unmerged_catalog = apr_hash_make(scratch_pool);
SVN_ERR(find_unsynced_ranges(source_loc, &target->loc,
unmerged_to_source_mergeinfo_catalog,
merged_to_source_mergeinfo_catalog,
final_unmerged_catalog,
target_ra_session, scratch_pool,
scratch_pool));
if (apr_hash_count(final_unmerged_catalog))
{
svn_string_t *source_mergeinfo_cat_string;
SVN_ERR(svn_mergeinfo__catalog_to_formatted_string(
&source_mergeinfo_cat_string,
final_unmerged_catalog,
" ", _(" Missing ranges: "), scratch_pool));
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE,
NULL,
_("Reintegrate can only be used if "
"revisions %ld through %ld were "
"previously merged from %s to the "
"reintegrate source, but this is "
"not the case:\n%s"),
yc_ancestor->rev + 1, source.loc2->rev,
target->loc.url,
source_mergeinfo_cat_string->data);
}
}
/* Left side: trunk@youngest-trunk-rev-merged-to-branch-at-specified-peg-rev
* Right side: branch@specified-peg-revision */
if (source_p)
*source_p = merge_source_dup(&source, result_pool);
if (yc_ancestor_p)
*yc_ancestor_p = svn_client__pathrev_dup(yc_ancestor, result_pool);
return SVN_NO_ERROR;
}
/* Resolve the source and target locations and open RA sessions to them, and
* perform some checks appropriate for a reintegrate merge.
*
* Set *SOURCE_RA_SESSION_P and *SOURCE_LOC_P to a new session and the
* repository location of SOURCE_PATH_OR_URL at SOURCE_PEG_REVISION. Set
* *TARGET_RA_SESSION_P and *TARGET_P to a new session and the repository
* location of the WC at TARGET_ABSPATH.
*
* Throw a SVN_ERR_CLIENT_UNRELATED_RESOURCES error if the target WC node is
* a locally added node or if the source and target are not in the same
* repository. Throw a SVN_ERR_CLIENT_NOT_READY_TO_MERGE error if the
* target WC is not at a single revision without switched subtrees and
* without local mods.
*
* Allocate all the outputs in RESULT_POOL.
*/
static svn_error_t *
open_reintegrate_source_and_target(svn_ra_session_t **source_ra_session_p,
svn_client__pathrev_t **source_loc_p,
svn_ra_session_t **target_ra_session_p,
merge_target_t **target_p,
const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const char *target_abspath,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_client__pathrev_t *source_loc;
merge_target_t *target;
/* Open the target WC. A reintegrate merge requires the merge target to
* reflect a subtree of the repository as found at a single revision. */
SVN_ERR(open_target_wc(&target, target_abspath,
FALSE, FALSE, FALSE,
ctx, scratch_pool, scratch_pool));
if (! target->loc.url)
return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
_("Can't reintegrate into '%s' because it is "
"locally added and therefore not related to "
"the merge source"),
svn_dirent_local_style(target->abspath,
scratch_pool));
SVN_ERR(svn_client_open_ra_session2(target_ra_session_p,
target->loc.url, target->abspath,
ctx, result_pool, scratch_pool));
SVN_ERR(svn_client__ra_session_from_path2(
source_ra_session_p, &source_loc,
source_path_or_url, NULL, source_peg_revision, source_peg_revision,
ctx, result_pool));
/* source_loc and target->loc are required to be in the same repository,
as mergeinfo doesn't come into play for cross-repository merging. */
SVN_ERR(check_same_repos(source_loc,
svn_dirent_local_style(source_path_or_url,
scratch_pool),
&target->loc,
svn_dirent_local_style(target->abspath,
scratch_pool),
TRUE /* strict_urls */, scratch_pool));
*source_loc_p = source_loc;
*target_p = target;
return SVN_NO_ERROR;
}
/* The body of svn_client_merge_reintegrate(), which see for details. */
static svn_error_t *
merge_reintegrate_locked(conflict_report_t **conflict_report,
const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const char *target_abspath,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_ra_session_t *target_ra_session, *source_ra_session;
merge_target_t *target;
svn_client__pathrev_t *source_loc;
merge_source_t *source;
svn_client__pathrev_t *yc_ancestor;
svn_boolean_t use_sleep = FALSE;
svn_error_t *err;
SVN_ERR(open_reintegrate_source_and_target(
&source_ra_session, &source_loc, &target_ra_session, &target,
source_path_or_url, source_peg_revision, target_abspath,
ctx, scratch_pool, scratch_pool));
SVN_ERR(find_reintegrate_merge(&source, &yc_ancestor,
source_ra_session, source_loc,
target_ra_session, target,
ctx, scratch_pool, scratch_pool));
if (! source)
{
*conflict_report = NULL;
return SVN_NO_ERROR;
}
/* Do the real merge! */
/* ### TODO(reint): Make sure that one isn't the same line ancestor
### of the other (what's erroneously referred to as "ancestrally
### related" in this source file). For now, we just say the source
### isn't "ancestral" even if it is (in the degenerate case where
### source-left equals YCA). */
source->ancestral = FALSE;
err = merge_cousins_and_supplement_mergeinfo(conflict_report,
&use_sleep,
target,
target_ra_session,
source_ra_session,
source, yc_ancestor,
TRUE /* same_repos */,
svn_depth_infinity,
diff_ignore_ancestry,
FALSE /* force_delete */,
FALSE /* record_only */,
dry_run,
merge_options,
ctx,
result_pool, scratch_pool);
if (use_sleep)
svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
svn_error_t *
svn_client_merge_reintegrate(const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const char *target_wcpath,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
const char *target_abspath, *lock_abspath;
conflict_report_t *conflict_report;
SVN_ERR(get_target_and_lock_abspath(&target_abspath, &lock_abspath,
target_wcpath, ctx, pool));
if (!dry_run)
SVN_WC__CALL_WITH_WRITE_LOCK(
merge_reintegrate_locked(&conflict_report,
source_path_or_url, source_peg_revision,
target_abspath,
FALSE /*diff_ignore_ancestry*/,
dry_run, merge_options, ctx, pool, pool),
ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
else
SVN_ERR(merge_reintegrate_locked(&conflict_report,
source_path_or_url, source_peg_revision,
target_abspath,
FALSE /*diff_ignore_ancestry*/,
dry_run, merge_options, ctx, pool, pool));
SVN_ERR(make_merge_conflict_error(conflict_report, pool));
return SVN_NO_ERROR;
}
/* The body of svn_client_merge_peg5(), which see for details.
*
* IGNORE_MERGEINFO and DIFF_IGNORE_ANCESTRY are as in do_merge().
*/
static svn_error_t *
merge_peg_locked(conflict_report_t **conflict_report,
const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const svn_rangelist_t *ranges_to_merge,
const char *target_abspath,
svn_depth_t depth,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
svn_boolean_t allow_mixed_rev,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_target_t *target;
svn_client__pathrev_t *source_loc;
apr_array_header_t *merge_sources;
svn_ra_session_t *ra_session;
apr_pool_t *sesspool;
svn_boolean_t use_sleep = FALSE;
svn_error_t *err;
svn_boolean_t same_repos;
SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
SVN_ERR(open_target_wc(&target, target_abspath,
allow_mixed_rev, TRUE, TRUE,
ctx, scratch_pool, scratch_pool));
/* Create a short lived session pool */
sesspool = svn_pool_create(scratch_pool);
/* Open an RA session to our source URL, and determine its root URL. */
SVN_ERR(svn_client__ra_session_from_path2(
&ra_session, &source_loc,
source_path_or_url, NULL, source_peg_revision, source_peg_revision,
ctx, sesspool));
/* Normalize our merge sources. */
SVN_ERR(normalize_merge_sources(&merge_sources, source_path_or_url,
source_loc,
ranges_to_merge, ra_session, ctx,
scratch_pool, scratch_pool));
/* Check for same_repos. */
same_repos = is_same_repos(&target->loc, source_loc, TRUE /* strict_urls */);
/* Do the real merge! (We say with confidence that our merge
sources are both ancestral and related.) */
err = do_merge(NULL, NULL, conflict_report, &use_sleep,
merge_sources, target, ra_session,
TRUE /*sources_related*/, same_repos, ignore_mergeinfo,
diff_ignore_ancestry, force_delete, dry_run,
record_only, NULL, FALSE, FALSE, depth, merge_options,
ctx, result_pool, scratch_pool);
/* We're done with our RA session. */
svn_pool_destroy(sesspool);
if (use_sleep)
svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
/* Details of an automatic merge. */
typedef struct automatic_merge_t
{
svn_client__pathrev_t *yca, *base, *right, *target;
svn_boolean_t is_reintegrate_like;
svn_boolean_t allow_mixed_rev, allow_local_mods, allow_switched_subtrees;
} automatic_merge_t;
static svn_error_t *
client_find_automatic_merge(automatic_merge_t **merge_p,
const char *source_path_or_url,
const svn_opt_revision_t *source_revision,
const char *target_abspath,
svn_boolean_t allow_mixed_rev,
svn_boolean_t allow_local_mods,
svn_boolean_t allow_switched_subtrees,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
static svn_error_t *
do_automatic_merge_locked(conflict_report_t **conflict_report,
const automatic_merge_t *merge,
const char *target_abspath,
svn_depth_t depth,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
svn_error_t *
svn_client_merge_peg5(const char *source_path_or_url,
const apr_array_header_t *ranges_to_merge,
const svn_opt_revision_t *source_peg_revision,
const char *target_wcpath,
svn_depth_t depth,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
svn_boolean_t allow_mixed_rev,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
const char *target_abspath, *lock_abspath;
conflict_report_t *conflict_report;
/* No ranges to merge? No problem. */
if (ranges_to_merge != NULL && ranges_to_merge->nelts == 0)
return SVN_NO_ERROR;
SVN_ERR(get_target_and_lock_abspath(&target_abspath, &lock_abspath,
target_wcpath, ctx, pool));
/* Do an automatic merge if no revision ranges are specified. */
if (ranges_to_merge == NULL)
{
automatic_merge_t *merge;
if (ignore_mergeinfo)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Cannot merge automatically while "
"ignoring mergeinfo"));
/* Find the details of the merge needed. */
SVN_ERR(client_find_automatic_merge(
&merge,
source_path_or_url, source_peg_revision,
target_abspath,
allow_mixed_rev,
TRUE /*allow_local_mods*/,
TRUE /*allow_switched_subtrees*/,
ctx, pool, pool));
if (!dry_run)
SVN_WC__CALL_WITH_WRITE_LOCK(
do_automatic_merge_locked(&conflict_report,
merge,
target_abspath, depth,
diff_ignore_ancestry,
force_delete, record_only, dry_run,
merge_options, ctx, pool, pool),
ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
else
SVN_ERR(do_automatic_merge_locked(&conflict_report,
merge,
target_abspath, depth,
diff_ignore_ancestry,
force_delete, record_only, dry_run,
merge_options, ctx, pool, pool));
}
else if (!dry_run)
SVN_WC__CALL_WITH_WRITE_LOCK(
merge_peg_locked(&conflict_report,
source_path_or_url, source_peg_revision,
ranges_to_merge,
target_abspath, depth, ignore_mergeinfo,
diff_ignore_ancestry,
force_delete, record_only, dry_run,
allow_mixed_rev, merge_options, ctx, pool, pool),
ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
else
SVN_ERR(merge_peg_locked(&conflict_report,
source_path_or_url, source_peg_revision,
ranges_to_merge,
target_abspath, depth, ignore_mergeinfo,
diff_ignore_ancestry,
force_delete, record_only, dry_run,
allow_mixed_rev, merge_options, ctx, pool, pool));
SVN_ERR(make_merge_conflict_error(conflict_report, pool));
return SVN_NO_ERROR;
}
/* The location-history of a branch.
*
* This structure holds the set of path-revisions occupied by a branch,
* from an externally chosen 'tip' location back to its origin. The
* 'tip' location is the youngest location that we are considering on
* the branch. */
typedef struct branch_history_t
{
/* The tip location of the branch. That is, the youngest location that's
* in the repository and that we're considering. If we're considering a
* target branch right up to an uncommitted WC, then this is the WC base
* (pristine) location. */
svn_client__pathrev_t *tip;
/* The location-segment history, as mergeinfo. */
svn_mergeinfo_t history;
/* Whether the location-segment history reached as far as (necessarily
the root path in) revision 0 -- a fact that can't be represented as
mergeinfo. */
svn_boolean_t has_r0_history;
} branch_history_t;
/* Return the location on BRANCH_HISTORY at revision REV, or NULL if none. */
static svn_client__pathrev_t *
location_on_branch_at_rev(const branch_history_t *branch_history,
svn_revnum_t rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, branch_history->history); hi;
hi = apr_hash_next(hi))
{
const char *fspath = apr_hash_this_key(hi);
svn_rangelist_t *rangelist = apr_hash_this_val(hi);
int i;
for (i = 0; i < rangelist->nelts; i++)
{
svn_merge_range_t *r = APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
if (r->start < rev && rev <= r->end)
{
return svn_client__pathrev_create_with_relpath(
branch_history->tip->repos_root_url,
branch_history->tip->repos_uuid,
rev, fspath + 1, result_pool);
}
}
}
return NULL;
}
/* */
typedef struct source_and_target_t
{
svn_client__pathrev_t *source;
svn_ra_session_t *source_ra_session;
branch_history_t source_branch;
merge_target_t *target;
svn_ra_session_t *target_ra_session;
branch_history_t target_branch;
/* Repos location of the youngest common ancestor of SOURCE and TARGET. */
svn_client__pathrev_t *yca;
} source_and_target_t;
/* Set *INTERSECTION_P to the intersection of BRANCH_HISTORY with the
* revision range OLDEST_REV to YOUNGEST_REV (inclusive).
*
* If the intersection is empty, the result will be a branch history object
* containing an empty (not null) history.
*
* ### The 'tip' of the result is currently unchanged.
*/
static svn_error_t *
branch_history_intersect_range(branch_history_t **intersection_p,
const branch_history_t *branch_history,
svn_revnum_t oldest_rev,
svn_revnum_t youngest_rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
branch_history_t *result = apr_palloc(result_pool, sizeof(*result));
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(oldest_rev));
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
SVN_ERR_ASSERT(oldest_rev >= 1);
/* Allow a just-empty range (oldest = youngest + 1) but not an
* arbitrary reverse range (such as oldest = youngest + 2). */
SVN_ERR_ASSERT(oldest_rev <= youngest_rev + 1);
if (oldest_rev <= youngest_rev)
{
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
&result->history, branch_history->history,
youngest_rev, oldest_rev - 1, TRUE /* include_range */,
result_pool, scratch_pool));
result->history = svn_mergeinfo_dup(result->history, result_pool);
}
else
{
result->history = apr_hash_make(result_pool);
}
result->has_r0_history = FALSE;
/* ### TODO: Set RESULT->tip to the tip of the intersection. */
result->tip = svn_client__pathrev_dup(branch_history->tip, result_pool);
*intersection_p = result;
return SVN_NO_ERROR;
}
/* Set *OLDEST_P and *YOUNGEST_P to the oldest and youngest locations
* (inclusive) along BRANCH. OLDEST_P and/or YOUNGEST_P may be NULL if not
* wanted.
*/
static svn_error_t *
branch_history_get_endpoints(svn_client__pathrev_t **oldest_p,
svn_client__pathrev_t **youngest_p,
const branch_history_t *branch,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_revnum_t youngest_rev, oldest_rev;
SVN_ERR(svn_mergeinfo__get_range_endpoints(
&youngest_rev, &oldest_rev,
branch->history, scratch_pool));
if (oldest_p)
*oldest_p = location_on_branch_at_rev(
branch, oldest_rev + 1, result_pool, scratch_pool);
if (youngest_p)
*youngest_p = location_on_branch_at_rev(
branch, youngest_rev, result_pool, scratch_pool);
return SVN_NO_ERROR;
}
/* Implements the svn_log_entry_receiver_t interface.
Set *BATON to LOG_ENTRY->revision and return SVN_ERR_CEASE_INVOCATION. */
static svn_error_t *
operative_rev_receiver(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
svn_revnum_t *operative_rev = baton;
*operative_rev = log_entry->revision;
/* We've found the youngest merged or oldest eligible revision, so
we're done...
...but wait, shouldn't we care if LOG_ENTRY->NON_INHERITABLE is
true? Because if it is, then LOG_ENTRY->REVISION is only
partially merged/elgibile! And our only caller,
find_last_merged_location (via short_circuit_mergeinfo_log) is
interested in *fully* merged revisions. That's all true, but if
find_last_merged_location() finds the youngest merged revision it
will also check for the oldest eligible revision. So in the case
the youngest merged rev is non-inheritable, the *same* non-inheritable
rev will be found as the oldest eligible rev -- and
find_last_merged_location() handles that situation. */
return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
}
/* Wrapper around svn_client__mergeinfo_log. All arguments are as per
that private API. The discover_changed_paths, depth, and revprops args to
svn_client__mergeinfo_log are always TRUE, svn_depth_infinity_t,
and empty array respectively.
If RECEIVER raises a SVN_ERR_CEASE_INVOCATION error, but still sets
*REVISION to a valid revnum, then clear the error. Otherwise return
any error. */
static svn_error_t*
short_circuit_mergeinfo_log(svn_mergeinfo_catalog_t *target_mergeinfo_cat,
svn_boolean_t finding_merged,
const char *target_path_or_url,
const svn_opt_revision_t *target_peg_revision,
const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const svn_opt_revision_t *source_start_revision,
const svn_opt_revision_t *source_end_revision,
svn_log_entry_receiver_t receiver,
svn_revnum_t *revision,
svn_client_ctx_t *ctx,
svn_ra_session_t *ra_session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_array_header_t *revprops;
svn_error_t *err;
const char *session_url;
SVN_ERR(svn_ra_get_session_url(ra_session, &session_url, scratch_pool));
revprops = apr_array_make(scratch_pool, 0, sizeof(const char *));
err = svn_client__mergeinfo_log(finding_merged,
target_path_or_url,
target_peg_revision,
target_mergeinfo_cat,
source_path_or_url,
source_peg_revision,
source_start_revision,
source_end_revision,
receiver, revision,
TRUE, svn_depth_infinity,
revprops, ctx, ra_session,
result_pool, scratch_pool);
err = svn_error_compose_create(
err,
svn_ra_reparent(ra_session, session_url, scratch_pool));
if (err)
{
/* We expect RECEIVER to short-circuit the (potentially expensive) log
by raising an SVN_ERR_CEASE_INVOCATION -- see operative_rev_receiver.
So we can ignore that error, but only as long as we actually found a
valid revision. */
if (SVN_IS_VALID_REVNUM(*revision)
&& err->apr_err == SVN_ERR_CEASE_INVOCATION)
{
svn_error_clear(err);
err = NULL;
}
else
{
return svn_error_trace(err);
}
}
return SVN_NO_ERROR;
}
/* Set *BASE_P to the last location on SOURCE_BRANCH such that all changes
* on SOURCE_BRANCH after YCA up to and including *BASE_P have already
* been fully merged into TARGET.
*
* *BASE_P TIP
* o-------o-----------o--- SOURCE_BRANCH
* / \
* -----o prev. \
* YCA \ merges \
* o-----------o----------- TARGET branch
*
* In terms of mergeinfo:
*
* Source a--... o=change, -=no-op revision
* branch / \
* YCA --> o a---o---o---o---o--- d=delete, a=add-as-a-copy
*
* Eligible -.eee.eeeeeeeeeeeeeeeeeeee .=not a source branch location
*
* Tgt-mi -.mmm.mm-mm-------m------- m=merged to root of TARGET or
* subtree of TARGET with no
* operative changes outside of that
* subtree, -=not merged
*
* Eligible -.---.--e--eeeeeee-eeeeeee
*
* Next --------^----------------- BASE is just before here.
*
* / \
* -----o prev. \
* YCA \ merges \
* o-----------o-------------
*
* If no revisions from SOURCE_BRANCH have been completely merged to TARGET,
* then set *BASE_P to the YCA.
*/
static svn_error_t *
find_last_merged_location(svn_client__pathrev_t **base_p,
svn_client__pathrev_t *yca,
const branch_history_t *source_branch,
svn_client__pathrev_t *target,
svn_client_ctx_t *ctx,
svn_ra_session_t *ra_session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_opt_revision_t source_peg_rev, source_start_rev, source_end_rev,
target_opt_rev;
svn_revnum_t youngest_merged_rev = SVN_INVALID_REVNUM;
svn_mergeinfo_catalog_t target_mergeinfo_cat = NULL;
source_peg_rev.kind = svn_opt_revision_number;
source_peg_rev.value.number = source_branch->tip->rev;
source_start_rev.kind = svn_opt_revision_number;
source_start_rev.value.number = yca->rev;
source_end_rev.kind = svn_opt_revision_number;
source_end_rev.value.number = source_branch->tip->rev;
target_opt_rev.kind = svn_opt_revision_number;
target_opt_rev.value.number = target->rev;
/* Find the youngest revision fully merged from SOURCE_BRANCH to TARGET,
if such a revision exists. */
SVN_ERR(short_circuit_mergeinfo_log(&target_mergeinfo_cat,
TRUE, /* Find merged */
target->url, &target_opt_rev,
source_branch->tip->url,
&source_peg_rev,
&source_end_rev, &source_start_rev,
operative_rev_receiver,
&youngest_merged_rev,
ctx, ra_session,
result_pool, scratch_pool));
if (!SVN_IS_VALID_REVNUM(youngest_merged_rev))
{
/* No revisions have been completely merged from SOURCE_BRANCH to
TARGET so the base for the next merge is the YCA. */
*base_p = yca;
}
else
{
/* One or more revisions have already been completely merged from
SOURCE_BRANCH to TARGET, now find the oldest revision, older
than the youngest merged revision, which is still eligible to
be merged, if such exists. */
branch_history_t *contiguous_source;
svn_revnum_t base_rev;
svn_revnum_t oldest_eligible_rev = SVN_INVALID_REVNUM;
/* If the only revisions eligible are younger than the youngest merged
revision we can simply assume that the youngest eligible revision
is the youngest merged revision. Obviously this may not be true!
The revisions between the youngest merged revision and the tip of
the branch may have several inoperative revisions -- they may *all*
be inoperative revisions! But for the purpose of this function
(i.e. finding the youngest revision after the YCA where all revs have
been merged) that doesn't matter. */
source_end_rev.value.number = youngest_merged_rev;
SVN_ERR(short_circuit_mergeinfo_log(&target_mergeinfo_cat,
FALSE, /* Find eligible */
target->url, &target_opt_rev,
source_branch->tip->url,
&source_peg_rev,
&source_start_rev, &source_end_rev,
operative_rev_receiver,
&oldest_eligible_rev,
ctx, ra_session,
scratch_pool, scratch_pool));
/* If there are revisions eligible for merging, use the oldest one
to calculate the base. Otherwise there are no operative revisions
to merge and we can simple set the base to the youngest revision
already merged. */
if (SVN_IS_VALID_REVNUM(oldest_eligible_rev))
base_rev = oldest_eligible_rev - 1;
else
base_rev = youngest_merged_rev;
/* Find the branch location just before the oldest eligible rev.
(We can't just use the base revs calculated above because the branch
might have a gap there.) */
SVN_ERR(branch_history_intersect_range(&contiguous_source,
source_branch, yca->rev,
base_rev,
scratch_pool, scratch_pool));
SVN_ERR(branch_history_get_endpoints(NULL, base_p, contiguous_source,
result_pool, scratch_pool));
}
return SVN_NO_ERROR;
}
/* Find a merge base location on the target branch, like in a sync
* merge.
*
* BASE S_T->source
* o-------o-----------o---
* / \ \
* -----o prev. \ \ this
* YCA \ merge \ \ merge
* o-----------o-----------o
* S_T->target
*
* Set *BASE_P to BASE, the youngest location in the history of S_T->source
* (at or after the YCA) at which all revisions up to BASE are effectively
* merged into S_T->target.
*
* If no locations on the history of S_T->source are effectively merged to
* S_T->target, set *BASE_P to the YCA.
*/
static svn_error_t *
find_base_on_source(svn_client__pathrev_t **base_p,
source_and_target_t *s_t,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
SVN_ERR(find_last_merged_location(base_p,
s_t->yca,
&s_t->source_branch,
s_t->target_branch.tip,
ctx,
s_t->source_ra_session,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Find a merge base location on the target branch, like in a reintegrate
* merge.
*
* S_T->source
* o-----------o-------o---
* / prev. / \
* -----o merge / \ this
* YCA \ / \ merge
* o-------o---------------o
* BASE S_T->target
*
* Set *BASE_P to BASE, the youngest location in the history of S_T->target
* (at or after the YCA) at which all revisions up to BASE are effectively
* merged into S_T->source.
*
* If no locations on the history of S_T->target are effectively merged to
* S_T->source, set *BASE_P to the YCA.
*/
static svn_error_t *
find_base_on_target(svn_client__pathrev_t **base_p,
source_and_target_t *s_t,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
SVN_ERR(find_last_merged_location(base_p,
s_t->yca,
&s_t->target_branch,
s_t->source,
ctx,
s_t->target_ra_session,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Find the last point at which the branch at S_T->source was completely
* merged to the branch at S_T->target or vice-versa.
*
* Fill in S_T->source_branch and S_T->target_branch and S_T->yca.
* Set *BASE_P to the merge base. Set *IS_REINTEGRATE_LIKE to true if
* an automatic merge from source to target would be a reintegration
* merge: that is, if the last automatic merge was in the opposite
* direction; or to false otherwise.
*
* If there is no youngest common ancestor, throw an error.
*/
static svn_error_t *
find_automatic_merge(svn_client__pathrev_t **base_p,
svn_boolean_t *is_reintegrate_like,
source_and_target_t *s_t,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_client__pathrev_t *base_on_source, *base_on_target;
/* Get the location-history of each branch. */
s_t->source_branch.tip = s_t->source;
SVN_ERR(svn_client__get_history_as_mergeinfo(
&s_t->source_branch.history, &s_t->source_branch.has_r0_history,
s_t->source, SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
s_t->source_ra_session, ctx, scratch_pool));
s_t->target_branch.tip = &s_t->target->loc;
SVN_ERR(svn_client__get_history_as_mergeinfo(
&s_t->target_branch.history, &s_t->target_branch.has_r0_history,
&s_t->target->loc, SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
s_t->target_ra_session, ctx, scratch_pool));
SVN_ERR(svn_client__calc_youngest_common_ancestor(
&s_t->yca, s_t->source, s_t->source_branch.history,
s_t->source_branch.has_r0_history,
&s_t->target->loc, s_t->target_branch.history,
s_t->target_branch.has_r0_history,
result_pool, scratch_pool));
if (! s_t->yca)
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("'%s@%ld' must be ancestrally related to "
"'%s@%ld'"),
s_t->source->url, s_t->source->rev,
s_t->target->loc.url, s_t->target->loc.rev);
/* Find the latest revision of A synced to B and the latest
* revision of B synced to A.
*
* base_on_source = youngest_complete_synced_point(source, target)
* base_on_target = youngest_complete_synced_point(target, source)
*/
SVN_ERR(find_base_on_source(&base_on_source, s_t,
ctx, scratch_pool, scratch_pool));
SVN_ERR(find_base_on_target(&base_on_target, s_t,
ctx, scratch_pool, scratch_pool));
/* Choose a base. */
if (base_on_source->rev >= base_on_target->rev)
{
*base_p = base_on_source;
*is_reintegrate_like = FALSE;
}
else
{
*base_p = base_on_target;
*is_reintegrate_like = TRUE;
}
return SVN_NO_ERROR;
}
/** Find out what kind of automatic merge would be needed, when the target
* is only known as a repository location rather than a WC.
*
* Like find_automatic_merge() except that the target is
* specified by @a target_path_or_url at @a target_revision, which must
* refer to a repository location, instead of by a WC path argument.
*
* Set *MERGE_P to a new structure with all fields filled in except the
* 'allow_*' flags.
*/
static svn_error_t *
find_automatic_merge_no_wc(automatic_merge_t **merge_p,
const char *source_path_or_url,
const svn_opt_revision_t *source_revision,
const char *target_path_or_url,
const svn_opt_revision_t *target_revision,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
source_and_target_t *s_t = apr_palloc(scratch_pool, sizeof(*s_t));
svn_client__pathrev_t *target_loc;
automatic_merge_t *merge = apr_palloc(result_pool, sizeof(*merge));
/* Source */
SVN_ERR(svn_client__ra_session_from_path2(
&s_t->source_ra_session, &s_t->source,
source_path_or_url, NULL, source_revision, source_revision,
ctx, result_pool));
/* Target */
SVN_ERR(svn_client__ra_session_from_path2(
&s_t->target_ra_session, &target_loc,
target_path_or_url, NULL, target_revision, target_revision,
ctx, result_pool));
s_t->target = apr_palloc(scratch_pool, sizeof(*s_t->target));
s_t->target->abspath = NULL; /* indicate the target is not a WC */
s_t->target->loc = *target_loc;
SVN_ERR(find_automatic_merge(&merge->base, &merge->is_reintegrate_like, s_t,
ctx, result_pool, scratch_pool));
merge->right = s_t->source;
merge->target = &s_t->target->loc;
merge->yca = s_t->yca;
*merge_p = merge;
return SVN_NO_ERROR;
}
/* Find the information needed to merge all unmerged changes from a source
* branch into a target branch.
*
* Set @a *merge_p to the information needed to merge all unmerged changes
* (up to @a source_revision) from the source branch @a source_path_or_url
* at @a source_revision into the target WC at @a target_abspath.
*
* The flags @a allow_mixed_rev, @a allow_local_mods and
* @a allow_switched_subtrees enable merging into a WC that is in any or all
* of the states described by their names, but only if this function decides
* that the merge will be in the same direction as the last automatic merge.
* If, on the other hand, the last automatic merge was in the opposite
* direction, then such states of the WC are not allowed regardless
* of these flags. This function merely records these flags in the
* @a *merge_p structure; do_automatic_merge_locked() checks the WC
* state for compliance.
*
* Allocate the @a *merge_p structure in @a result_pool.
*/
static svn_error_t *
client_find_automatic_merge(automatic_merge_t **merge_p,
const char *source_path_or_url,
const svn_opt_revision_t *source_revision,
const char *target_abspath,
svn_boolean_t allow_mixed_rev,
svn_boolean_t allow_local_mods,
svn_boolean_t allow_switched_subtrees,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
source_and_target_t *s_t = apr_palloc(result_pool, sizeof(*s_t));
automatic_merge_t *merge = apr_palloc(result_pool, sizeof(*merge));
SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
/* "Open" the target WC. Check the target WC for mixed-rev, local mods and
* switched subtrees yet to faster exit and notify user before contacting
* with server. After we find out what kind of merge is required, then if a
* reintegrate-like merge is required we'll do the stricter checks, in
* do_automatic_merge_locked(). */
SVN_ERR(open_target_wc(&s_t->target, target_abspath,
allow_mixed_rev,
allow_local_mods,
allow_switched_subtrees,
ctx, result_pool, scratch_pool));
if (!s_t->target->loc.url)
return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
_("Can't perform automatic merge into '%s' "
"because it is locally added and therefore "
"not related to the merge source"),
svn_dirent_local_style(target_abspath,
scratch_pool));
/* Open RA sessions to the source and target trees. */
SVN_ERR(svn_client_open_ra_session2(&s_t->target_ra_session,
s_t->target->loc.url,
s_t->target->abspath,
ctx, result_pool, scratch_pool));
SVN_ERR(svn_client__ra_session_from_path2(
&s_t->source_ra_session, &s_t->source,
source_path_or_url, NULL, source_revision, source_revision,
ctx, result_pool));
/* Check source is in same repos as target. */
SVN_ERR(check_same_repos(s_t->source, source_path_or_url,
&s_t->target->loc, target_abspath,
TRUE /* strict_urls */, scratch_pool));
SVN_ERR(find_automatic_merge(&merge->base, &merge->is_reintegrate_like, s_t,
ctx, result_pool, scratch_pool));
merge->yca = s_t->yca;
merge->right = s_t->source;
merge->target = &s_t->target->loc;
merge->allow_mixed_rev = allow_mixed_rev;
merge->allow_local_mods = allow_local_mods;
merge->allow_switched_subtrees = allow_switched_subtrees;
*merge_p = merge;
/* TODO: Close the source and target sessions here? */
return SVN_NO_ERROR;
}
/* Perform an automatic merge, given the information in MERGE which
* must have come from calling client_find_automatic_merge().
*
* Four locations are inputs: YCA, BASE, RIGHT, TARGET, as shown
* depending on whether the base is on the source branch or the target
* branch of this merge.
*
* RIGHT (is_reintegrate_like)
* o-----------o-------o---
* / prev. / \
* -----o merge / \ this
* YCA \ / \ merge
* o-------o---------------o
* BASE TARGET
*
* or
*
* BASE RIGHT (! is_reintegrate_like)
* o-------o-----------o---
* / \ \
* -----o prev. \ \ this
* YCA \ merge \ \ merge
* o-----------o-----------o
* TARGET
*
* ### TODO: The reintegrate-like code path does not yet
* eliminate already-cherry-picked revisions from the source.
*/
static svn_error_t *
do_automatic_merge_locked(conflict_report_t **conflict_report,
const automatic_merge_t *merge,
const char *target_abspath,
svn_depth_t depth,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_target_t *target;
svn_boolean_t reintegrate_like = merge->is_reintegrate_like;
svn_boolean_t use_sleep = FALSE;
svn_error_t *err;
SVN_ERR(open_target_wc(&target, target_abspath,
merge->allow_mixed_rev && ! reintegrate_like,
merge->allow_local_mods && ! reintegrate_like,
merge->allow_switched_subtrees && ! reintegrate_like,
ctx, scratch_pool, scratch_pool));
if (reintegrate_like)
{
merge_source_t source;
svn_ra_session_t *base_ra_session = NULL;
svn_ra_session_t *right_ra_session = NULL;
svn_ra_session_t *target_ra_session = NULL;
if (record_only)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("The required merge is reintegrate-like, "
"and the record-only option "
"cannot be used with this kind of merge"));
if (depth != svn_depth_unknown)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("The required merge is reintegrate-like, "
"and the depth option "
"cannot be used with this kind of merge"));
if (force_delete)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("The required merge is reintegrate-like, "
"and the force_delete option "
"cannot be used with this kind of merge"));
SVN_ERR(ensure_ra_session_url(&base_ra_session, merge->base->url,
target->abspath, ctx, scratch_pool));
SVN_ERR(ensure_ra_session_url(&right_ra_session, merge->right->url,
target->abspath, ctx, scratch_pool));
SVN_ERR(ensure_ra_session_url(&target_ra_session, target->loc.url,
target->abspath, ctx, scratch_pool));
/* Check for and reject any abnormalities -- such as revisions that
* have not yet been merged in the opposite direction -- that a
* 'reintegrate' merge would have rejected. */
{
merge_source_t *source2;
SVN_ERR(find_reintegrate_merge(&source2, NULL,
right_ra_session, merge->right,
target_ra_session, target,
ctx, scratch_pool, scratch_pool));
}
source.loc1 = merge->base;
source.loc2 = merge->right;
source.ancestral = ! merge->is_reintegrate_like;
err = merge_cousins_and_supplement_mergeinfo(conflict_report,
&use_sleep,
target,
base_ra_session,
right_ra_session,
&source, merge->yca,
TRUE /* same_repos */,
depth,
FALSE /*diff_ignore_ancestry*/,
force_delete, record_only,
dry_run,
merge_options,
ctx,
result_pool, scratch_pool);
}
else /* ! merge->is_reintegrate_like */
{
/* Ignoring the base that we found, we pass the YCA instead and let
do_merge() work out which subtrees need which revision ranges to
be merged. This enables do_merge() to fill in revision-range
gaps that are older than the base that we calculated (which is
for the root path of the merge).
An improvement would be to change find_automatic_merge() to
find the base for each sutree, and then here use the oldest base
among all subtrees. */
apr_array_header_t *merge_sources;
svn_ra_session_t *ra_session = NULL;
/* Normalize our merge sources, do_merge() requires this. See the
'MERGEINFO MERGE SOURCE NORMALIZATION' global comment. */
SVN_ERR(ensure_ra_session_url(&ra_session, merge->right->url,
target->abspath, ctx, scratch_pool));
SVN_ERR(normalize_merge_sources_internal(
&merge_sources, merge->right,
svn_rangelist__initialize(merge->yca->rev, merge->right->rev, TRUE,
scratch_pool),
ra_session, ctx, scratch_pool, scratch_pool));
err = do_merge(NULL, NULL, conflict_report, &use_sleep,
merge_sources, target, ra_session,
TRUE /*related*/, TRUE /*same_repos*/,
FALSE /*ignore_mergeinfo*/, diff_ignore_ancestry,
force_delete, dry_run,
record_only, NULL, FALSE, FALSE, depth, merge_options,
ctx, result_pool, scratch_pool);
}
if (use_sleep)
svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
svn_error_t *
svn_client_get_merging_summary(svn_boolean_t *needs_reintegration,
const char **yca_url, svn_revnum_t *yca_rev,
const char **base_url, svn_revnum_t *base_rev,
const char **right_url, svn_revnum_t *right_rev,
const char **target_url, svn_revnum_t *target_rev,
const char **repos_root_url,
const char *source_path_or_url,
const svn_opt_revision_t *source_revision,
const char *target_path_or_url,
const svn_opt_revision_t *target_revision,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_boolean_t target_is_wc;
automatic_merge_t *merge;
target_is_wc = (! svn_path_is_url(target_path_or_url))
&& (target_revision->kind == svn_opt_revision_unspecified
|| target_revision->kind == svn_opt_revision_working
|| target_revision->kind == svn_opt_revision_base);
if (target_is_wc)
{
const char *target_abspath;
SVN_ERR(svn_dirent_get_absolute(&target_abspath, target_path_or_url,
scratch_pool));
SVN_ERR(client_find_automatic_merge(
&merge,
source_path_or_url, source_revision,
target_abspath,
TRUE, TRUE, TRUE, /* allow_* */
ctx, scratch_pool, scratch_pool));
}
else
SVN_ERR(find_automatic_merge_no_wc(
&merge,
source_path_or_url, source_revision,
target_path_or_url, target_revision,
ctx, scratch_pool, scratch_pool));
if (needs_reintegration)
*needs_reintegration = merge->is_reintegrate_like;
if (yca_url)
*yca_url = apr_pstrdup(result_pool, merge->yca->url);
if (yca_rev)
*yca_rev = merge->yca->rev;
if (base_url)
*base_url = apr_pstrdup(result_pool, merge->base->url);
if (base_rev)
*base_rev = merge->base->rev;
if (right_url)
*right_url = apr_pstrdup(result_pool, merge->right->url);
if (right_rev)
*right_rev = merge->right->rev;
if (target_url)
*target_url = apr_pstrdup(result_pool, merge->target->url);
if (target_rev)
*target_rev = merge->target->rev;
if (repos_root_url)
*repos_root_url = apr_pstrdup(result_pool, merge->yca->repos_root_url);
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/cached_data.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/cached_data.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/cached_data.c (revision 309511)
@@ -1,3387 +1,3407 @@
/* cached_data.c --- cached (read) access to FSFS data
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "cached_data.h"
#include <assert.h>
#include "svn_hash.h"
#include "svn_ctype.h"
#include "svn_sorts.h"
#include "private/svn_delta_private.h"
#include "private/svn_io_private.h"
#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_temp_serializer.h"
#include "fs_fs.h"
#include "id.h"
#include "index.h"
#include "low_level.h"
#include "pack.h"
#include "util.h"
#include "temp_serializer.h"
#include "../libsvn_fs/fs-loader.h"
#include "../libsvn_delta/delta.h" /* for SVN_DELTA_WINDOW_SIZE */
#include "svn_private_config.h"
/* forward-declare. See implementation for the docstring */
static svn_error_t *
block_read(void **result,
svn_fs_t *fs,
svn_revnum_t revision,
apr_uint64_t item_index,
svn_fs_fs__revision_file_t *revision_file,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Defined this to enable access logging via dgb__log_access
#define SVN_FS_FS__LOG_ACCESS
*/
/* When SVN_FS_FS__LOG_ACCESS has been defined, write a line to console
* showing where REVISION, ITEM_INDEX is located in FS and use ITEM to
* show details on it's contents if not NULL. To support format 6 and
* earlier repos, ITEM_TYPE (SVN_FS_FS__ITEM_TYPE_*) must match ITEM.
* Use SCRATCH_POOL for temporary allocations.
*
* For pre-format7 repos, the display will be restricted.
*/
static svn_error_t *
dbg_log_access(svn_fs_t *fs,
svn_revnum_t revision,
apr_uint64_t item_index,
void *item,
apr_uint32_t item_type,
apr_pool_t *scratch_pool)
{
/* no-op if this macro is not defined */
#ifdef SVN_FS_FS__LOG_ACCESS
fs_fs_data_t *ffd = fs->fsap_data;
apr_off_t end_offset = 0;
svn_fs_fs__p2l_entry_t *entry = NULL;
static const char *types[] = {"<n/a>", "frep ", "drep ", "fprop", "dprop",
"node ", "chgs ", "rep "};
const char *description = "";
const char *type = types[item_type];
const char *pack = "";
apr_off_t offset;
svn_fs_fs__revision_file_t *rev_file;
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, revision,
scratch_pool));
/* determine rev / pack file offset */
SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, revision, NULL,
item_index, scratch_pool));
/* constructing the pack file description */
if (revision < ffd->min_unpacked_rev)
pack = apr_psprintf(scratch_pool, "%4ld|",
revision / ffd->max_files_per_dir);
/* construct description if possible */
if (item_type == SVN_FS_FS__ITEM_TYPE_NODEREV && item != NULL)
{
node_revision_t *node = item;
const char *data_rep
= node->data_rep
? apr_psprintf(scratch_pool, " d=%ld/%" APR_UINT64_T_FMT,
node->data_rep->revision,
node->data_rep->item_index)
: "";
const char *prop_rep
= node->prop_rep
? apr_psprintf(scratch_pool, " p=%ld/%" APR_UINT64_T_FMT,
node->prop_rep->revision,
node->prop_rep->item_index)
: "";
description = apr_psprintf(scratch_pool, "%s (pc=%d%s%s)",
node->created_path,
node->predecessor_count,
data_rep,
prop_rep);
}
else if (item_type == SVN_FS_FS__ITEM_TYPE_ANY_REP)
{
svn_fs_fs__rep_header_t *header = item;
if (header == NULL)
description = " (txdelta window)";
else if (header->type == svn_fs_fs__rep_plain)
description = " PLAIN";
else if (header->type == svn_fs_fs__rep_self_delta)
description = " DELTA";
else
description = apr_psprintf(scratch_pool,
" DELTA against %ld/%" APR_UINT64_T_FMT,
header->base_revision,
header->base_item_index);
}
else if (item_type == SVN_FS_FS__ITEM_TYPE_CHANGES && item != NULL)
{
apr_array_header_t *changes = item;
switch (changes->nelts)
{
case 0: description = " no change";
break;
case 1: description = " 1 change";
break;
default: description = apr_psprintf(scratch_pool, " %d changes",
changes->nelts);
}
}
/* some info is only available in format7 repos */
if (svn_fs_fs__use_log_addressing(fs))
{
/* reverse index lookup: get item description in ENTRY */
SVN_ERR(svn_fs_fs__p2l_entry_lookup(&entry, fs, rev_file, revision,
offset, scratch_pool));
if (entry)
{
/* more details */
end_offset = offset + entry->size;
type = types[entry->type];
}
/* line output */
printf("%5s%4lx:%04lx -%4lx:%04lx %s %7ld %5"APR_UINT64_T_FMT" %s\n",
pack, (long)(offset / ffd->block_size),
(long)(offset % ffd->block_size),
(long)(end_offset / ffd->block_size),
(long)(end_offset % ffd->block_size),
type, revision, item_index, description);
}
else
{
/* reduced logging for format 6 and earlier */
printf("%5s%10" APR_UINT64_T_HEX_FMT " %s %7ld %7" APR_UINT64_T_FMT \
" %s\n",
pack, (apr_uint64_t)(offset), type, revision, item_index,
description);
}
#endif
return SVN_NO_ERROR;
}
/* Convenience wrapper around svn_io_file_aligned_seek, taking filesystem
FS instead of a block size. */
static svn_error_t *
aligned_seek(svn_fs_t *fs,
apr_file_t *file,
apr_off_t *buffer_start,
apr_off_t offset,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
return svn_error_trace(svn_io_file_aligned_seek(file, ffd->block_size,
buffer_start, offset,
pool));
}
/* Open the revision file for revision REV in filesystem FS and store
the newly opened file in FILE. Seek to location OFFSET before
returning. Perform temporary allocations in POOL. */
static svn_error_t *
open_and_seek_revision(svn_fs_fs__revision_file_t **file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_uint64_t item,
apr_pool_t *pool)
{
svn_fs_fs__revision_file_t *rev_file;
apr_off_t offset = -1;
SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, rev, pool, pool));
SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, rev, NULL, item,
pool));
SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, pool));
*file = rev_file;
return SVN_NO_ERROR;
}
/* Open the representation REP for a node-revision in filesystem FS, seek
to its position and store the newly opened file in FILE. Perform
temporary allocations in POOL. */
static svn_error_t *
open_and_seek_transaction(svn_fs_fs__revision_file_t **file,
svn_fs_t *fs,
representation_t *rep,
apr_pool_t *pool)
{
apr_off_t offset;
SVN_ERR(svn_fs_fs__open_proto_rev_file(file, fs, &rep->txn_id, pool, pool));
SVN_ERR(svn_fs_fs__item_offset(&offset, fs, NULL, SVN_INVALID_REVNUM,
&rep->txn_id, rep->item_index, pool));
SVN_ERR(aligned_seek(fs, (*file)->file, NULL, offset, pool));
return SVN_NO_ERROR;
}
/* Given a node-id ID, and a representation REP in filesystem FS, open
the correct file and seek to the correction location. Store this
file in *FILE_P. Perform any allocations in POOL. */
static svn_error_t *
open_and_seek_representation(svn_fs_fs__revision_file_t **file_p,
svn_fs_t *fs,
representation_t *rep,
apr_pool_t *pool)
{
if (! svn_fs_fs__id_txn_used(&rep->txn_id))
return open_and_seek_revision(file_p, fs, rep->revision, rep->item_index,
pool);
else
return open_and_seek_transaction(file_p, fs, rep, pool);
}
static svn_error_t *
err_dangling_id(svn_fs_t *fs, const svn_fs_id_t *id)
{
svn_string_t *id_str = svn_fs_fs__id_unparse(id, fs->pool);
return svn_error_createf
(SVN_ERR_FS_ID_NOT_FOUND, 0,
_("Reference to non-existent node '%s' in filesystem '%s'"),
id_str->data, fs->path);
}
/* Return TRUE, if FS is of a format that supports block-read and the
feature has been enabled. */
static svn_boolean_t
use_block_read(svn_fs_t *fs)
{
fs_fs_data_t *ffd = fs->fsap_data;
return svn_fs_fs__use_log_addressing(fs) && ffd->use_block_read;
}
/* Get the node-revision for the node ID in FS.
Set *NODEREV_P to the new node-revision structure, allocated in POOL.
See svn_fs_fs__get_node_revision, which wraps this and adds another
error. */
static svn_error_t *
get_node_revision_body(node_revision_t **noderev_p,
svn_fs_t *fs,
const svn_fs_id_t *id,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_error_t *err;
svn_boolean_t is_cached = FALSE;
fs_fs_data_t *ffd = fs->fsap_data;
if (svn_fs_fs__id_is_txn(id))
{
apr_file_t *file;
/* This is a transaction node-rev. Its storage logic is very
different from that of rev / pack files. */
err = svn_io_file_open(&file,
svn_fs_fs__path_txn_node_rev(fs, id,
scratch_pool),
APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
scratch_pool);
if (err)
{
if (APR_STATUS_IS_ENOENT(err->apr_err))
{
svn_error_clear(err);
return svn_error_trace(err_dangling_id(fs, id));
}
return svn_error_trace(err);
}
SVN_ERR(svn_fs_fs__read_noderev(noderev_p,
svn_stream_from_aprfile2(file,
FALSE,
scratch_pool),
result_pool, scratch_pool));
}
else
{
svn_fs_fs__revision_file_t *revision_file;
/* noderevs in rev / pack files can be cached */
const svn_fs_fs__id_part_t *rev_item = svn_fs_fs__id_rev_item(id);
pair_cache_key_t key = { 0 };
key.revision = rev_item->revision;
key.second = rev_item->number;
/* Not found or not applicable. Try a noderev cache lookup.
* If that succeeds, we are done here. */
if (ffd->node_revision_cache)
{
SVN_ERR(svn_cache__get((void **) noderev_p,
&is_cached,
ffd->node_revision_cache,
&key,
result_pool));
if (is_cached)
return SVN_NO_ERROR;
}
/* read the data from disk */
SVN_ERR(open_and_seek_revision(&revision_file, fs,
rev_item->revision,
rev_item->number,
scratch_pool));
if (use_block_read(fs))
{
/* block-read will parse the whole block and will also return
the one noderev that we need right now. */
SVN_ERR(block_read((void **)noderev_p, fs,
rev_item->revision,
rev_item->number,
revision_file,
result_pool,
scratch_pool));
}
else
{
/* physical addressing mode reading, parsing and caching */
SVN_ERR(svn_fs_fs__read_noderev(noderev_p,
revision_file->stream,
result_pool,
scratch_pool));
/* Workaround issue #4031: is-fresh-txn-root in revision files. */
(*noderev_p)->is_fresh_txn_root = FALSE;
/* The noderev is not in cache, yet. Add it, if caching has been enabled. */
if (ffd->node_revision_cache)
SVN_ERR(svn_cache__set(ffd->node_revision_cache,
&key,
*noderev_p,
scratch_pool));
}
SVN_ERR(svn_fs_fs__close_revision_file(revision_file));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__get_node_revision(node_revision_t **noderev_p,
svn_fs_t *fs,
const svn_fs_id_t *id,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const svn_fs_fs__id_part_t *rev_item = svn_fs_fs__id_rev_item(id);
svn_error_t *err = get_node_revision_body(noderev_p, fs, id,
result_pool, scratch_pool);
if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
{
svn_string_t *id_string = svn_fs_fs__id_unparse(id, scratch_pool);
return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
"Corrupt node-revision '%s'",
id_string->data);
}
SVN_ERR(dbg_log_access(fs,
rev_item->revision,
rev_item->number,
*noderev_p,
SVN_FS_FS__ITEM_TYPE_NODEREV,
scratch_pool));
return svn_error_trace(err);
}
/* Given a revision file REV_FILE, opened to REV in FS, find the Node-ID
of the header located at OFFSET and store it in *ID_P. Allocate
temporary variables from POOL. */
static svn_error_t *
get_fs_id_at_offset(svn_fs_id_t **id_p,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_off_t offset,
apr_pool_t *pool)
{
node_revision_t *noderev;
SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, pool));
SVN_ERR(svn_fs_fs__read_noderev(&noderev,
rev_file->stream,
pool, pool));
/* noderev->id is const, get rid of that */
*id_p = svn_fs_fs__id_copy(noderev->id, pool);
/* assert that the txn_id is REV
* (asserting on offset would be harder because we the rev_offset is not
* known here) */
assert(svn_fs_fs__id_rev(*id_p) == rev);
return SVN_NO_ERROR;
}
/* Given an open revision file REV_FILE in FS for REV, locate the trailer that
specifies the offset to the root node-id and to the changed path
information. Store the root node offset in *ROOT_OFFSET and the
changed path offset in *CHANGES_OFFSET. If either of these
pointers is NULL, do nothing with it.
Allocate temporary variables from POOL. */
static svn_error_t *
get_root_changes_offset(apr_off_t *root_offset,
apr_off_t *changes_offset,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
apr_off_t rev_offset;
apr_seek_where_t seek_relative;
svn_stringbuf_t *trailer;
char buffer[64];
apr_off_t start;
apr_off_t end;
apr_size_t len;
/* Determine where to seek to in the file.
If we've got a pack file, we want to seek to the end of the desired
revision. But we don't track that, so we seek to the beginning of the
next revision.
Unless the next revision is in a different file, in which case, we can
just seek to the end of the pack file -- just like we do in the
non-packed case. */
if (rev_file->is_packed && ((rev + 1) % ffd->max_files_per_dir != 0))
{
SVN_ERR(svn_fs_fs__get_packed_offset(&end, fs, rev + 1, pool));
seek_relative = APR_SET;
}
else
{
seek_relative = APR_END;
end = 0;
}
/* Offset of the revision from the start of the pack file, if applicable. */
if (rev_file->is_packed)
SVN_ERR(svn_fs_fs__get_packed_offset(&rev_offset, fs, rev, pool));
else
rev_offset = 0;
/* We will assume that the last line containing the two offsets
will never be longer than 64 characters. */
SVN_ERR(svn_io_file_seek(rev_file->file, seek_relative, &end, pool));
if (end < sizeof(buffer))
{
len = (apr_size_t)end;
start = 0;
}
else
{
len = sizeof(buffer);
start = end - sizeof(buffer);
}
/* Read in this last block, from which we will identify the last line. */
SVN_ERR(aligned_seek(fs, rev_file->file, NULL, start, pool));
SVN_ERR(svn_io_file_read_full2(rev_file->file, buffer, len, NULL, NULL,
pool));
/* Parse the last line. */
trailer = svn_stringbuf_ncreate(buffer, len, pool);
SVN_ERR(svn_fs_fs__parse_revision_trailer(root_offset,
changes_offset,
trailer,
rev));
/* return absolute offsets */
if (root_offset)
*root_offset += rev_offset;
if (changes_offset)
*changes_offset += rev_offset;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__rev_get_root(svn_fs_id_t **root_id_p,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, scratch_pool));
if (svn_fs_fs__use_log_addressing(fs))
{
*root_id_p = svn_fs_fs__id_create_root(rev, result_pool);
}
else
{
svn_fs_fs__revision_file_t *revision_file;
apr_off_t root_offset;
svn_fs_id_t *root_id = NULL;
svn_boolean_t is_cached;
SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached,
ffd->rev_root_id_cache, &rev, result_pool));
if (is_cached)
return SVN_NO_ERROR;
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&revision_file, fs, rev,
scratch_pool, scratch_pool));
SVN_ERR(get_root_changes_offset(&root_offset, NULL,
revision_file, fs, rev,
scratch_pool));
SVN_ERR(get_fs_id_at_offset(&root_id, revision_file, fs, rev,
root_offset, result_pool));
SVN_ERR(svn_fs_fs__close_revision_file(revision_file));
SVN_ERR(svn_cache__set(ffd->rev_root_id_cache, &rev, root_id,
scratch_pool));
*root_id_p = root_id;
}
return SVN_NO_ERROR;
}
/* Describes a lazily opened rev / pack file. Instances will be shared
between multiple instances of rep_state_t. */
typedef struct shared_file_t
{
/* The opened file. NULL while file is not open, yet. */
svn_fs_fs__revision_file_t *rfile;
/* file system to open the file in */
svn_fs_t *fs;
/* a revision contained in the FILE. Since this file may be shared,
that value may be different from REP_STATE_T->REVISION. */
svn_revnum_t revision;
/* pool to use when creating the FILE. This guarantees that the file
remains open / valid beyond the respective local context that required
the file to be opened eventually. */
apr_pool_t *pool;
} shared_file_t;
/* Represents where in the current svndiff data block each
representation is. */
typedef struct rep_state_t
{
/* shared lazy-open rev/pack file structure */
shared_file_t *sfile;
/* The txdelta window cache to use or NULL. */
svn_cache__t *raw_window_cache;
/* Caches raw (unparsed) windows. May be NULL. */
svn_cache__t *window_cache;
/* Caches un-deltified windows. May be NULL. */
svn_cache__t *combined_cache;
/* revision containing the representation */
svn_revnum_t revision;
/* representation's item index in REVISION */
apr_uint64_t item_index;
/* length of the header at the start of the rep.
0 iff this is rep is stored in a container
(i.e. does not have a header) */
apr_size_t header_size;
apr_off_t start; /* The starting offset for the raw
svndiff/plaintext data minus header.
-1 if the offset is yet unknown. */
apr_off_t current;/* The current offset relative to START. */
apr_off_t size; /* The on-disk size of the representation. */
int ver; /* If a delta, what svndiff version?
-1 for unknown delta version. */
int chunk_index; /* number of the window to read */
} rep_state_t;
/* Simple wrapper around svn_fs_fs__get_file_offset to simplify callers. */
static svn_error_t *
get_file_offset(apr_off_t *offset,
rep_state_t *rs,
apr_pool_t *pool)
{
return svn_error_trace(svn_fs_fs__get_file_offset(offset,
rs->sfile->rfile->file,
pool));
}
/* Simple wrapper around svn_io_file_aligned_seek to simplify callers. */
static svn_error_t *
rs_aligned_seek(rep_state_t *rs,
apr_off_t *buffer_start,
apr_off_t offset,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = rs->sfile->fs->fsap_data;
return svn_error_trace(svn_io_file_aligned_seek(rs->sfile->rfile->file,
ffd->block_size,
buffer_start, offset,
pool));
}
/* Open FILE->FILE and FILE->STREAM if they haven't been opened, yet. */
static svn_error_t*
auto_open_shared_file(shared_file_t *file)
{
if (file->rfile == NULL)
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&file->rfile, file->fs,
file->revision, file->pool,
file->pool));
return SVN_NO_ERROR;
}
/* Set RS->START to the begin of the representation raw in RS->FILE->FILE,
if that hasn't been done yet. Use POOL for temporary allocations. */
static svn_error_t*
auto_set_start_offset(rep_state_t *rs, apr_pool_t *pool)
{
if (rs->start == -1)
{
SVN_ERR(svn_fs_fs__item_offset(&rs->start, rs->sfile->fs,
rs->sfile->rfile, rs->revision, NULL,
rs->item_index, pool));
rs->start += rs->header_size;
}
return SVN_NO_ERROR;
}
/* Set RS->VER depending on what is found in the already open RS->FILE->FILE
if the diff version is still unknown. Use POOL for temporary allocations.
*/
static svn_error_t*
auto_read_diff_version(rep_state_t *rs, apr_pool_t *pool)
{
if (rs->ver == -1)
{
char buf[4];
SVN_ERR(rs_aligned_seek(rs, NULL, rs->start, pool));
SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, buf,
sizeof(buf), NULL, NULL, pool));
/* ### Layering violation */
if (! ((buf[0] == 'S') && (buf[1] == 'V') && (buf[2] == 'N')))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed svndiff data in representation"));
rs->ver = buf[3];
rs->chunk_index = 0;
rs->current = 4;
}
return SVN_NO_ERROR;
}
/* See create_rep_state, which wraps this and adds another error. */
static svn_error_t *
create_rep_state_body(rep_state_t **rep_state,
svn_fs_fs__rep_header_t **rep_header,
shared_file_t **shared_file,
representation_t *rep,
svn_fs_t *fs,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
rep_state_t *rs = apr_pcalloc(result_pool, sizeof(*rs));
svn_fs_fs__rep_header_t *rh;
svn_boolean_t is_cached = FALSE;
apr_uint64_t estimated_window_storage;
/* If the hint is
* - given,
* - refers to a valid revision,
* - refers to a packed revision,
* - as does the rep we want to read, and
* - refers to the same pack file as the rep
* we can re-use the same, already open file object
*/
svn_boolean_t reuse_shared_file
= shared_file && *shared_file && (*shared_file)->rfile
&& SVN_IS_VALID_REVNUM((*shared_file)->revision)
&& (*shared_file)->revision < ffd->min_unpacked_rev
&& rep->revision < ffd->min_unpacked_rev
&& ( ((*shared_file)->revision / ffd->max_files_per_dir)
== (rep->revision / ffd->max_files_per_dir));
pair_cache_key_t key;
key.revision = rep->revision;
key.second = rep->item_index;
/* continue constructing RS and RA */
rs->size = rep->size;
rs->revision = rep->revision;
rs->item_index = rep->item_index;
rs->raw_window_cache = ffd->raw_window_cache;
rs->ver = -1;
rs->start = -1;
/* Very long files stored as self-delta will produce a huge number of
delta windows. Don't cache them lest we don't thrash the cache.
Since we don't know the depth of the delta chain, let's assume, the
whole contents get rewritten 3 times.
*/
estimated_window_storage
= 4 * ( (rep->expanded_size ? rep->expanded_size : rep->size)
+ SVN_DELTA_WINDOW_SIZE);
estimated_window_storage = MIN(estimated_window_storage, APR_SIZE_MAX);
rs->window_cache = ffd->txdelta_window_cache
&& svn_cache__is_cachable(ffd->txdelta_window_cache,
(apr_size_t)estimated_window_storage)
? ffd->txdelta_window_cache
: NULL;
rs->combined_cache = ffd->combined_window_cache
&& svn_cache__is_cachable(ffd->combined_window_cache,
(apr_size_t)estimated_window_storage)
? ffd->combined_window_cache
: NULL;
/* cache lookup, i.e. skip reading the rep header if possible */
if (ffd->rep_header_cache && !svn_fs_fs__id_txn_used(&rep->txn_id))
SVN_ERR(svn_cache__get((void **) &rh, &is_cached,
ffd->rep_header_cache, &key, result_pool));
/* initialize the (shared) FILE member in RS */
if (reuse_shared_file)
{
rs->sfile = *shared_file;
}
else
{
shared_file_t *file = apr_pcalloc(result_pool, sizeof(*file));
file->revision = rep->revision;
file->pool = result_pool;
file->fs = fs;
rs->sfile = file;
/* remember the current file, if suggested by the caller */
if (shared_file)
*shared_file = file;
}
/* read rep header, if necessary */
if (!is_cached)
{
/* ensure file is open and navigate to the start of rep header */
if (reuse_shared_file)
{
apr_off_t offset;
/* ... we can re-use the same, already open file object.
* This implies that we don't read from a txn.
*/
rs->sfile = *shared_file;
SVN_ERR(auto_open_shared_file(rs->sfile));
SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rs->sfile->rfile,
rep->revision, NULL, rep->item_index,
scratch_pool));
SVN_ERR(rs_aligned_seek(rs, NULL, offset, scratch_pool));
}
else
{
/* otherwise, create a new file object. May or may not be
* an in-txn file.
*/
SVN_ERR(open_and_seek_representation(&rs->sfile->rfile, fs, rep,
result_pool));
}
SVN_ERR(svn_fs_fs__read_rep_header(&rh, rs->sfile->rfile->stream,
result_pool, scratch_pool));
SVN_ERR(get_file_offset(&rs->start, rs, result_pool));
/* populate the cache if appropriate */
if (! svn_fs_fs__id_txn_used(&rep->txn_id))
{
if (use_block_read(fs))
SVN_ERR(block_read(NULL, fs, rep->revision, rep->item_index,
rs->sfile->rfile, result_pool, scratch_pool));
else
if (ffd->rep_header_cache)
SVN_ERR(svn_cache__set(ffd->rep_header_cache, &key, rh,
scratch_pool));
}
}
/* finalize */
SVN_ERR(dbg_log_access(fs, rep->revision, rep->item_index, rh,
SVN_FS_FS__ITEM_TYPE_ANY_REP, scratch_pool));
rs->header_size = rh->header_size;
*rep_state = rs;
*rep_header = rh;
if (rh->type == svn_fs_fs__rep_plain)
/* This is a plaintext, so just return the current rep_state. */
return SVN_NO_ERROR;
/* skip "SVNx" diff marker */
rs->current = 4;
return SVN_NO_ERROR;
}
/* Read the rep args for REP in filesystem FS and create a rep_state
for reading the representation. Return the rep_state in *REP_STATE
and the rep header in *REP_HEADER, both allocated in POOL.
When reading multiple reps, i.e. a skip delta chain, you may provide
non-NULL SHARED_FILE. (If SHARED_FILE is not NULL, in the first
call it should be a pointer to NULL.) The function will use this
variable to store the previous call results and tries to re-use it.
This may result in significant savings in I/O for packed files and
number of open file handles.
*/
static svn_error_t *
create_rep_state(rep_state_t **rep_state,
svn_fs_fs__rep_header_t **rep_header,
shared_file_t **shared_file,
representation_t *rep,
svn_fs_t *fs,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_error_t *err = create_rep_state_body(rep_state, rep_header,
shared_file, rep, fs,
result_pool, scratch_pool);
if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
{
fs_fs_data_t *ffd = fs->fsap_data;
const char *rep_str;
/* ### This always returns "-1" for transaction reps, because
### this particular bit of code doesn't know if the rep is
### stored in the protorev or in the mutable area (for props
### or dir contents). It is pretty rare for FSFS to *read*
### from the protorev file, though, so this is probably OK.
### And anyone going to debug corruption errors is probably
### going to jump straight to this comment anyway! */
rep_str = rep
? svn_fs_fs__unparse_representation
(rep, ffd->format, TRUE, scratch_pool, scratch_pool)->data
: "(null)";
return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
"Corrupt representation '%s'",
rep_str);
}
/* ### Call representation_string() ? */
return svn_error_trace(err);
}
svn_error_t *
svn_fs_fs__check_rep(representation_t *rep,
svn_fs_t *fs,
void **hint,
apr_pool_t *scratch_pool)
{
if (svn_fs_fs__use_log_addressing(fs))
{
apr_off_t offset;
svn_fs_fs__p2l_entry_t *entry;
svn_fs_fs__revision_file_t *rev_file = NULL;
/* Reuse the revision file provided by *HINT, if it is given and
* actually the rev / pack file that we want. */
svn_revnum_t start_rev = svn_fs_fs__packed_base_rev(fs, rep->revision);
if (hint)
rev_file = *(svn_fs_fs__revision_file_t **)hint;
if (rev_file == NULL || rev_file->start_revision != start_rev)
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, rep->revision,
scratch_pool, scratch_pool));
if (hint)
*hint = rev_file;
/* This will auto-retry if there was a background pack. */
SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, rep->revision,
NULL, rep->item_index, scratch_pool));
/* This may fail if there is a background pack operation (can't auto-
retry because the item offset lookup has to be redone as well). */
SVN_ERR(svn_fs_fs__p2l_entry_lookup(&entry, fs, rev_file,
rep->revision, offset,
scratch_pool, scratch_pool));
if ( entry == NULL
|| entry->type < SVN_FS_FS__ITEM_TYPE_FILE_REP
|| entry->type > SVN_FS_FS__ITEM_TYPE_DIR_PROPS)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("No representation found at offset %s "
"for item %s in revision %ld"),
apr_off_t_toa(scratch_pool, offset),
apr_psprintf(scratch_pool,
"%" APR_UINT64_T_FMT,
rep->item_index),
rep->revision);
}
else
{
rep_state_t *rs;
svn_fs_fs__rep_header_t *rep_header;
/* ### Should this be using read_rep_line() directly? */
SVN_ERR(create_rep_state(&rs, &rep_header, (shared_file_t**)hint,
rep, fs, scratch_pool, scratch_pool));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__rep_chain_length(int *chain_length,
int *shard_count,
representation_t *rep,
svn_fs_t *fs,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_revnum_t shard_size = ffd->max_files_per_dir
? ffd->max_files_per_dir
: 1;
apr_pool_t *subpool = svn_pool_create(scratch_pool);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
svn_boolean_t is_delta = FALSE;
int count = 0;
int shards = 1;
svn_revnum_t last_shard = rep->revision / shard_size;
/* Check whether the length of the deltification chain is acceptable.
* Otherwise, shared reps may form a non-skipping delta chain in
* extreme cases. */
representation_t base_rep = *rep;
/* re-use open files between iterations */
shared_file_t *file_hint = NULL;
svn_fs_fs__rep_header_t *header;
/* follow the delta chain towards the end but for at most
* MAX_CHAIN_LENGTH steps. */
do
{
rep_state_t *rep_state;
svn_pool_clear(iterpool);
if (base_rep.revision / shard_size != last_shard)
{
last_shard = base_rep.revision / shard_size;
++shards;
}
SVN_ERR(create_rep_state_body(&rep_state,
&header,
&file_hint,
&base_rep,
fs,
subpool,
iterpool));
base_rep.revision = header->base_revision;
base_rep.item_index = header->base_item_index;
base_rep.size = header->base_length;
svn_fs_fs__id_txn_reset(&base_rep.txn_id);
is_delta = header->type == svn_fs_fs__rep_delta;
/* Clear it the SUBPOOL once in a while. Doing it too frequently
* renders the FILE_HINT ineffective. Doing too infrequently, may
* leave us with too many open file handles.
*
* Note that this is mostly about efficiency, with larger values
* being more efficient, and any non-zero value is legal here. When
* reading deltified contents, we may keep 10s of rev files open at
* the same time and the system has to cope with that. Thus, the
* limit of 16 chosen below is in the same ballpark.
*/
++count;
if (count % 16 == 0)
{
file_hint = NULL;
svn_pool_clear(subpool);
}
}
while (is_delta && base_rep.revision);
*chain_length = count;
*shard_count = shards;
svn_pool_destroy(subpool);
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
struct rep_read_baton
{
/* The FS from which we're reading. */
svn_fs_t *fs;
/* Representation to read. */
representation_t rep;
/* If not NULL, this is the base for the first delta window in rs_list */
svn_stringbuf_t *base_window;
/* The state of all prior delta representations. */
apr_array_header_t *rs_list;
/* The plaintext state, if there is a plaintext. */
rep_state_t *src_state;
/* The index of the current delta chunk, if we are reading a delta. */
int chunk_index;
/* The buffer where we store undeltified data. */
char *buf;
apr_size_t buf_pos;
apr_size_t buf_len;
/* A checksum context for summing the data read in order to verify it.
Note: we don't need to use the sha1 checksum because we're only doing
data verification, for which md5 is perfectly safe. */
svn_checksum_ctx_t *md5_checksum_ctx;
svn_boolean_t checksum_finalized;
/* The stored checksum of the representation we are reading, its
length, and the amount we've read so far. Some of this
information is redundant with rs_list and src_state, but it's
convenient for the checksumming code to have it here. */
unsigned char md5_digest[APR_MD5_DIGESTSIZE];
svn_filesize_t len;
svn_filesize_t off;
/* The key for the fulltext cache for this rep, if there is a
fulltext cache. */
pair_cache_key_t fulltext_cache_key;
/* The text we've been reading, if we're going to cache it. */
svn_stringbuf_t *current_fulltext;
/* If not NULL, attempt to read the data from this cache.
Once that lookup fails, reset it to NULL. */
svn_cache__t *fulltext_cache;
/* Bytes delivered from the FULLTEXT_CACHE so far. If the next
lookup fails, we need to skip that much data from the reconstructed
window stream before we continue normal operation. */
svn_filesize_t fulltext_delivered;
/* Used for temporary allocations during the read. */
apr_pool_t *pool;
/* Pool used to store file handles and other data that is persistant
for the entire stream read. */
apr_pool_t *filehandle_pool;
};
/* Set window key in *KEY to address the window described by RS.
For convenience, return the KEY. */
static window_cache_key_t *
get_window_key(window_cache_key_t *key, rep_state_t *rs)
{
assert(rs->revision <= APR_UINT32_MAX);
key->revision = (apr_uint32_t)rs->revision;
key->item_index = rs->item_index;
key->chunk_index = rs->chunk_index;
return key;
}
/* Implement svn_cache__partial_getter_func_t for raw txdelta windows.
* Parse the raw data and return a svn_fs_fs__txdelta_cached_window_t.
*/
static svn_error_t *
parse_raw_window(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *result_pool)
{
svn_string_t raw_window;
svn_stream_t *stream;
/* unparsed and parsed window */
const svn_fs_fs__raw_cached_window_t *window
= (const svn_fs_fs__raw_cached_window_t *)data;
svn_fs_fs__txdelta_cached_window_t *result
= apr_pcalloc(result_pool, sizeof(*result));
/* create a read stream taking the raw window as input */
raw_window.data = svn_temp_deserializer__ptr(window,
(const void * const *)&window->window.data);
raw_window.len = window->window.len;
stream = svn_stream_from_string(&raw_window, result_pool);
/* parse it */
SVN_ERR(svn_txdelta_read_svndiff_window(&result->window, stream, 1,
result_pool));
/* complete the window and return it */
result->end_offset = window->end_offset;
*out = result;
return SVN_NO_ERROR;
}
/* Read the WINDOW_P number CHUNK_INDEX for the representation given in
* rep state RS from the current FSFS session's cache. This will be a
* no-op and IS_CACHED will be set to FALSE if no cache has been given.
* If a cache is available IS_CACHED will inform the caller about the
* success of the lookup. Allocations of the window in will be made
* from RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
*
* If the information could be found, put RS to CHUNK_INDEX.
*/
static svn_error_t *
get_cached_window(svn_txdelta_window_t **window_p,
rep_state_t *rs,
int chunk_index,
svn_boolean_t *is_cached,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
if (! rs->window_cache)
{
/* txdelta window has not been enabled */
*is_cached = FALSE;
}
else
{
/* ask the cache for the desired txdelta window */
svn_fs_fs__txdelta_cached_window_t *cached_window;
window_cache_key_t key = { 0 };
get_window_key(&key, rs);
key.chunk_index = chunk_index;
SVN_ERR(svn_cache__get((void **) &cached_window,
is_cached,
rs->window_cache,
&key,
result_pool));
/* If we did not find a parsed txdelta window, we might have a raw
version of it in our cache. If so, read, parse and re-cache it. */
if (!*is_cached && rs->raw_window_cache)
{
SVN_ERR(svn_cache__get_partial((void **) &cached_window, is_cached,
rs->raw_window_cache, &key,
parse_raw_window, NULL, result_pool));
if (*is_cached)
SVN_ERR(svn_cache__set(rs->window_cache, &key, cached_window,
scratch_pool));
}
/* Return cached information. */
if (*is_cached)
{
/* found it. Pass it back to the caller. */
*window_p = cached_window->window;
/* manipulate the RS as if we just read the data */
rs->current = cached_window->end_offset;
rs->chunk_index = chunk_index;
}
}
return SVN_NO_ERROR;
}
/* Store the WINDOW read for the rep state RS in the current FSFS
* session's cache. This will be a no-op if no cache has been given.
* Temporary allocations will be made from SCRATCH_POOL. */
static svn_error_t *
set_cached_window(svn_txdelta_window_t *window,
rep_state_t *rs,
apr_pool_t *scratch_pool)
{
if (rs->window_cache)
{
/* store the window and the first offset _past_ it */
svn_fs_fs__txdelta_cached_window_t cached_window;
window_cache_key_t key = {0};
cached_window.window = window;
cached_window.end_offset = rs->current;
/* but key it with the start offset because that is the known state
* when we will look it up */
SVN_ERR(svn_cache__set(rs->window_cache,
get_window_key(&key, rs),
&cached_window,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Read the WINDOW_P for the rep state RS from the current FSFS session's
* cache. This will be a no-op and IS_CACHED will be set to FALSE if no
* cache has been given. If a cache is available IS_CACHED will inform
* the caller about the success of the lookup. Allocations (of the window
* in particular) will be made from POOL.
*/
static svn_error_t *
get_cached_combined_window(svn_stringbuf_t **window_p,
rep_state_t *rs,
svn_boolean_t *is_cached,
apr_pool_t *pool)
{
if (! rs->combined_cache)
{
/* txdelta window has not been enabled */
*is_cached = FALSE;
}
else
{
/* ask the cache for the desired txdelta window */
window_cache_key_t key = { 0 };
return svn_cache__get((void **)window_p,
is_cached,
rs->combined_cache,
get_window_key(&key, rs),
pool);
}
return SVN_NO_ERROR;
}
/* Store the WINDOW read for the rep state RS in the current FSFS session's
* cache. This will be a no-op if no cache has been given.
* Temporary allocations will be made from SCRATCH_POOL. */
static svn_error_t *
set_cached_combined_window(svn_stringbuf_t *window,
rep_state_t *rs,
apr_pool_t *scratch_pool)
{
if (rs->combined_cache)
{
/* but key it with the start offset because that is the known state
* when we will look it up */
window_cache_key_t key = { 0 };
return svn_cache__set(rs->combined_cache,
get_window_key(&key, rs),
window,
scratch_pool);
}
return SVN_NO_ERROR;
}
/* Build an array of rep_state structures in *LIST giving the delta
reps from first_rep to a plain-text or self-compressed rep. Set
*SRC_STATE to the plain-text rep we find at the end of the chain,
or to NULL if the final delta representation is self-compressed.
The representation to start from is designated by filesystem FS, id
ID, and representation REP.
Also, set *WINDOW_P to the base window content for *LIST, if it
could be found in cache. Otherwise, *LIST will contain the base
representation for the whole delta chain.
Finally, return the expanded size of the representation in
*EXPANDED_SIZE. It will take care of cases where only the on-disk
size is known. */
static svn_error_t *
build_rep_list(apr_array_header_t **list,
svn_stringbuf_t **window_p,
rep_state_t **src_state,
svn_filesize_t *expanded_size,
svn_fs_t *fs,
representation_t *first_rep,
apr_pool_t *pool)
{
representation_t rep;
rep_state_t *rs = NULL;
svn_fs_fs__rep_header_t *rep_header;
svn_boolean_t is_cached = FALSE;
shared_file_t *shared_file = NULL;
apr_pool_t *iterpool = svn_pool_create(pool);
*list = apr_array_make(pool, 1, sizeof(rep_state_t *));
rep = *first_rep;
/* The value as stored in the data struct.
0 is either for unknown length or actually zero length. */
*expanded_size = first_rep->expanded_size;
/* for the top-level rep, we need the rep_args */
SVN_ERR(create_rep_state(&rs, &rep_header, &shared_file, &rep, fs, pool,
iterpool));
/* Unknown size or empty representation?
That implies the this being the first iteration.
Usually size equals on-disk size, except for empty,
compressed representations (delta, size = 4).
Please note that for all non-empty deltas have
a 4-byte header _plus_ some data. */
if (*expanded_size == 0)
if (rep_header->type == svn_fs_fs__rep_plain || first_rep->size != 4)
*expanded_size = first_rep->size;
while (1)
{
svn_pool_clear(iterpool);
/* fetch state, if that has not been done already */
if (!rs)
SVN_ERR(create_rep_state(&rs, &rep_header, &shared_file,
&rep, fs, pool, iterpool));
/* for txn reps, there won't be a cached combined window */
if (!svn_fs_fs__id_txn_used(&rep.txn_id))
SVN_ERR(get_cached_combined_window(window_p, rs, &is_cached, pool));
if (is_cached)
{
/* We already have a reconstructed window in our cache.
Write a pseudo rep_state with the full length. */
rs->start = 0;
rs->current = 0;
rs->size = (*window_p)->len;
*src_state = rs;
break;
}
if (rep_header->type == svn_fs_fs__rep_plain)
{
/* This is a plaintext, so just return the current rep_state. */
*src_state = rs;
break;
}
/* Push this rep onto the list. If it's self-compressed, we're done. */
APR_ARRAY_PUSH(*list, rep_state_t *) = rs;
if (rep_header->type == svn_fs_fs__rep_self_delta)
{
*src_state = NULL;
break;
}
rep.revision = rep_header->base_revision;
rep.item_index = rep_header->base_item_index;
rep.size = rep_header->base_length;
svn_fs_fs__id_txn_reset(&rep.txn_id);
rs = NULL;
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Create a rep_read_baton structure for node revision NODEREV in
filesystem FS and store it in *RB_P. Perform all allocations in
POOL. If rep is mutable, it must be for file contents. */
static svn_error_t *
rep_read_get_baton(struct rep_read_baton **rb_p,
svn_fs_t *fs,
representation_t *rep,
pair_cache_key_t fulltext_cache_key,
apr_pool_t *pool)
{
struct rep_read_baton *b;
b = apr_pcalloc(pool, sizeof(*b));
b->fs = fs;
b->rep = *rep;
b->base_window = NULL;
b->chunk_index = 0;
b->buf = NULL;
b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
b->checksum_finalized = FALSE;
memcpy(b->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
b->len = rep->expanded_size;
b->off = 0;
b->fulltext_cache_key = fulltext_cache_key;
b->pool = svn_pool_create(pool);
b->filehandle_pool = svn_pool_create(pool);
b->fulltext_cache = NULL;
b->fulltext_delivered = 0;
b->current_fulltext = NULL;
/* Save our output baton. */
*rb_p = b;
return SVN_NO_ERROR;
}
/* Skip forwards to THIS_CHUNK in REP_STATE and then read the next delta
window into *NWIN. Note that RS->CHUNK_INDEX will be THIS_CHUNK rather
than THIS_CHUNK + 1 when this function returns. */
static svn_error_t *
read_delta_window(svn_txdelta_window_t **nwin, int this_chunk,
rep_state_t *rs, apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_boolean_t is_cached;
apr_off_t start_offset;
apr_off_t end_offset;
apr_pool_t *iterpool;
SVN_ERR_ASSERT(rs->chunk_index <= this_chunk);
SVN_ERR(dbg_log_access(rs->sfile->fs, rs->revision, rs->item_index,
NULL, SVN_FS_FS__ITEM_TYPE_ANY_REP, scratch_pool));
/* Read the next window. But first, try to find it in the cache. */
SVN_ERR(get_cached_window(nwin, rs, this_chunk, &is_cached,
result_pool, scratch_pool));
if (is_cached)
return SVN_NO_ERROR;
/* someone has to actually read the data from file. Open it */
SVN_ERR(auto_open_shared_file(rs->sfile));
/* invoke the 'block-read' feature for non-txn data.
However, don't do that if we are in the middle of some representation,
because the block is unlikely to contain other data. */
if ( rs->chunk_index == 0
&& SVN_IS_VALID_REVNUM(rs->revision)
&& use_block_read(rs->sfile->fs)
&& rs->raw_window_cache)
{
SVN_ERR(block_read(NULL, rs->sfile->fs, rs->revision, rs->item_index,
rs->sfile->rfile, result_pool, scratch_pool));
/* reading the whole block probably also provided us with the
desired txdelta window */
SVN_ERR(get_cached_window(nwin, rs, this_chunk, &is_cached,
result_pool, scratch_pool));
if (is_cached)
return SVN_NO_ERROR;
}
/* data is still not cached -> we need to read it.
Make sure we have all the necessary info. */
SVN_ERR(auto_set_start_offset(rs, scratch_pool));
SVN_ERR(auto_read_diff_version(rs, scratch_pool));
/* RS->FILE may be shared between RS instances -> make sure we point
* to the right data. */
start_offset = rs->start + rs->current;
SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, scratch_pool));
/* Skip windows to reach the current chunk if we aren't there yet. */
iterpool = svn_pool_create(scratch_pool);
while (rs->chunk_index < this_chunk)
{
svn_pool_clear(iterpool);
SVN_ERR(svn_txdelta_skip_svndiff_window(rs->sfile->rfile->file,
rs->ver, iterpool));
rs->chunk_index++;
SVN_ERR(get_file_offset(&start_offset, rs, iterpool));
rs->current = start_offset - rs->start;
if (rs->current >= rs->size)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Reading one svndiff window read "
"beyond the end of the "
"representation"));
}
svn_pool_destroy(iterpool);
/* Actually read the next window. */
SVN_ERR(svn_txdelta_read_svndiff_window(nwin, rs->sfile->rfile->stream,
rs->ver, result_pool));
SVN_ERR(get_file_offset(&end_offset, rs, scratch_pool));
rs->current = end_offset - rs->start;
if (rs->current > rs->size)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Reading one svndiff window read beyond "
"the end of the representation"));
/* the window has not been cached before, thus cache it now
* (if caching is used for them at all) */
if (SVN_IS_VALID_REVNUM(rs->revision))
SVN_ERR(set_cached_window(*nwin, rs, scratch_pool));
return SVN_NO_ERROR;
}
/* Read SIZE bytes from the representation RS and return it in *NWIN. */
static svn_error_t *
read_plain_window(svn_stringbuf_t **nwin, rep_state_t *rs,
apr_size_t size, apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_off_t offset;
/* RS->FILE may be shared between RS instances -> make sure we point
* to the right data. */
SVN_ERR(auto_open_shared_file(rs->sfile));
SVN_ERR(auto_set_start_offset(rs, scratch_pool));
offset = rs->start + rs->current;
SVN_ERR(rs_aligned_seek(rs, NULL, offset, scratch_pool));
/* Read the plain data. */
*nwin = svn_stringbuf_create_ensure(size, result_pool);
SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, (*nwin)->data, size,
NULL, NULL, result_pool));
(*nwin)->data[size] = 0;
/* Update RS. */
rs->current += (apr_off_t)size;
return SVN_NO_ERROR;
}
+/* Skip SIZE bytes from the PLAIN representation RS. */
+static svn_error_t *
+skip_plain_window(rep_state_t *rs,
+ apr_size_t size)
+{
+ /* Update RS. */
+ rs->current += (apr_off_t)size;
+
+ return SVN_NO_ERROR;
+}
+
/* Get the undeltified window that is a result of combining all deltas
from the current desired representation identified in *RB with its
base representation. Store the window in *RESULT. */
static svn_error_t *
get_combined_window(svn_stringbuf_t **result,
struct rep_read_baton *rb)
{
apr_pool_t *pool, *new_pool, *window_pool;
int i;
apr_array_header_t *windows;
svn_stringbuf_t *source, *buf = rb->base_window;
rep_state_t *rs;
apr_pool_t *iterpool;
/* Read all windows that we need to combine. This is fine because
the size of each window is relatively small (100kB) and skip-
delta limits the number of deltas in a chain to well under 100.
Stop early if one of them does not depend on its predecessors. */
window_pool = svn_pool_create(rb->pool);
windows = apr_array_make(window_pool, 0, sizeof(svn_txdelta_window_t *));
iterpool = svn_pool_create(rb->pool);
for (i = 0; i < rb->rs_list->nelts; ++i)
{
svn_txdelta_window_t *window;
svn_pool_clear(iterpool);
rs = APR_ARRAY_IDX(rb->rs_list, i, rep_state_t *);
SVN_ERR(read_delta_window(&window, rb->chunk_index, rs, window_pool,
iterpool));
APR_ARRAY_PUSH(windows, svn_txdelta_window_t *) = window;
if (window->src_ops == 0)
{
++i;
break;
}
}
/* Combine in the windows from the other delta reps. */
pool = svn_pool_create(rb->pool);
for (--i; i >= 0; --i)
{
svn_txdelta_window_t *window;
svn_pool_clear(iterpool);
rs = APR_ARRAY_IDX(rb->rs_list, i, rep_state_t *);
window = APR_ARRAY_IDX(windows, i, svn_txdelta_window_t *);
/* Maybe, we've got a PLAIN start representation. If we do, read
as much data from it as the needed for the txdelta window's source
view.
Note that BUF / SOURCE may only be NULL in the first iteration.
Also note that we may have short-cut reading the delta chain --
in which case SRC_OPS is 0 and it might not be a PLAIN rep. */
source = buf;
- if (source == NULL && rb->src_state != NULL && window->src_ops)
- SVN_ERR(read_plain_window(&source, rb->src_state, window->sview_len,
- pool, iterpool));
+ if (source == NULL && rb->src_state != NULL)
+ {
+ /* Even if we don't need the source rep now, we still must keep
+ * its read offset in sync with what we might need for the next
+ * window. */
+ if (window->src_ops)
+ SVN_ERR(read_plain_window(&source, rb->src_state,
+ window->sview_len,
+ pool, iterpool));
+ else
+ SVN_ERR(skip_plain_window(rb->src_state, window->sview_len));
+ }
/* Combine this window with the current one. */
new_pool = svn_pool_create(rb->pool);
buf = svn_stringbuf_create_ensure(window->tview_len, new_pool);
buf->len = window->tview_len;
svn_txdelta_apply_instructions(window, source ? source->data : NULL,
buf->data, &buf->len);
if (buf->len != window->tview_len)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("svndiff window length is "
"corrupt"));
/* Cache windows only if the whole rep content could be read as a
single chunk. Only then will no other chunk need a deeper RS
list than the cached chunk. */
if ( (rb->chunk_index == 0) && (rs->current == rs->size)
&& SVN_IS_VALID_REVNUM(rs->revision))
SVN_ERR(set_cached_combined_window(buf, rs, new_pool));
rs->chunk_index++;
/* Cycle pools so that we only need to hold three windows at a time. */
svn_pool_destroy(pool);
pool = new_pool;
}
svn_pool_destroy(iterpool);
svn_pool_destroy(window_pool);
*result = buf;
return SVN_NO_ERROR;
}
/* Returns whether or not the expanded fulltext of the file is cachable
* based on its size SIZE. The decision depends on the cache used by RB.
*/
static svn_boolean_t
fulltext_size_is_cachable(fs_fs_data_t *ffd, svn_filesize_t size)
{
return (size < APR_SIZE_MAX)
&& svn_cache__is_cachable(ffd->fulltext_cache, (apr_size_t)size);
}
/* Close method used on streams returned by read_representation().
*/
static svn_error_t *
rep_read_contents_close(void *baton)
{
struct rep_read_baton *rb = baton;
svn_pool_destroy(rb->pool);
svn_pool_destroy(rb->filehandle_pool);
return SVN_NO_ERROR;
}
/* Return the next *LEN bytes of the rep from our plain / delta windows
and store them in *BUF. */
static svn_error_t *
get_contents_from_windows(struct rep_read_baton *rb,
char *buf,
apr_size_t *len)
{
apr_size_t copy_len, remaining = *len;
char *cur = buf;
rep_state_t *rs;
/* Special case for when there are no delta reps, only a plain
text. */
if (rb->rs_list->nelts == 0)
{
copy_len = remaining;
rs = rb->src_state;
if (rb->base_window != NULL)
{
/* We got the desired rep directly from the cache.
This is where we need the pseudo rep_state created
by build_rep_list(). */
apr_size_t offset = (apr_size_t)rs->current;
if (copy_len + offset > rb->base_window->len)
copy_len = offset < rb->base_window->len
? rb->base_window->len - offset
: 0ul;
memcpy (cur, rb->base_window->data + offset, copy_len);
}
else
{
apr_off_t offset;
if (((apr_off_t) copy_len) > rs->size - rs->current)
copy_len = (apr_size_t) (rs->size - rs->current);
SVN_ERR(auto_open_shared_file(rs->sfile));
SVN_ERR(auto_set_start_offset(rs, rb->pool));
offset = rs->start + rs->current;
SVN_ERR(rs_aligned_seek(rs, NULL, offset, rb->pool));
SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, cur,
copy_len, NULL, NULL, rb->pool));
}
rs->current += copy_len;
*len = copy_len;
return SVN_NO_ERROR;
}
while (remaining > 0)
{
/* If we have buffered data from a previous chunk, use that. */
if (rb->buf)
{
/* Determine how much to copy from the buffer. */
copy_len = rb->buf_len - rb->buf_pos;
if (copy_len > remaining)
copy_len = remaining;
/* Actually copy the data. */
memcpy(cur, rb->buf + rb->buf_pos, copy_len);
rb->buf_pos += copy_len;
cur += copy_len;
remaining -= copy_len;
/* If the buffer is all used up, clear it and empty the
local pool. */
if (rb->buf_pos == rb->buf_len)
{
svn_pool_clear(rb->pool);
rb->buf = NULL;
}
}
else
{
svn_stringbuf_t *sbuf = NULL;
rs = APR_ARRAY_IDX(rb->rs_list, 0, rep_state_t *);
if (rs->current == rs->size)
break;
/* Get more buffered data by evaluating a chunk. */
SVN_ERR(get_combined_window(&sbuf, rb));
rb->chunk_index++;
rb->buf_len = sbuf->len;
rb->buf = sbuf->data;
rb->buf_pos = 0;
}
}
*len = cur - buf;
return SVN_NO_ERROR;
}
/* Baton type for get_fulltext_partial. */
typedef struct fulltext_baton_t
{
/* Target buffer to write to; of at least LEN bytes. */
char *buffer;
/* Offset within the respective fulltext at which we shall start to
copy data into BUFFER. */
apr_size_t start;
/* Number of bytes to copy. The actual amount may be less in case
the fulltext is short(er). */
apr_size_t len;
/* Number of bytes actually copied into BUFFER. */
apr_size_t read;
} fulltext_baton_t;
/* Implement svn_cache__partial_getter_func_t for fulltext caches.
* From the fulltext in DATA, we copy the range specified by the
* fulltext_baton_t* BATON into the buffer provided by that baton.
* OUT and RESULT_POOL are not used.
*/
static svn_error_t *
get_fulltext_partial(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *result_pool)
{
fulltext_baton_t *fulltext_baton = baton;
/* We cached the fulltext with an NUL appended to it. */
apr_size_t fulltext_len = data_len - 1;
/* Clip the copy range to what the fulltext size allows. */
apr_size_t start = MIN(fulltext_baton->start, fulltext_len);
fulltext_baton->read = MIN(fulltext_len - start, fulltext_baton->len);
/* Copy the data to the output buffer and be done. */
memcpy(fulltext_baton->buffer, (const char *)data + start,
fulltext_baton->read);
return SVN_NO_ERROR;
}
/* Find the fulltext specified in BATON in the fulltext cache given
* as well by BATON. If that succeeds, set *CACHED to TRUE and copy
* up to the next *LEN bytes into BUFFER. Set *LEN to the actual
* number of bytes copied.
*/
static svn_error_t *
get_contents_from_fulltext(svn_boolean_t *cached,
struct rep_read_baton *baton,
char *buffer,
apr_size_t *len)
{
void *dummy;
fulltext_baton_t fulltext_baton;
SVN_ERR_ASSERT((apr_size_t)baton->fulltext_delivered
== baton->fulltext_delivered);
fulltext_baton.buffer = buffer;
fulltext_baton.start = (apr_size_t)baton->fulltext_delivered;
fulltext_baton.len = *len;
fulltext_baton.read = 0;
SVN_ERR(svn_cache__get_partial(&dummy, cached, baton->fulltext_cache,
&baton->fulltext_cache_key,
get_fulltext_partial, &fulltext_baton,
baton->pool));
if (*cached)
{
baton->fulltext_delivered += fulltext_baton.read;
*len = fulltext_baton.read;
}
return SVN_NO_ERROR;
}
/* Determine the optimal size of a string buf that shall receive a
* (full-) text of NEEDED bytes.
*
* The critical point is that those buffers may be very large and
* can cause memory fragmentation. We apply simple heuristics to
* make fragmentation less likely.
*/
static apr_size_t
optimimal_allocation_size(apr_size_t needed)
{
/* For all allocations, assume some overhead that is shared between
* OS memory managemnt, APR memory management and svn_stringbuf_t. */
const apr_size_t overhead = 0x400;
apr_size_t optimal;
/* If an allocation size if safe for other ephemeral buffers, it should
* be safe for ours. */
if (needed <= SVN__STREAM_CHUNK_SIZE)
return needed;
/* Paranoia edge case:
* Skip our heuristics if they created arithmetical overflow.
* Beware to make this test work for NEEDED = APR_SIZE_MAX as well! */
if (needed >= APR_SIZE_MAX / 2 - overhead)
return needed;
/* As per definition SVN__STREAM_CHUNK_SIZE is a power of two.
* Since we know NEEDED to be larger than that, use it as the
* starting point.
*
* Heuristics: Allocate a power-of-two number of bytes that fit
* NEEDED plus some OVERHEAD. The APR allocator
* will round it up to the next full page size.
*/
optimal = SVN__STREAM_CHUNK_SIZE;
while (optimal - overhead < needed)
optimal *= 2;
/* This is above or equal to NEEDED. */
return optimal - overhead;
}
/* After a fulltext cache lookup failure, we will continue to read from
* combined delta or plain windows. However, we must first make that data
* stream in BATON catch up tho the position LEN already delivered from the
* fulltext cache. Also, we need to store the reconstructed fulltext if we
* want to cache it at the end.
*/
static svn_error_t *
skip_contents(struct rep_read_baton *baton,
svn_filesize_t len)
{
svn_error_t *err = SVN_NO_ERROR;
/* Do we want to cache the reconstructed fulltext? */
if (SVN_IS_VALID_REVNUM(baton->fulltext_cache_key.revision))
{
char *buffer;
svn_filesize_t to_alloc = MAX(len, baton->len);
/* This should only be happening if BATON->LEN and LEN are
* cacheable, implying they fit into memory. */
SVN_ERR_ASSERT((apr_size_t)to_alloc == to_alloc);
/* Allocate the fulltext buffer. */
baton->current_fulltext = svn_stringbuf_create_ensure(
optimimal_allocation_size((apr_size_t)to_alloc),
baton->filehandle_pool);
/* Read LEN bytes from the window stream and store the data
* in the fulltext buffer (will be filled by further reads later). */
baton->current_fulltext->len = (apr_size_t)len;
baton->current_fulltext->data[(apr_size_t)len] = 0;
buffer = baton->current_fulltext->data;
while (len > 0 && !err)
{
apr_size_t to_read = (apr_size_t)len;
err = get_contents_from_windows(baton, buffer, &to_read);
len -= to_read;
buffer += to_read;
}
}
else if (len > 0)
{
/* Simply drain LEN bytes from the window stream. */
apr_pool_t *subpool = subpool = svn_pool_create(baton->pool);
char *buffer = apr_palloc(subpool, SVN__STREAM_CHUNK_SIZE);
while (len > 0 && !err)
{
apr_size_t to_read = len > SVN__STREAM_CHUNK_SIZE
? SVN__STREAM_CHUNK_SIZE
: (apr_size_t)len;
err = get_contents_from_windows(baton, buffer, &to_read);
len -= to_read;
}
svn_pool_destroy(subpool);
}
return svn_error_trace(err);
}
/* BATON is of type `rep_read_baton'; read the next *LEN bytes of the
representation and store them in *BUF. Sum as we read and verify
the MD5 sum at the end. */
static svn_error_t *
rep_read_contents(void *baton,
char *buf,
apr_size_t *len)
{
struct rep_read_baton *rb = baton;
/* Get data from the fulltext cache for as long as we can. */
if (rb->fulltext_cache)
{
svn_boolean_t cached;
SVN_ERR(get_contents_from_fulltext(&cached, rb, buf, len));
if (cached)
return SVN_NO_ERROR;
/* Cache miss. From now on, we will never read from the fulltext
* cache for this representation anymore. */
rb->fulltext_cache = NULL;
}
/* No fulltext cache to help us. We must read from the window stream. */
if (!rb->rs_list)
{
/* Window stream not initialized, yet. Do it now. */
SVN_ERR(build_rep_list(&rb->rs_list, &rb->base_window,
&rb->src_state, &rb->len, rb->fs, &rb->rep,
rb->filehandle_pool));
/* In case we did read from the fulltext cache before, make the
* window stream catch up. Also, initialize the fulltext buffer
* if we want to cache the fulltext at the end. */
SVN_ERR(skip_contents(rb, rb->fulltext_delivered));
}
/* Get the next block of data. */
SVN_ERR(get_contents_from_windows(rb, buf, len));
if (rb->current_fulltext)
svn_stringbuf_appendbytes(rb->current_fulltext, buf, *len);
/* Perform checksumming. We want to check the checksum as soon as
the last byte of data is read, in case the caller never performs
a short read, but we don't want to finalize the MD5 context
twice. */
if (!rb->checksum_finalized)
{
SVN_ERR(svn_checksum_update(rb->md5_checksum_ctx, buf, *len));
rb->off += *len;
if (rb->off == rb->len)
{
svn_checksum_t *md5_checksum;
svn_checksum_t expected;
expected.kind = svn_checksum_md5;
expected.digest = rb->md5_digest;
rb->checksum_finalized = TRUE;
SVN_ERR(svn_checksum_final(&md5_checksum, rb->md5_checksum_ctx,
rb->pool));
if (!svn_checksum_match(md5_checksum, &expected))
return svn_error_create(SVN_ERR_FS_CORRUPT,
svn_checksum_mismatch_err(&expected, md5_checksum,
rb->pool,
_("Checksum mismatch while reading representation")),
NULL);
}
}
if (rb->off == rb->len && rb->current_fulltext)
{
fs_fs_data_t *ffd = rb->fs->fsap_data;
SVN_ERR(svn_cache__set(ffd->fulltext_cache, &rb->fulltext_cache_key,
rb->current_fulltext, rb->pool));
rb->current_fulltext = NULL;
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__get_contents(svn_stream_t **contents_p,
svn_fs_t *fs,
representation_t *rep,
svn_boolean_t cache_fulltext,
apr_pool_t *pool)
{
if (! rep)
{
*contents_p = svn_stream_empty(pool);
}
else
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_filesize_t len = rep->expanded_size ? rep->expanded_size : rep->size;
struct rep_read_baton *rb;
pair_cache_key_t fulltext_cache_key = { 0 };
fulltext_cache_key.revision = rep->revision;
fulltext_cache_key.second = rep->item_index;
/* Initialize the reader baton. Some members may added lazily
* while reading from the stream */
SVN_ERR(rep_read_get_baton(&rb, fs, rep, fulltext_cache_key, pool));
/* Make the stream attempt fulltext cache lookups if the fulltext
* is cacheable. If it is not, then also don't try to buffer and
* cache it. */
if (ffd->fulltext_cache && cache_fulltext
&& SVN_IS_VALID_REVNUM(rep->revision)
&& fulltext_size_is_cachable(ffd, len))
{
rb->fulltext_cache = ffd->fulltext_cache;
}
else
{
/* This will also prevent the reconstructed fulltext from being
put into the cache. */
rb->fulltext_cache_key.revision = SVN_INVALID_REVNUM;
}
*contents_p = svn_stream_create(rb, pool);
svn_stream_set_read2(*contents_p, NULL /* only full read support */,
rep_read_contents);
svn_stream_set_close(*contents_p, rep_read_contents_close);
}
return SVN_NO_ERROR;
}
/* Baton for cache_access_wrapper. Wraps the original parameters of
* svn_fs_fs__try_process_file_content().
*/
typedef struct cache_access_wrapper_baton_t
{
svn_fs_process_contents_func_t func;
void* baton;
} cache_access_wrapper_baton_t;
/* Wrapper to translate between svn_fs_process_contents_func_t and
* svn_cache__partial_getter_func_t.
*/
static svn_error_t *
cache_access_wrapper(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *pool)
{
cache_access_wrapper_baton_t *wrapper_baton = baton;
SVN_ERR(wrapper_baton->func((const unsigned char *)data,
data_len - 1, /* cache adds terminating 0 */
wrapper_baton->baton,
pool));
/* non-NULL value to signal the calling cache that all went well */
*out = baton;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__try_process_file_contents(svn_boolean_t *success,
svn_fs_t *fs,
node_revision_t *noderev,
svn_fs_process_contents_func_t processor,
void* baton,
apr_pool_t *pool)
{
representation_t *rep = noderev->data_rep;
if (rep)
{
fs_fs_data_t *ffd = fs->fsap_data;
pair_cache_key_t fulltext_cache_key = { 0 };
fulltext_cache_key.revision = rep->revision;
fulltext_cache_key.second = rep->item_index;
if (ffd->fulltext_cache && SVN_IS_VALID_REVNUM(rep->revision)
&& fulltext_size_is_cachable(ffd, rep->expanded_size))
{
cache_access_wrapper_baton_t wrapper_baton;
void *dummy = NULL;
wrapper_baton.func = processor;
wrapper_baton.baton = baton;
return svn_cache__get_partial(&dummy, success,
ffd->fulltext_cache,
&fulltext_cache_key,
cache_access_wrapper,
&wrapper_baton,
pool);
}
}
*success = FALSE;
return SVN_NO_ERROR;
}
/* Baton used when reading delta windows. */
struct delta_read_baton
{
rep_state_t *rs;
unsigned char md5_digest[APR_MD5_DIGESTSIZE];
};
/* This implements the svn_txdelta_next_window_fn_t interface. */
static svn_error_t *
delta_read_next_window(svn_txdelta_window_t **window, void *baton,
apr_pool_t *pool)
{
struct delta_read_baton *drb = baton;
apr_pool_t *scratch_pool = svn_pool_create(pool);
*window = NULL;
if (drb->rs->current < drb->rs->size)
{
SVN_ERR(read_delta_window(window, drb->rs->chunk_index, drb->rs, pool,
scratch_pool));
drb->rs->chunk_index++;
}
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* This implements the svn_txdelta_md5_digest_fn_t interface. */
static const unsigned char *
delta_read_md5_digest(void *baton)
{
struct delta_read_baton *drb = baton;
return drb->md5_digest;
}
/* Return a txdelta stream for on-disk representation REP_STATE
* of TARGET. Allocate the result in POOL.
*/
static svn_txdelta_stream_t *
get_storaged_delta_stream(rep_state_t *rep_state,
node_revision_t *target,
apr_pool_t *pool)
{
/* Create the delta read baton. */
struct delta_read_baton *drb = apr_pcalloc(pool, sizeof(*drb));
drb->rs = rep_state;
memcpy(drb->md5_digest, target->data_rep->md5_digest,
sizeof(drb->md5_digest));
return svn_txdelta_stream_create(drb, delta_read_next_window,
delta_read_md5_digest, pool);
}
svn_error_t *
svn_fs_fs__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
svn_fs_t *fs,
node_revision_t *source,
node_revision_t *target,
apr_pool_t *pool)
{
svn_stream_t *source_stream, *target_stream;
rep_state_t *rep_state;
svn_fs_fs__rep_header_t *rep_header;
fs_fs_data_t *ffd = fs->fsap_data;
/* Try a shortcut: if the target is stored as a delta against the source,
then just use that delta. However, prefer using the fulltext cache
whenever that is available. */
if (target->data_rep && (source || ! ffd->fulltext_cache))
{
/* Read target's base rep if any. */
SVN_ERR(create_rep_state(&rep_state, &rep_header, NULL,
target->data_rep, fs, pool, pool));
if (source && source->data_rep && target->data_rep)
{
/* If that matches source, then use this delta as is.
Note that we want an actual delta here. E.g. a self-delta would
not be good enough. */
if (rep_header->type == svn_fs_fs__rep_delta
&& rep_header->base_revision == source->data_rep->revision
&& rep_header->base_item_index == source->data_rep->item_index)
{
*stream_p = get_storaged_delta_stream(rep_state, target, pool);
return SVN_NO_ERROR;
}
}
else if (!source)
{
/* We want a self-delta. There is a fair chance that TARGET got
added in this revision and is already stored in the requested
format. */
if (rep_header->type == svn_fs_fs__rep_self_delta)
{
*stream_p = get_storaged_delta_stream(rep_state, target, pool);
return SVN_NO_ERROR;
}
}
/* Don't keep file handles open for longer than necessary. */
if (rep_state->sfile->rfile)
{
SVN_ERR(svn_fs_fs__close_revision_file(rep_state->sfile->rfile));
rep_state->sfile->rfile = NULL;
}
}
/* Read both fulltexts and construct a delta. */
if (source)
SVN_ERR(svn_fs_fs__get_contents(&source_stream, fs, source->data_rep,
TRUE, pool));
else
source_stream = svn_stream_empty(pool);
SVN_ERR(svn_fs_fs__get_contents(&target_stream, fs, target->data_rep,
TRUE, pool));
/* Because source and target stream will already verify their content,
* there is no need to do this once more. In particular if the stream
* content is being fetched from cache. */
svn_txdelta2(stream_p, source_stream, target_stream, FALSE, pool);
return SVN_NO_ERROR;
}
/* Return TRUE when all svn_fs_dirent_t* in ENTRIES are already sorted
by their respective name. */
static svn_boolean_t
sorted(apr_array_header_t *entries)
{
int i;
const svn_fs_dirent_t * const *dirents = (const void *)entries->elts;
for (i = 0; i < entries->nelts-1; ++i)
if (strcmp(dirents[i]->name, dirents[i+1]->name) > 0)
return FALSE;
return TRUE;
}
/* Compare the names of the two dirents given in **A and **B. */
static int
compare_dirents(const void *a, const void *b)
{
const svn_fs_dirent_t *lhs = *((const svn_fs_dirent_t * const *) a);
const svn_fs_dirent_t *rhs = *((const svn_fs_dirent_t * const *) b);
return strcmp(lhs->name, rhs->name);
}
/* Compare the name of the dirents given in **A with the C string in *B. */
static int
compare_dirent_name(const void *a, const void *b)
{
const svn_fs_dirent_t *lhs = *((const svn_fs_dirent_t * const *) a);
const char *rhs = b;
return strcmp(lhs->name, rhs);
}
/* Into ENTRIES, read all directories entries from the key-value text in
* STREAM. If INCREMENTAL is TRUE, read until the end of the STREAM and
* update the data. ID is provided for nicer error messages.
*/
static svn_error_t *
read_dir_entries(apr_array_header_t *entries,
svn_stream_t *stream,
svn_boolean_t incremental,
const svn_fs_id_t *id,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_t *hash = incremental ? svn_hash__make(scratch_pool) : NULL;
const char *terminator = SVN_HASH_TERMINATOR;
/* Read until the terminator (non-incremental) or the end of STREAM
(incremental mode). In the latter mode, we use a temporary HASH
to make updating and removing entries cheaper. */
while (1)
{
svn_hash__entry_t entry;
svn_fs_dirent_t *dirent;
char *str;
svn_pool_clear(iterpool);
SVN_ERR(svn_hash__read_entry(&entry, stream, terminator,
incremental, iterpool));
/* End of directory? */
if (entry.key == NULL)
{
/* In incremental mode, we skip the terminator and read the
increments following it until the end of the stream. */
if (incremental && terminator)
terminator = NULL;
else
break;
}
/* Deleted entry? */
if (entry.val == NULL)
{
/* We must be in incremental mode */
assert(hash);
apr_hash_set(hash, entry.key, entry.keylen, NULL);
continue;
}
/* Add a new directory entry. */
dirent = apr_pcalloc(result_pool, sizeof(*dirent));
dirent->name = apr_pstrmemdup(result_pool, entry.key, entry.keylen);
str = svn_cstring_tokenize(" ", &entry.val);
if (str == NULL)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Directory entry corrupt in '%s'"),
svn_fs_fs__id_unparse(id, scratch_pool)->data);
if (strcmp(str, SVN_FS_FS__KIND_FILE) == 0)
{
dirent->kind = svn_node_file;
}
else if (strcmp(str, SVN_FS_FS__KIND_DIR) == 0)
{
dirent->kind = svn_node_dir;
}
else
{
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Directory entry corrupt in '%s'"),
svn_fs_fs__id_unparse(id, scratch_pool)->data);
}
str = svn_cstring_tokenize(" ", &entry.val);
if (str == NULL)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Directory entry corrupt in '%s'"),
svn_fs_fs__id_unparse(id, scratch_pool)->data);
SVN_ERR(svn_fs_fs__id_parse(&dirent->id, str, result_pool));
/* In incremental mode, update the hash; otherwise, write to the
* final array. Be sure to use hash keys that survive this iteration.
*/
if (incremental)
apr_hash_set(hash, dirent->name, entry.keylen, dirent);
else
APR_ARRAY_PUSH(entries, svn_fs_dirent_t *) = dirent;
}
/* Convert container to a sorted array. */
if (incremental)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(iterpool, hash); hi; hi = apr_hash_next(hi))
APR_ARRAY_PUSH(entries, svn_fs_dirent_t *) = apr_hash_this_val(hi);
}
if (!sorted(entries))
svn_sort__array(entries, compare_dirents);
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Fetch the contents of a directory into ENTRIES. Values are stored
as filename to string mappings; further conversion is necessary to
convert them into svn_fs_dirent_t values. */
static svn_error_t *
get_dir_contents(apr_array_header_t **entries,
svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_stream_t *contents;
*entries = apr_array_make(result_pool, 16, sizeof(svn_fs_dirent_t *));
if (noderev->data_rep && svn_fs_fs__id_txn_used(&noderev->data_rep->txn_id))
{
const char *filename
= svn_fs_fs__path_txn_node_children(fs, noderev->id, scratch_pool);
/* The representation is mutable. Read the old directory
contents from the mutable children file, followed by the
changes we've made in this transaction. */
SVN_ERR(svn_stream_open_readonly(&contents, filename, scratch_pool,
scratch_pool));
SVN_ERR(read_dir_entries(*entries, contents, TRUE, noderev->id,
result_pool, scratch_pool));
SVN_ERR(svn_stream_close(contents));
}
else if (noderev->data_rep)
{
/* Undeltify content before parsing it. Otherwise, we could only
* parse it byte-by-byte.
*/
apr_size_t len = noderev->data_rep->expanded_size
? (apr_size_t)noderev->data_rep->expanded_size
: (apr_size_t)noderev->data_rep->size;
svn_stringbuf_t *text;
/* The representation is immutable. Read it normally. */
SVN_ERR(svn_fs_fs__get_contents(&contents, fs, noderev->data_rep,
FALSE, scratch_pool));
SVN_ERR(svn_stringbuf_from_stream(&text, contents, len, scratch_pool));
SVN_ERR(svn_stream_close(contents));
/* de-serialize hash */
contents = svn_stream_from_stringbuf(text, scratch_pool);
SVN_ERR(read_dir_entries(*entries, contents, FALSE, noderev->id,
result_pool, scratch_pool));
}
return SVN_NO_ERROR;
}
/* Return the cache object in FS responsible to storing the directory the
* NODEREV plus the corresponding *KEY. If no cache exists, return NULL.
* PAIR_KEY must point to some key struct, which does not need to be
* initialized. We use it to avoid dynamic allocation.
*/
static svn_cache__t *
locate_dir_cache(svn_fs_t *fs,
const void **key,
pair_cache_key_t *pair_key,
node_revision_t *noderev,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
if (svn_fs_fs__id_is_txn(noderev->id))
{
/* data in txns requires the expensive fs_id-based addressing mode */
*key = svn_fs_fs__id_unparse(noderev->id, pool)->data;
return ffd->txn_dir_cache;
}
else
{
/* committed data can use simple rev,item pairs */
if (noderev->data_rep)
{
pair_key->revision = noderev->data_rep->revision;
pair_key->second = noderev->data_rep->item_index;
*key = pair_key;
}
else
{
/* no data rep -> empty directory.
A NULL key causes a cache miss. */
*key = NULL;
}
return ffd->dir_cache;
}
}
svn_error_t *
svn_fs_fs__rep_contents_dir(apr_array_header_t **entries_p,
svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
pair_cache_key_t pair_key = { 0 };
const void *key;
/* find the cache we may use */
svn_cache__t *cache = locate_dir_cache(fs, &key, &pair_key, noderev,
scratch_pool);
if (cache)
{
svn_boolean_t found;
SVN_ERR(svn_cache__get((void **)entries_p, &found, cache, key,
result_pool));
if (found)
return SVN_NO_ERROR;
}
/* Read in the directory contents. */
SVN_ERR(get_dir_contents(entries_p, fs, noderev, result_pool,
scratch_pool));
/* Update the cache, if we are to use one.
*
* Don't even attempt to serialize very large directories; it would cause
* an unnecessary memory allocation peak. 150 bytes/entry is about right.
*/
if (cache && svn_cache__is_cachable(cache, 150 * (*entries_p)->nelts))
SVN_ERR(svn_cache__set(cache, key, *entries_p, scratch_pool));
return SVN_NO_ERROR;
}
svn_fs_dirent_t *
svn_fs_fs__find_dir_entry(apr_array_header_t *entries,
const char *name,
int *hint)
{
svn_fs_dirent_t **result
= svn_sort__array_lookup(entries, name, hint, compare_dirent_name);
return result ? *result : NULL;
}
svn_error_t *
svn_fs_fs__rep_contents_dir_entry(svn_fs_dirent_t **dirent,
svn_fs_t *fs,
node_revision_t *noderev,
const char *name,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_boolean_t found = FALSE;
/* find the cache we may use */
pair_cache_key_t pair_key = { 0 };
const void *key;
svn_cache__t *cache = locate_dir_cache(fs, &key, &pair_key, noderev,
scratch_pool);
if (cache)
{
/* Cache lookup. */
SVN_ERR(svn_cache__get_partial((void **)dirent,
&found,
cache,
key,
svn_fs_fs__extract_dir_entry,
(void*)name,
result_pool));
}
/* fetch data from disk if we did not find it in the cache */
if (! found)
{
apr_array_header_t *entries;
svn_fs_dirent_t *entry;
svn_fs_dirent_t *entry_copy = NULL;
/* read the dir from the file system. It will probably be put it
into the cache for faster lookup in future calls. */
SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, noderev,
scratch_pool, scratch_pool));
/* find desired entry and return a copy in POOL, if found */
entry = svn_fs_fs__find_dir_entry(entries, name, NULL);
if (entry)
{
entry_copy = apr_palloc(result_pool, sizeof(*entry_copy));
entry_copy->name = apr_pstrdup(result_pool, entry->name);
entry_copy->id = svn_fs_fs__id_copy(entry->id, result_pool);
entry_copy->kind = entry->kind;
}
*dirent = entry_copy;
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__get_proplist(apr_hash_t **proplist_p,
svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *pool)
{
apr_hash_t *proplist;
svn_stream_t *stream;
if (noderev->prop_rep && svn_fs_fs__id_txn_used(&noderev->prop_rep->txn_id))
{
svn_error_t *err;
const char *filename
= svn_fs_fs__path_txn_node_props(fs, noderev->id, pool);
proplist = apr_hash_make(pool);
SVN_ERR(svn_stream_open_readonly(&stream, filename, pool, pool));
err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
if (err)
{
svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
svn_error_clear(svn_stream_close(stream));
return svn_error_quick_wrapf(err,
_("malformed property list for node-revision '%s' in '%s'"),
id_str->data, filename);
}
SVN_ERR(svn_stream_close(stream));
}
else if (noderev->prop_rep)
{
svn_error_t *err;
fs_fs_data_t *ffd = fs->fsap_data;
representation_t *rep = noderev->prop_rep;
pair_cache_key_t key = { 0 };
key.revision = rep->revision;
key.second = rep->item_index;
if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
{
svn_boolean_t is_cached;
SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
ffd->properties_cache, &key, pool));
if (is_cached)
return SVN_NO_ERROR;
}
proplist = apr_hash_make(pool);
SVN_ERR(svn_fs_fs__get_contents(&stream, fs, noderev->prop_rep, FALSE,
pool));
err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
if (err)
{
svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
svn_error_clear(svn_stream_close(stream));
return svn_error_quick_wrapf(err,
_("malformed property list for node-revision '%s'"),
id_str->data);
}
SVN_ERR(svn_stream_close(stream));
if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
SVN_ERR(svn_cache__set(ffd->properties_cache, &key, proplist, pool));
}
else
{
/* return an empty prop list if the node doesn't have any props */
proplist = apr_hash_make(pool);
}
*proplist_p = proplist;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__get_changes(apr_array_header_t **changes,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *result_pool)
{
apr_off_t changes_offset = SVN_FS_FS__ITEM_INDEX_CHANGES;
svn_fs_fs__revision_file_t *revision_file;
svn_boolean_t found;
fs_fs_data_t *ffd = fs->fsap_data;
apr_pool_t *scratch_pool = svn_pool_create(result_pool);
/* try cache lookup first */
if (ffd->changes_cache)
{
SVN_ERR(svn_cache__get((void **) changes, &found, ffd->changes_cache,
&rev, result_pool));
}
else
{
found = FALSE;
}
if (!found)
{
/* read changes from revision file */
SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, scratch_pool));
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&revision_file, fs, rev,
scratch_pool, scratch_pool));
if (use_block_read(fs))
{
/* 'block-read' will also provide us with the desired data */
SVN_ERR(block_read((void **)changes, fs,
rev, SVN_FS_FS__ITEM_INDEX_CHANGES,
revision_file, result_pool, scratch_pool));
}
else
{
/* Addressing is very different for old formats
* (needs to read the revision trailer). */
if (svn_fs_fs__use_log_addressing(fs))
SVN_ERR(svn_fs_fs__item_offset(&changes_offset, fs,
revision_file, rev, NULL,
SVN_FS_FS__ITEM_INDEX_CHANGES,
scratch_pool));
else
SVN_ERR(get_root_changes_offset(NULL, &changes_offset,
revision_file, fs, rev,
scratch_pool));
/* Actual reading and parsing are the same, though. */
SVN_ERR(aligned_seek(fs, revision_file->file, NULL, changes_offset,
scratch_pool));
SVN_ERR(svn_fs_fs__read_changes(changes, revision_file->stream,
result_pool, scratch_pool));
/* cache for future reference */
if (ffd->changes_cache)
{
/* Guesstimate for the size of the in-cache representation. */
apr_size_t estimated_size = (apr_size_t)250 * (*changes)->nelts;
/* Don't even serialize data that probably won't fit into the
* cache. This often implies that either CHANGES is very
* large, memory is scarce or both. Having a huge temporary
* copy would not be a good thing in either case. */
if (svn_cache__is_cachable(ffd->changes_cache, estimated_size))
SVN_ERR(svn_cache__set(ffd->changes_cache, &rev, *changes,
scratch_pool));
}
}
SVN_ERR(svn_fs_fs__close_revision_file(revision_file));
}
SVN_ERR(dbg_log_access(fs, rev, changes_offset, *changes,
SVN_FS_FS__ITEM_TYPE_CHANGES, scratch_pool));
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* Inialize the representation read state RS for the given REP_HEADER and
* p2l index ENTRY. If not NULL, assign FILE and STREAM to RS.
* Use RESULT_POOL for allocations.
*/
static svn_error_t *
init_rep_state(rep_state_t *rs,
svn_fs_fs__rep_header_t *rep_header,
svn_fs_t *fs,
svn_fs_fs__revision_file_t *file,
svn_fs_fs__p2l_entry_t* entry,
apr_pool_t *result_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
shared_file_t *shared_file = apr_pcalloc(result_pool, sizeof(*shared_file));
/* this function does not apply to representation containers */
SVN_ERR_ASSERT(entry->type >= SVN_FS_FS__ITEM_TYPE_FILE_REP
&& entry->type <= SVN_FS_FS__ITEM_TYPE_DIR_PROPS);
shared_file->rfile = file;
shared_file->fs = fs;
shared_file->revision = entry->item.revision;
shared_file->pool = result_pool;
rs->sfile = shared_file;
rs->revision = entry->item.revision;
rs->item_index = entry->item.number;
rs->header_size = rep_header->header_size;
rs->start = entry->offset + rs->header_size;
rs->current = rep_header->type == svn_fs_fs__rep_plain ? 0 : 4;
rs->size = entry->size - rep_header->header_size - 7;
rs->ver = 1;
rs->chunk_index = 0;
rs->raw_window_cache = ffd->raw_window_cache;
rs->window_cache = ffd->txdelta_window_cache;
rs->combined_cache = ffd->combined_window_cache;
return SVN_NO_ERROR;
}
/* Implement svn_cache__partial_getter_func_t for txdelta windows.
* Instead of the whole window data, return only END_OFFSET member.
*/
static svn_error_t *
get_txdelta_window_end(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *result_pool)
{
const svn_fs_fs__txdelta_cached_window_t *window
= (const svn_fs_fs__txdelta_cached_window_t *)data;
*(apr_off_t*)out = window->end_offset;
return SVN_NO_ERROR;
}
/* Implement svn_cache__partial_getter_func_t for raw windows.
* Instead of the whole window data, return only END_OFFSET member.
*/
static svn_error_t *
get_raw_window_end(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *result_pool)
{
const svn_fs_fs__raw_cached_window_t *window
= (const svn_fs_fs__raw_cached_window_t *)data;
*(apr_off_t*)out = window->end_offset;
return SVN_NO_ERROR;
}
/* Walk through all windows in the representation addressed by RS in FS
* (excluding the delta bases) and put those not already cached into the
* window caches. If MAX_OFFSET is not -1, don't read windows that start
* at or beyond that offset. Use POOL for temporary allocations.
*
* This function requires RS->RAW_WINDOW_CACHE and RS->WINDOW_CACHE to
* be non-NULL.
*/
static svn_error_t *
cache_windows(svn_fs_t *fs,
rep_state_t *rs,
apr_off_t max_offset,
apr_pool_t *pool)
{
apr_pool_t *iterpool = svn_pool_create(pool);
while (rs->current < rs->size)
{
apr_off_t end_offset;
svn_boolean_t found = FALSE;
window_cache_key_t key = { 0 };
svn_pool_clear(iterpool);
if (max_offset != -1 && rs->start + rs->current >= max_offset)
{
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* We don't need to read the data again if it is already in cache.
* It might be cached as either raw or parsed window.
*/
SVN_ERR(svn_cache__get_partial((void **) &end_offset, &found,
rs->raw_window_cache,
get_window_key(&key, rs),
get_raw_window_end, NULL,
iterpool));
if (! found)
SVN_ERR(svn_cache__get_partial((void **) &end_offset, &found,
rs->window_cache, &key,
get_txdelta_window_end, NULL,
iterpool));
if (found)
{
rs->current = end_offset;
}
else
{
/* Read, decode and cache the window. */
svn_fs_fs__raw_cached_window_t window;
apr_off_t start_offset = rs->start + rs->current;
apr_size_t window_len;
char *buf;
/* navigate to the current window */
SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, iterpool));
SVN_ERR(svn_txdelta__read_raw_window_len(&window_len,
rs->sfile->rfile->stream,
iterpool));
/* Read the raw window. */
buf = apr_palloc(iterpool, window_len + 1);
SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, iterpool));
SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, buf,
window_len, NULL, NULL, iterpool));
buf[window_len] = 0;
/* update relative offset in representation */
rs->current += window_len;
/* Construct the cachable raw window object. */
window.end_offset = rs->current;
window.window.len = window_len;
window.window.data = buf;
/* cache the window now */
SVN_ERR(svn_cache__set(rs->raw_window_cache, &key, &window,
iterpool));
}
if (rs->current > rs->size)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Reading one svndiff window read beyond "
"the end of the representation"));
rs->chunk_index++;
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Read all txdelta / plain windows following REP_HEADER in FS as described
* by ENTRY. Read the data from the already open FILE and the wrapping
* STREAM object. If MAX_OFFSET is not -1, don't read windows that start
* at or beyond that offset. Use SCRATCH_POOL for temporary allocations.
* If caching is not enabled, this is a no-op.
*/
static svn_error_t *
block_read_windows(svn_fs_fs__rep_header_t *rep_header,
svn_fs_t *fs,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_fs__p2l_entry_t* entry,
apr_off_t max_offset,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
rep_state_t rs = { 0 };
apr_off_t offset;
window_cache_key_t key = { 0 };
if ( (rep_header->type != svn_fs_fs__rep_plain
&& (!ffd->txdelta_window_cache || !ffd->raw_window_cache))
|| (rep_header->type == svn_fs_fs__rep_plain
&& !ffd->combined_window_cache))
return SVN_NO_ERROR;
SVN_ERR(init_rep_state(&rs, rep_header, fs, rev_file, entry,
result_pool));
/* RS->FILE may be shared between RS instances -> make sure we point
* to the right data. */
offset = rs.start + rs.current;
if (rep_header->type == svn_fs_fs__rep_plain)
{
svn_stringbuf_t *plaintext;
svn_boolean_t is_cached;
/* already in cache? */
SVN_ERR(svn_cache__has_key(&is_cached, rs.combined_cache,
get_window_key(&key, &rs),
scratch_pool));
if (is_cached)
return SVN_NO_ERROR;
/* for larger reps, the header may have crossed a block boundary.
* make sure we still read blocks properly aligned, i.e. don't use
* plain seek here. */
SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, scratch_pool));
plaintext = svn_stringbuf_create_ensure(rs.size, result_pool);
SVN_ERR(svn_io_file_read_full2(rev_file->file, plaintext->data,
rs.size, &plaintext->len, NULL,
result_pool));
plaintext->data[plaintext->len] = 0;
rs.current += rs.size;
SVN_ERR(set_cached_combined_window(plaintext, &rs, scratch_pool));
}
else
{
SVN_ERR(cache_windows(fs, &rs, max_offset, scratch_pool));
}
return SVN_NO_ERROR;
}
/* Try to get the representation header identified by KEY from FS's cache.
* If it has not been cached, read it from the current position in STREAM
* and put it into the cache (if caching has been enabled for rep headers).
* Return the result in *REP_HEADER. Use POOL for allocations.
*/
static svn_error_t *
read_rep_header(svn_fs_fs__rep_header_t **rep_header,
svn_fs_t *fs,
svn_stream_t *stream,
pair_cache_key_t *key,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_boolean_t is_cached = FALSE;
if (ffd->rep_header_cache)
{
SVN_ERR(svn_cache__get((void**)rep_header, &is_cached,
ffd->rep_header_cache, key,
result_pool));
if (is_cached)
return SVN_NO_ERROR;
}
SVN_ERR(svn_fs_fs__read_rep_header(rep_header, stream, result_pool,
scratch_pool));
if (ffd->rep_header_cache)
SVN_ERR(svn_cache__set(ffd->rep_header_cache, key, *rep_header,
scratch_pool));
return SVN_NO_ERROR;
}
/* Fetch the representation data (header, txdelta / plain windows)
* addressed by ENTRY->ITEM in FS and cache it if caches are enabled.
* Read the data from the already open FILE and the wrapping
* STREAM object. If MAX_OFFSET is not -1, don't read windows that start
* at or beyond that offset.
* Use SCRATCH_POOL for temporary allocations.
*/
static svn_error_t *
block_read_contents(svn_fs_t *fs,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_fs__p2l_entry_t* entry,
apr_off_t max_offset,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
pair_cache_key_t header_key = { 0 };
svn_fs_fs__rep_header_t *rep_header;
header_key.revision = (apr_int32_t)entry->item.revision;
header_key.second = entry->item.number;
SVN_ERR(read_rep_header(&rep_header, fs, rev_file->stream, &header_key,
result_pool, scratch_pool));
SVN_ERR(block_read_windows(rep_header, fs, rev_file, entry, max_offset,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* For the given REV_FILE in FS, in *STREAM return a stream covering the
* item specified by ENTRY. Also, verify the item's content by low-level
* checksum. Allocate the result in POOL.
*/
static svn_error_t *
read_item(svn_stream_t **stream,
svn_fs_t *fs,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_fs__p2l_entry_t* entry,
apr_pool_t *pool)
{
apr_uint32_t digest;
svn_checksum_t *expected, *actual;
apr_uint32_t plain_digest;
/* Read item into string buffer. */
svn_stringbuf_t *text = svn_stringbuf_create_ensure(entry->size, pool);
text->len = entry->size;
text->data[text->len] = 0;
SVN_ERR(svn_io_file_read_full2(rev_file->file, text->data, text->len,
NULL, NULL, pool));
/* Return (construct, calculate) stream and checksum. */
*stream = svn_stream_from_stringbuf(text, pool);
digest = svn__fnv1a_32x4(text->data, text->len);
/* Checksums will match most of the time. */
if (entry->fnv1_checksum == digest)
return SVN_NO_ERROR;
/* Construct proper checksum objects from their digests to allow for
* nice error messages. */
plain_digest = htonl(entry->fnv1_checksum);
expected = svn_checksum__from_digest_fnv1a_32x4(
(const unsigned char *)&plain_digest, pool);
plain_digest = htonl(digest);
actual = svn_checksum__from_digest_fnv1a_32x4(
(const unsigned char *)&plain_digest, pool);
/* Construct the full error message with all the info we have. */
return svn_checksum_mismatch_err(expected, actual, pool,
_("Low-level checksum mismatch while reading\n"
"%s bytes of meta data at offset %s "
"for item %s in revision %ld"),
apr_psprintf(pool, "%" APR_OFF_T_FMT, entry->size),
apr_psprintf(pool, "%" APR_OFF_T_FMT, entry->offset),
apr_psprintf(pool, "%" APR_UINT64_T_FMT, entry->item.number),
entry->item.revision);
}
/* If not already cached or if MUST_READ is set, read the changed paths
* list addressed by ENTRY in FS and retúrn it in *CHANGES. Cache the
* result if caching is enabled. Read the data from the already open
* FILE and wrapping FILE_STREAM. Use POOL for allocations.
*/
static svn_error_t *
block_read_changes(apr_array_header_t **changes,
svn_fs_t *fs,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_fs__p2l_entry_t *entry,
svn_boolean_t must_read,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_stream_t *stream;
if (!must_read && !ffd->changes_cache)
return SVN_NO_ERROR;
/* already in cache? */
if (!must_read && ffd->changes_cache)
{
svn_boolean_t is_cached;
SVN_ERR(svn_cache__has_key(&is_cached, ffd->changes_cache,
&entry->item.revision,
scratch_pool));
if (is_cached)
return SVN_NO_ERROR;
}
SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
/* read changes from revision file */
SVN_ERR(svn_fs_fs__read_changes(changes, stream, result_pool,
scratch_pool));
/* cache for future reference */
if (ffd->changes_cache)
SVN_ERR(svn_cache__set(ffd->changes_cache, &entry->item.revision,
*changes, scratch_pool));
return SVN_NO_ERROR;
}
/* If not already cached or if MUST_READ is set, read the nod revision
* addressed by ENTRY in FS and retúrn it in *NODEREV_P. Cache the
* result if caching is enabled. Read the data from the already open
* FILE and wrapping FILE_STREAM. Use SCRATCH_POOL for temporary allocations.
*/
static svn_error_t *
block_read_noderev(node_revision_t **noderev_p,
svn_fs_t *fs,
svn_fs_fs__revision_file_t *rev_file,
svn_fs_fs__p2l_entry_t *entry,
svn_boolean_t must_read,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_stream_t *stream;
pair_cache_key_t key = { 0 };
key.revision = entry->item.revision;
key.second = entry->item.number;
if (!must_read && !ffd->node_revision_cache)
return SVN_NO_ERROR;
/* already in cache? */
if (!must_read && ffd->node_revision_cache)
{
svn_boolean_t is_cached;
SVN_ERR(svn_cache__has_key(&is_cached, ffd->node_revision_cache,
&key, scratch_pool));
if (is_cached)
return SVN_NO_ERROR;
}
SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
/* read node rev from revision file */
SVN_ERR(svn_fs_fs__read_noderev(noderev_p, stream,
result_pool, scratch_pool));
/* Workaround issue #4031: is-fresh-txn-root in revision files. */
(*noderev_p)->is_fresh_txn_root = FALSE;
if (ffd->node_revision_cache)
SVN_ERR(svn_cache__set(ffd->node_revision_cache, &key, *noderev_p,
scratch_pool));
return SVN_NO_ERROR;
}
/* Read the whole (e.g. 64kB) block containing ITEM_INDEX of REVISION in FS
* and put all data into cache. If necessary and depending on heuristics,
* neighboring blocks may also get read. The data is being read from
* already open REVISION_FILE, which must be the correct rev / pack file
* w.r.t. REVISION.
*
* For noderevs and changed path lists, the item fetched can be allocated
* RESULT_POOL and returned in *RESULT. Otherwise, RESULT must be NULL.
*/
static svn_error_t *
block_read(void **result,
svn_fs_t *fs,
svn_revnum_t revision,
apr_uint64_t item_index,
svn_fs_fs__revision_file_t *revision_file,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
apr_off_t offset, wanted_offset = 0;
apr_off_t block_start = 0;
apr_array_header_t *entries;
int run_count = 0;
int i;
apr_pool_t *iterpool;
/* Block read is an optional feature. If the caller does not want anything
* specific we may not have to read anything. */
if (!result)
return SVN_NO_ERROR;
iterpool = svn_pool_create(scratch_pool);
/* don't try this on transaction protorev files */
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(revision));
/* index lookup: find the OFFSET of the item we *must* read plus (in the
* "do-while" block) the list of items in the same block. */
SVN_ERR(svn_fs_fs__item_offset(&wanted_offset, fs, revision_file,
revision, NULL, item_index, iterpool));
offset = wanted_offset;
/* Heuristics:
*
* Read this block. If the last item crosses the block boundary, read
* the next block but stop there. Because cross-boundary items cause
* blocks to be read twice, this heuristics will limit this effect to
* approx. 50% of blocks, probably less, while providing a sensible
* amount of read-ahead.
*/
do
{
/* fetch list of items in the block surrounding OFFSET */
block_start = offset - (offset % ffd->block_size);
SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, fs, revision_file,
revision, block_start,
ffd->block_size, scratch_pool,
scratch_pool));
SVN_ERR(aligned_seek(fs, revision_file->file, &block_start, offset,
iterpool));
/* read all items from the block */
for (i = 0; i < entries->nelts; ++i)
{
svn_boolean_t is_result, is_wanted;
apr_pool_t *pool;
svn_fs_fs__p2l_entry_t* entry;
svn_pool_clear(iterpool);
/* skip empty sections */
entry = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
continue;
/* the item / container we were looking for? */
is_wanted = entry->offset == wanted_offset
&& entry->item.revision == revision
&& entry->item.number == item_index;
is_result = result && is_wanted;
/* select the pool that we want the item to be allocated in */
pool = is_result ? result_pool : iterpool;
/* handle all items that start within this block and are relatively
* small (i.e. < block size). Always read the item we need to return.
*/
if (is_result || ( entry->offset >= block_start
&& entry->size < ffd->block_size))
{
void *item = NULL;
SVN_ERR(svn_io_file_seek(revision_file->file, APR_SET,
&entry->offset, iterpool));
switch (entry->type)
{
case SVN_FS_FS__ITEM_TYPE_FILE_REP:
case SVN_FS_FS__ITEM_TYPE_DIR_REP:
case SVN_FS_FS__ITEM_TYPE_FILE_PROPS:
case SVN_FS_FS__ITEM_TYPE_DIR_PROPS:
SVN_ERR(block_read_contents(fs, revision_file, entry,
is_wanted
? -1
: block_start + ffd->block_size,
pool, iterpool));
break;
case SVN_FS_FS__ITEM_TYPE_NODEREV:
if (ffd->node_revision_cache || is_result)
SVN_ERR(block_read_noderev((node_revision_t **)&item,
fs, revision_file,
entry, is_result, pool,
iterpool));
break;
case SVN_FS_FS__ITEM_TYPE_CHANGES:
SVN_ERR(block_read_changes((apr_array_header_t **)&item,
fs, revision_file,
entry, is_result,
pool, iterpool));
break;
default:
break;
}
if (is_result)
*result = item;
/* if we crossed a block boundary, read the remainder of
* the last block as well */
offset = entry->offset + entry->size;
if (offset > block_start + ffd->block_size)
++run_count;
}
}
}
while(run_count++ == 1); /* can only be true once and only if a block
* boundary got crossed */
/* if the caller requested a result, we must have provided one by now */
assert(!result || *result);
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/caching.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/caching.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/caching.c (revision 309511)
@@ -1,828 +1,828 @@
/* caching.c : in-memory caching
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "fs.h"
#include "fs_fs.h"
#include "id.h"
#include "dag.h"
#include "tree.h"
#include "index.h"
#include "temp_serializer.h"
#include "../libsvn_fs/fs-loader.h"
#include "svn_config.h"
#include "svn_cache_config.h"
#include "svn_private_config.h"
#include "svn_hash.h"
#include "svn_pools.h"
#include "private/svn_debug.h"
#include "private/svn_subr_private.h"
/* Take the ORIGINAL string and replace all occurrences of ":" without
* limiting the key space. Allocate the result in POOL.
*/
static const char *
normalize_key_part(const char *original,
apr_pool_t *pool)
{
apr_size_t i;
apr_size_t len = strlen(original);
svn_stringbuf_t *normalized = svn_stringbuf_create_ensure(len, pool);
for (i = 0; i < len; ++i)
{
char c = original[i];
switch (c)
{
case ':': svn_stringbuf_appendbytes(normalized, "%_", 2);
break;
case '%': svn_stringbuf_appendbytes(normalized, "%%", 2);
break;
default : svn_stringbuf_appendbyte(normalized, c);
}
}
return normalized->data;
}
/* *CACHE_TXDELTAS, *CACHE_FULLTEXTS flags will be set according to
FS->CONFIG. *CACHE_NAMESPACE receives the cache prefix to use.
Use FS->pool for allocating the memcache and CACHE_NAMESPACE, and POOL
for temporary allocations. */
static svn_error_t *
read_config(const char **cache_namespace,
svn_boolean_t *cache_txdeltas,
svn_boolean_t *cache_fulltexts,
svn_fs_t *fs,
apr_pool_t *pool)
{
/* No cache namespace by default. I.e. all FS instances share the
* cached data. If you specify different namespaces, the data will
* share / compete for the same cache memory but keys will not match
* across namespaces and, thus, cached data will not be shared between
* namespaces.
*
* Since the namespace will be concatenated with other elements to form
* the complete key prefix, we must make sure that the resulting string
* is unique and cannot be created by any other combination of elements.
*/
*cache_namespace
= normalize_key_part(svn_hash__get_cstring(fs->config,
SVN_FS_CONFIG_FSFS_CACHE_NS,
""),
pool);
/* don't cache text deltas by default.
* Once we reconstructed the fulltexts from the deltas,
* these deltas are rarely re-used. Therefore, only tools
* like svnadmin will activate this to speed up operations
* dump and verify.
*/
*cache_txdeltas
= svn_hash__get_bool(fs->config,
SVN_FS_CONFIG_FSFS_CACHE_DELTAS,
TRUE);
/* by default, cache fulltexts.
* Most SVN tools care about reconstructed file content.
* Thus, this is a reasonable default.
* SVN admin tools may set that to FALSE because fulltexts
* won't be re-used rendering the cache less effective
* by squeezing wanted data out.
*/
*cache_fulltexts
= svn_hash__get_bool(fs->config,
SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
TRUE);
return SVN_NO_ERROR;
}
/* Implements svn_cache__error_handler_t
* This variant clears the error after logging it.
*/
static svn_error_t *
warn_and_continue_on_cache_errors(svn_error_t *err,
void *baton,
apr_pool_t *pool)
{
svn_fs_t *fs = baton;
(fs->warning)(fs->warning_baton, err);
svn_error_clear(err);
return SVN_NO_ERROR;
}
/* Implements svn_cache__error_handler_t
* This variant logs the error and passes it on to the callers.
*/
static svn_error_t *
warn_and_fail_on_cache_errors(svn_error_t *err,
void *baton,
apr_pool_t *pool)
{
svn_fs_t *fs = baton;
(fs->warning)(fs->warning_baton, err);
return err;
}
#ifdef SVN_DEBUG_CACHE_DUMP_STATS
/* Baton to be used for the dump_cache_statistics() pool cleanup function, */
struct dump_cache_baton_t
{
/* the pool about to be cleaned up. Will be used for temp. allocations. */
apr_pool_t *pool;
/* the cache to dump the statistics for */
svn_cache__t *cache;
};
/* APR pool cleanup handler that will printf the statistics of the
cache referenced by the baton in BATON_VOID. */
static apr_status_t
dump_cache_statistics(void *baton_void)
{
struct dump_cache_baton_t *baton = baton_void;
apr_status_t result = APR_SUCCESS;
svn_cache__info_t info;
svn_string_t *text_stats;
apr_array_header_t *lines;
int i;
svn_error_t *err = svn_cache__get_info(baton->cache,
&info,
TRUE,
baton->pool);
/* skip unused caches */
if (! err && (info.gets > 0 || info.sets > 0))
{
text_stats = svn_cache__format_info(&info, TRUE, baton->pool);
lines = svn_cstring_split(text_stats->data, "\n", FALSE, baton->pool);
for (i = 0; i < lines->nelts; ++i)
{
const char *line = APR_ARRAY_IDX(lines, i, const char *);
#ifdef SVN_DEBUG
SVN_DBG(("%s\n", line));
#endif
}
}
/* process error returns */
if (err)
{
result = err->apr_err;
svn_error_clear(err);
}
return result;
}
static apr_status_t
dump_global_cache_statistics(void *baton_void)
{
apr_pool_t *pool = baton_void;
svn_cache__info_t *info = svn_cache__membuffer_get_global_info(pool);
svn_string_t *text_stats = svn_cache__format_info(info, FALSE, pool);
apr_array_header_t *lines = svn_cstring_split(text_stats->data, "\n",
FALSE, pool);
int i;
for (i = 0; i < lines->nelts; ++i)
{
const char *line = APR_ARRAY_IDX(lines, i, const char *);
#ifdef SVN_DEBUG
SVN_DBG(("%s\n", line));
#endif
}
return APR_SUCCESS;
}
#endif /* SVN_DEBUG_CACHE_DUMP_STATS */
/* This function sets / registers the required callbacks for a given
* not transaction-specific CACHE object in FS, if CACHE is not NULL.
*
* All these svn_cache__t instances shall be handled uniformly. Unless
* ERROR_HANDLER is NULL, register it for the given CACHE in FS.
*/
static svn_error_t *
init_callbacks(svn_cache__t *cache,
svn_fs_t *fs,
svn_cache__error_handler_t error_handler,
apr_pool_t *pool)
{
if (cache != NULL)
{
#ifdef SVN_DEBUG_CACHE_DUMP_STATS
/* schedule printing the access statistics upon pool cleanup,
* i.e. end of FSFS session.
*/
struct dump_cache_baton_t *baton;
baton = apr_palloc(pool, sizeof(*baton));
baton->pool = pool;
baton->cache = cache;
apr_pool_cleanup_register(pool,
baton,
dump_cache_statistics,
apr_pool_cleanup_null);
#endif
if (error_handler)
SVN_ERR(svn_cache__set_error_handler(cache,
error_handler,
fs,
pool));
}
return SVN_NO_ERROR;
}
/* Sets *CACHE_P to cache instance based on provided options.
* Creates memcache if MEMCACHE is not NULL. Creates membuffer cache if
* MEMBUFFER is not NULL. Fallbacks to inprocess cache if MEMCACHE and
* MEMBUFFER are NULL and pages is non-zero. Sets *CACHE_P to NULL
* otherwise. Use the given PRIORITY class for the new cache. If it
* is 0, then use the default priority class.
*
* Unless NO_HANDLER is true, register an error handler that reports errors
* as warnings to the FS warning callback.
*
* Cache is allocated in RESULT_POOL, temporaries in SCRATCH_POOL.
* */
static svn_error_t *
create_cache(svn_cache__t **cache_p,
svn_memcache_t *memcache,
svn_membuffer_t *membuffer,
apr_int64_t pages,
apr_int64_t items_per_page,
svn_cache__serialize_func_t serializer,
svn_cache__deserialize_func_t deserializer,
apr_ssize_t klen,
const char *prefix,
apr_uint32_t priority,
svn_fs_t *fs,
svn_boolean_t no_handler,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_cache__error_handler_t error_handler = no_handler
? NULL
: warn_and_fail_on_cache_errors;
if (priority == 0)
priority = SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY;
if (memcache)
{
SVN_ERR(svn_cache__create_memcache(cache_p, memcache,
serializer, deserializer, klen,
prefix, result_pool));
error_handler = no_handler
? NULL
: warn_and_continue_on_cache_errors;
}
else if (membuffer)
{
SVN_ERR(svn_cache__create_membuffer_cache(
cache_p, membuffer, serializer, deserializer,
klen, prefix, priority, FALSE, result_pool, scratch_pool));
}
else if (pages)
{
SVN_ERR(svn_cache__create_inprocess(
cache_p, serializer, deserializer, klen, pages,
items_per_page, FALSE, prefix, result_pool));
}
else
{
*cache_p = NULL;
}
SVN_ERR(init_callbacks(*cache_p, fs, error_handler, result_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__initialize_caches(svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
const char *prefix = apr_pstrcat(pool,
"fsfs:", fs->uuid,
"/", normalize_key_part(fs->path, pool),
":",
SVN_VA_NULL);
svn_membuffer_t *membuffer;
svn_boolean_t no_handler = ffd->fail_stop;
svn_boolean_t cache_txdeltas;
svn_boolean_t cache_fulltexts;
const char *cache_namespace;
/* Evaluating the cache configuration. */
SVN_ERR(read_config(&cache_namespace,
&cache_txdeltas,
&cache_fulltexts,
fs,
pool));
prefix = apr_pstrcat(pool, "ns:", cache_namespace, ":", prefix, SVN_VA_NULL);
membuffer = svn_cache__get_global_membuffer_cache();
/* General rules for assigning cache priorities:
*
* - Data that can be reconstructed from other elements has low prio
* (e.g. fulltexts, directories etc.)
* - Index data required to find any of the other data has high prio
* (e.g. noderevs, L2P and P2L index pages)
* - everthing else should use default prio
*/
#ifdef SVN_DEBUG_CACHE_DUMP_STATS
/* schedule printing the global access statistics upon pool cleanup,
* i.e. when the repo instance gets closed / cleaned up.
*/
if (membuffer)
apr_pool_cleanup_register(fs->pool,
fs->pool,
dump_global_cache_statistics,
apr_pool_cleanup_null);
#endif
/* Make the cache for revision roots. For the vast majority of
* commands, this is only going to contain a few entries (svnadmin
* dump/verify is an exception here), so to reduce overhead let's
* try to keep it to just one page. I estimate each entry has about
* 72 bytes of overhead (svn_revnum_t key, svn_fs_id_t +
* id_private_t + 3 strings for value, and the cache_entry); the
* default pool size is 8192, so about a hundred should fit
* comfortably. */
SVN_ERR(create_cache(&(ffd->rev_root_id_cache),
NULL,
membuffer,
1, 100,
svn_fs_fs__serialize_id,
svn_fs_fs__deserialize_id,
sizeof(svn_revnum_t),
apr_pstrcat(pool, prefix, "RRI", SVN_VA_NULL),
0,
fs,
no_handler,
fs->pool, pool));
/* Rough estimate: revision DAG nodes have size around 320 bytes, so
* let's put 16 on a page. */
SVN_ERR(create_cache(&(ffd->rev_node_cache),
NULL,
membuffer,
1024, 16,
svn_fs_fs__dag_serialize,
svn_fs_fs__dag_deserialize,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "DAG", SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
fs->pool, pool));
/* 1st level DAG node cache */
ffd->dag_node_cache = svn_fs_fs__create_dag_cache(fs->pool);
/* Very rough estimate: 1K per directory. */
SVN_ERR(create_cache(&(ffd->dir_cache),
NULL,
membuffer,
1024, 8,
svn_fs_fs__serialize_dir_entries,
svn_fs_fs__deserialize_dir_entries,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "DIR", SVN_VA_NULL),
- SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
/* Only 16 bytes per entry (a revision number + the corresponding offset).
Since we want ~8k pages, that means 512 entries per page. */
SVN_ERR(create_cache(&(ffd->packed_offset_cache),
NULL,
membuffer,
32, 1,
svn_fs_fs__serialize_manifest,
svn_fs_fs__deserialize_manifest,
sizeof(svn_revnum_t),
apr_pstrcat(pool, prefix, "PACK-MANIFEST",
SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
/* initialize node revision cache, if caching has been enabled */
SVN_ERR(create_cache(&(ffd->node_revision_cache),
NULL,
membuffer,
32, 32, /* ~200 byte / entry; 1k entries total */
svn_fs_fs__serialize_node_revision,
svn_fs_fs__deserialize_node_revision,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "NODEREVS", SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
/* initialize representation header cache, if caching has been enabled */
SVN_ERR(create_cache(&(ffd->rep_header_cache),
NULL,
membuffer,
1, 1000, /* ~8 bytes / entry; 1k entries total */
svn_fs_fs__serialize_rep_header,
svn_fs_fs__deserialize_rep_header,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "REPHEADER", SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
fs,
no_handler,
fs->pool, pool));
/* initialize node change list cache, if caching has been enabled */
SVN_ERR(create_cache(&(ffd->changes_cache),
NULL,
membuffer,
1, 8, /* 1k / entry; 8 entries total, rarely used */
svn_fs_fs__serialize_changes,
svn_fs_fs__deserialize_changes,
sizeof(svn_revnum_t),
apr_pstrcat(pool, prefix, "CHANGES", SVN_VA_NULL),
0,
fs,
no_handler,
fs->pool, pool));
/* if enabled, cache fulltext and other derived information */
if (cache_fulltexts)
{
SVN_ERR(create_cache(&(ffd->fulltext_cache),
ffd->memcache,
membuffer,
0, 0, /* Do not use inprocess cache */
/* Values are svn_stringbuf_t */
NULL, NULL,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "TEXT", SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->properties_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
svn_fs_fs__serialize_properties,
svn_fs_fs__deserialize_properties,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "PROP",
SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->mergeinfo_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
svn_fs_fs__serialize_mergeinfo,
svn_fs_fs__deserialize_mergeinfo,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "MERGEINFO",
SVN_VA_NULL),
0,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->mergeinfo_existence_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
/* Values are svn_stringbuf_t */
NULL, NULL,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "HAS_MERGEINFO",
SVN_VA_NULL),
0,
fs,
no_handler,
fs->pool, pool));
}
else
{
ffd->fulltext_cache = NULL;
ffd->properties_cache = NULL;
ffd->mergeinfo_cache = NULL;
ffd->mergeinfo_existence_cache = NULL;
}
/* if enabled, cache text deltas and their combinations */
if (cache_txdeltas)
{
SVN_ERR(create_cache(&(ffd->raw_window_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
svn_fs_fs__serialize_raw_window,
svn_fs_fs__deserialize_raw_window,
sizeof(window_cache_key_t),
apr_pstrcat(pool, prefix, "RAW_WINDOW",
SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->txdelta_window_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
svn_fs_fs__serialize_txdelta_window,
svn_fs_fs__deserialize_txdelta_window,
sizeof(window_cache_key_t),
apr_pstrcat(pool, prefix, "TXDELTA_WINDOW",
SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->combined_window_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
/* Values are svn_stringbuf_t */
NULL, NULL,
sizeof(window_cache_key_t),
apr_pstrcat(pool, prefix, "COMBINED_WINDOW",
SVN_VA_NULL),
SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
fs->pool, pool));
}
else
{
ffd->txdelta_window_cache = NULL;
ffd->combined_window_cache = NULL;
}
SVN_ERR(create_cache(&(ffd->l2p_header_cache),
NULL,
membuffer,
64, 16, /* entry size varies but we must cover
a reasonable number of revisions (1k) */
svn_fs_fs__serialize_l2p_header,
svn_fs_fs__deserialize_l2p_header,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "L2P_HEADER",
(char *)NULL),
SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->l2p_page_cache),
NULL,
membuffer,
64, 16, /* entry size varies but we must cover
a reasonable number of revisions (1k) */
svn_fs_fs__serialize_l2p_page,
svn_fs_fs__deserialize_l2p_page,
sizeof(svn_fs_fs__page_cache_key_t),
apr_pstrcat(pool, prefix, "L2P_PAGE",
(char *)NULL),
SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->p2l_header_cache),
NULL,
membuffer,
4, 1, /* Large entries. Rarely used. */
svn_fs_fs__serialize_p2l_header,
svn_fs_fs__deserialize_p2l_header,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "P2L_HEADER",
(char *)NULL),
SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
SVN_ERR(create_cache(&(ffd->p2l_page_cache),
NULL,
membuffer,
4, 16, /* Variably sized entries. Rarely used. */
svn_fs_fs__serialize_p2l_page,
svn_fs_fs__deserialize_p2l_page,
sizeof(svn_fs_fs__page_cache_key_t),
apr_pstrcat(pool, prefix, "P2L_PAGE",
(char *)NULL),
SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
fs->pool, pool));
return SVN_NO_ERROR;
}
/* Baton to be used for the remove_txn_cache() pool cleanup function, */
struct txn_cleanup_baton_t
{
/* the cache to reset */
svn_cache__t *txn_cache;
/* the position where to reset it */
svn_cache__t **to_reset;
/* pool that TXN_CACHE was allocated in */
apr_pool_t *txn_pool;
/* pool that the FS containing the TO_RESET pointer was allocator */
apr_pool_t *fs_pool;
};
/* Forward declaration. */
static apr_status_t
remove_txn_cache_fs(void *baton_void);
/* APR pool cleanup handler that will reset the cache pointer given in
BATON_VOID when the TXN_POOL gets cleaned up. */
static apr_status_t
remove_txn_cache_txn(void *baton_void)
{
struct txn_cleanup_baton_t *baton = baton_void;
/* be careful not to hurt performance by resetting newer txn's caches. */
if (*baton->to_reset == baton->txn_cache)
{
/* This is equivalent to calling svn_fs_fs__reset_txn_caches(). */
*baton->to_reset = NULL;
}
/* It's cleaned up now. Prevent double cleanup. */
apr_pool_cleanup_kill(baton->fs_pool,
baton,
remove_txn_cache_fs);
return APR_SUCCESS;
}
/* APR pool cleanup handler that will reset the cache pointer given in
BATON_VOID when the FS_POOL gets cleaned up. */
static apr_status_t
remove_txn_cache_fs(void *baton_void)
{
struct txn_cleanup_baton_t *baton = baton_void;
/* be careful not to hurt performance by resetting newer txn's caches. */
if (*baton->to_reset == baton->txn_cache)
{
/* This is equivalent to calling svn_fs_fs__reset_txn_caches(). */
*baton->to_reset = NULL;
}
/* It's cleaned up now. Prevent double cleanup. */
apr_pool_cleanup_kill(baton->txn_pool,
baton,
remove_txn_cache_txn);
return APR_SUCCESS;
}
/* This function sets / registers the required callbacks for a given
* transaction-specific *CACHE object in FS, if CACHE is not NULL and
* a no-op otherwise. In particular, it will ensure that *CACHE gets
* reset to NULL upon POOL or FS->POOL destruction latest.
*/
static void
init_txn_callbacks(svn_fs_t *fs,
svn_cache__t **cache,
apr_pool_t *pool)
{
if (*cache != NULL)
{
struct txn_cleanup_baton_t *baton;
baton = apr_palloc(pool, sizeof(*baton));
baton->txn_cache = *cache;
baton->to_reset = cache;
baton->txn_pool = pool;
baton->fs_pool = fs->pool;
/* If any of these pools gets cleaned, we must reset the cache.
* We don't know which one will get cleaned up first, so register
* cleanup actions for both and during the cleanup action, unregister
* the respective other action. */
apr_pool_cleanup_register(pool,
baton,
remove_txn_cache_txn,
apr_pool_cleanup_null);
apr_pool_cleanup_register(fs->pool,
baton,
remove_txn_cache_fs,
apr_pool_cleanup_null);
}
}
svn_error_t *
svn_fs_fs__initialize_txn_caches(svn_fs_t *fs,
const char *txn_id,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
/* Transaction content needs to be carefully prefixed to virtually
eliminate any chance for conflicts. The (repo, txn_id) pair
should be unique but if a transaction fails, it might be possible
to start a new transaction later that receives the same id.
Therefore, throw in a uuid as well - just to be sure. */
const char *prefix = apr_pstrcat(pool,
"fsfs:", fs->uuid,
"/", fs->path,
":", txn_id,
":", svn_uuid_generate(pool), ":",
SVN_VA_NULL);
/* We don't support caching for concurrent transactions in the SAME
* FSFS session. Maybe, you forgot to clean POOL. */
if (ffd->txn_dir_cache != NULL || ffd->concurrent_transactions)
{
ffd->txn_dir_cache = NULL;
ffd->concurrent_transactions = TRUE;
return SVN_NO_ERROR;
}
/* create a txn-local directory cache */
SVN_ERR(create_cache(&ffd->txn_dir_cache,
NULL,
svn_cache__get_global_membuffer_cache(),
1024, 8,
svn_fs_fs__serialize_dir_entries,
svn_fs_fs__deserialize_dir_entries,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "TXNDIR",
SVN_VA_NULL),
- 0,
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
TRUE,
pool, pool));
/* reset the transaction-specific cache if the pool gets cleaned up. */
init_txn_callbacks(fs, &(ffd->txn_dir_cache), pool);
return SVN_NO_ERROR;
}
void
svn_fs_fs__reset_txn_caches(svn_fs_t *fs)
{
/* we can always just reset the caches. This may degrade performance but
* can never cause in incorrect behavior. */
fs_fs_data_t *ffd = fs->fsap_data;
ffd->txn_dir_cache = NULL;
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/fs.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/fs.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/fs.c (revision 309511)
@@ -1,616 +1,616 @@
/* fs.c --- creating, opening and closing filesystems
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <apr_general.h>
#include <apr_pools.h>
#include <apr_file_io.h>
#include <apr_thread_mutex.h>
#include "svn_fs.h"
#include "svn_delta.h"
#include "svn_version.h"
#include "svn_pools.h"
#include "fs.h"
#include "fs_fs.h"
#include "tree.h"
#include "lock.h"
#include "hotcopy.h"
#include "id.h"
#include "pack.h"
#include "recovery.h"
#include "rep-cache.h"
#include "revprops.h"
#include "transaction.h"
#include "util.h"
#include "verify.h"
#include "svn_private_config.h"
#include "private/svn_fs_util.h"
#include "../libsvn_fs/fs-loader.h"
/* A prefix for the pool userdata variables used to hold
per-filesystem shared data. See fs_serialized_init. */
#define SVN_FSFS_SHARED_USERDATA_PREFIX "svn-fsfs-shared-"
/* Initialize the part of FS that requires global serialization across all
instances. The caller is responsible of ensuring that serialization.
Use COMMON_POOL for process-wide and POOL for temporary allocations. */
static svn_error_t *
fs_serialized_init(svn_fs_t *fs, apr_pool_t *common_pool, apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
const char *key;
void *val;
fs_fs_shared_data_t *ffsd;
apr_status_t status;
/* Note that we are allocating a small amount of long-lived data for
each separate repository opened during the lifetime of the
svn_fs_initialize pool. It's unlikely that anyone will notice
the modest expenditure; the alternative is to allocate each structure
in a subpool, add a reference-count, and add a serialized destructor
to the FS vtable. That's more machinery than it's worth.
Picking an appropriate key for the shared data is tricky, because,
unfortunately, a filesystem UUID is not really unique. It is implicitly
shared between hotcopied (1), dump / loaded (2) or naively copied (3)
filesystems. We tackle this problem by using a combination of the UUID
and an instance ID as the key. This allows us to avoid key clashing
in (1) and (2) for formats >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT, which
do support instance IDs. For old formats the shared data (locks, shared
transaction data, ...) will still clash.
Speaking of (3), there is not so much we can do about it, except maybe
provide a convenient way of fixing things. Naively copied filesystems
have identical filesystem UUIDs *and* instance IDs. With the key being
a combination of these two, clashes can be fixed by changing either of
them (or both), e.g. with svn_fs_set_uuid(). */
SVN_ERR_ASSERT(fs->uuid);
SVN_ERR_ASSERT(ffd->instance_id);
key = apr_pstrcat(pool, SVN_FSFS_SHARED_USERDATA_PREFIX,
fs->uuid, ":", ffd->instance_id, SVN_VA_NULL);
status = apr_pool_userdata_get(&val, key, common_pool);
if (status)
return svn_error_wrap_apr(status, _("Can't fetch FSFS shared data"));
ffsd = val;
if (!ffsd)
{
ffsd = apr_pcalloc(common_pool, sizeof(*ffsd));
ffsd->common_pool = common_pool;
/* POSIX fcntl locks are per-process, so we need a mutex for
intra-process synchronization when grabbing the repository write
lock. */
SVN_ERR(svn_mutex__init(&ffsd->fs_write_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
/* ... the pack lock ... */
SVN_ERR(svn_mutex__init(&ffsd->fs_pack_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
/* ... not to mention locking the txn-current file. */
SVN_ERR(svn_mutex__init(&ffsd->txn_current_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
/* We also need a mutex for synchronizing access to the active
transaction list and free transaction pointer. */
SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock, TRUE, common_pool));
key = apr_pstrdup(common_pool, key);
status = apr_pool_userdata_set(ffsd, key, NULL, common_pool);
if (status)
return svn_error_wrap_apr(status, _("Can't store FSFS shared data"));
}
ffd->shared = ffsd;
return SVN_NO_ERROR;
}
/* This function is provided for Subversion 1.0.x compatibility. It
has no effect for fsfs backed Subversion filesystems. It conforms
to the fs_library_vtable_t.bdb_set_errcall() API. */
static svn_error_t *
fs_set_errcall(svn_fs_t *fs,
void (*db_errcall_fcn)(const char *errpfx, char *msg))
{
return SVN_NO_ERROR;
}
struct fs_freeze_baton_t {
svn_fs_t *fs;
svn_fs_freeze_func_t freeze_func;
void *freeze_baton;
};
static svn_error_t *
fs_freeze_body(void *baton,
apr_pool_t *pool)
{
struct fs_freeze_baton_t *b = baton;
svn_boolean_t exists;
SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, b->fs, pool));
if (exists)
SVN_ERR(svn_fs_fs__with_rep_cache_lock(b->fs,
b->freeze_func, b->freeze_baton,
pool));
else
SVN_ERR(b->freeze_func(b->freeze_baton, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
fs_freeze_body2(void *baton,
apr_pool_t *pool)
{
struct fs_freeze_baton_t *b = baton;
SVN_ERR(svn_fs_fs__with_write_lock(b->fs, fs_freeze_body, baton, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
fs_freeze(svn_fs_t *fs,
svn_fs_freeze_func_t freeze_func,
void *freeze_baton,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
struct fs_freeze_baton_t b;
b.fs = fs;
b.freeze_func = freeze_func;
b.freeze_baton = freeze_baton;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
SVN_ERR(svn_fs_fs__with_pack_lock(fs, fs_freeze_body2, &b, pool));
else
SVN_ERR(fs_freeze_body2(&b, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
fs_info(const void **fsfs_info,
svn_fs_t *fs,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_fs_fsfs_info_t *info = apr_palloc(result_pool, sizeof(*info));
info->fs_type = SVN_FS_TYPE_FSFS;
info->shard_size = ffd->max_files_per_dir;
info->min_unpacked_rev = ffd->min_unpacked_rev;
info->log_addressing = ffd->use_log_addressing;
*fsfs_info = info;
return SVN_NO_ERROR;
}
/* Wrapper around svn_fs_fs__set_uuid() adapting between function
signatures. */
static svn_error_t *
fs_set_uuid(svn_fs_t *fs,
const char *uuid,
apr_pool_t *pool)
{
/* Whenever we set a new UUID, imply that FS will also be a different
* instance (on formats that support this). */
return svn_error_trace(svn_fs_fs__set_uuid(fs, uuid, NULL, pool));
}
/* The vtable associated with a specific open filesystem. */
static fs_vtable_t fs_vtable = {
svn_fs_fs__youngest_rev,
svn_fs_fs__revision_prop,
svn_fs_fs__get_revision_proplist,
svn_fs_fs__change_rev_prop,
fs_set_uuid,
svn_fs_fs__revision_root,
svn_fs_fs__begin_txn,
svn_fs_fs__open_txn,
svn_fs_fs__purge_txn,
svn_fs_fs__list_transactions,
svn_fs_fs__deltify,
svn_fs_fs__lock,
svn_fs_fs__generate_lock_token,
svn_fs_fs__unlock,
svn_fs_fs__get_lock,
svn_fs_fs__get_locks,
svn_fs_fs__info_format,
svn_fs_fs__info_config_files,
fs_info,
svn_fs_fs__verify_root,
fs_freeze,
fs_set_errcall
};
/* Creating a new filesystem. */
/* Set up vtable and fsap_data fields in FS. */
static svn_error_t *
initialize_fs_struct(svn_fs_t *fs)
{
fs_fs_data_t *ffd = apr_pcalloc(fs->pool, sizeof(*ffd));
ffd->use_log_addressing = FALSE;
fs->vtable = &fs_vtable;
fs->fsap_data = ffd;
return SVN_NO_ERROR;
}
/* Reset vtable and fsap_data fields in FS such that the FS is basically
* closed now. Note that FS must not hold locks when you call this. */
static void
uninitialize_fs_struct(svn_fs_t *fs)
{
fs->vtable = NULL;
fs->fsap_data = NULL;
}
/* This implements the fs_library_vtable_t.create() API. Create a new
fsfs-backed Subversion filesystem at path PATH and link it into
*FS. Perform temporary allocations in POOL, and fs-global allocations
in COMMON_POOL. The latter must be serialized using COMMON_POOL_LOCK. */
static svn_error_t *
fs_create(svn_fs_t *fs,
const char *path,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
SVN_ERR(svn_fs__check_fs(fs, FALSE));
SVN_ERR(initialize_fs_struct(fs));
SVN_ERR(svn_fs_fs__create(fs, path, pool));
SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
SVN_MUTEX__WITH_LOCK(common_pool_lock,
fs_serialized_init(fs, common_pool, pool));
return SVN_NO_ERROR;
}
/* Gaining access to an existing filesystem. */
/* This implements the fs_library_vtable_t.open() API. Open an FSFS
Subversion filesystem located at PATH, set *FS to point to the
correct vtable for the filesystem. Use POOL for any temporary
allocations, and COMMON_POOL for fs-global allocations.
The latter must be serialized using COMMON_POOL_LOCK. */
static svn_error_t *
fs_open(svn_fs_t *fs,
const char *path,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
apr_pool_t *subpool = svn_pool_create(pool);
SVN_ERR(svn_fs__check_fs(fs, FALSE));
SVN_ERR(initialize_fs_struct(fs));
SVN_ERR(svn_fs_fs__open(fs, path, subpool));
SVN_ERR(svn_fs_fs__initialize_caches(fs, subpool));
SVN_MUTEX__WITH_LOCK(common_pool_lock,
fs_serialized_init(fs, common_pool, subpool));
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
/* This implements the fs_library_vtable_t.open_for_recovery() API. */
static svn_error_t *
fs_open_for_recovery(svn_fs_t *fs,
const char *path,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
svn_error_t * err;
svn_revnum_t youngest_rev;
apr_pool_t * subpool = svn_pool_create(pool);
/* Recovery for FSFS is currently limited to recreating the 'current'
file from the latest revision. */
/* The only thing we have to watch out for is that the 'current' file
might not exist or contain garbage. So we'll try to read it here
and provide or replace the existing file if we couldn't read it.
(We'll also need it to exist later anyway as a source for the new
file's permissions). */
/* Use a partly-filled fs pointer first to create 'current'. */
fs->path = apr_pstrdup(fs->pool, path);
SVN_ERR(initialize_fs_struct(fs));
/* Figure out the repo format and check that we can even handle it. */
SVN_ERR(svn_fs_fs__read_format_file(fs, subpool));
/* Now, read 'current' and try to patch it if necessary. */
err = svn_fs_fs__youngest_rev(&youngest_rev, fs, subpool);
if (err)
{
const char *file_path;
/* 'current' file is missing or contains garbage. Since we are trying
* to recover from whatever problem there is, being picky about the
* error code here won't do us much good. If there is a persistent
* problem that we can't fix, it will show up when we try rewrite the
* file a few lines further below and we will report the failure back
* to the caller.
*
* Start recovery with HEAD = 0. */
svn_error_clear(err);
file_path = svn_fs_fs__path_current(fs, subpool);
/* Best effort to ensure the file exists and is valid.
* This may fail for r/o filesystems etc. */
SVN_ERR(svn_io_remove_file2(file_path, TRUE, subpool));
SVN_ERR(svn_io_file_create_empty(file_path, subpool));
SVN_ERR(svn_fs_fs__write_current(fs, 0, 1, 1, subpool));
}
uninitialize_fs_struct(fs);
svn_pool_destroy(subpool);
/* Now open the filesystem properly by calling the vtable method directly. */
return fs_open(fs, path, common_pool_lock, pool, common_pool);
}
/* This implements the fs_library_vtable_t.upgrade_fs() API. */
static svn_error_t *
fs_upgrade(svn_fs_t *fs,
const char *path,
svn_fs_upgrade_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
SVN_ERR(fs_open(fs, path, common_pool_lock, pool, common_pool));
return svn_fs_fs__upgrade(fs, notify_func, notify_baton,
cancel_func, cancel_baton, pool);
}
static svn_error_t *
fs_verify(svn_fs_t *fs, const char *path,
svn_revnum_t start,
svn_revnum_t end,
svn_fs_progress_notify_func_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
SVN_ERR(fs_open(fs, path, common_pool_lock, pool, common_pool));
return svn_fs_fs__verify(fs, start, end, notify_func, notify_baton,
cancel_func, cancel_baton, pool);
}
static svn_error_t *
fs_pack(svn_fs_t *fs,
const char *path,
svn_fs_pack_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
SVN_ERR(fs_open(fs, path, common_pool_lock, pool, common_pool));
- return svn_fs_fs__pack(fs, notify_func, notify_baton,
+ return svn_fs_fs__pack(fs, 0, notify_func, notify_baton,
cancel_func, cancel_baton, pool);
}
/* This implements the fs_library_vtable_t.hotcopy() API. Copy a
possibly live Subversion filesystem SRC_FS from SRC_PATH to a
DST_FS at DEST_PATH. If INCREMENTAL is TRUE, make an effort not to
re-copy data which already exists in DST_FS.
The CLEAN_LOGS argument is ignored and included for Subversion
1.0.x compatibility. Indicate progress via the optional NOTIFY_FUNC
callback using NOTIFY_BATON. Perform all temporary allocations in POOL. */
static svn_error_t *
fs_hotcopy(svn_fs_t *src_fs,
svn_fs_t *dst_fs,
const char *src_path,
const char *dst_path,
svn_boolean_t clean_logs,
svn_boolean_t incremental,
svn_fs_hotcopy_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
/* Open the source repo as usual. */
SVN_ERR(fs_open(src_fs, src_path, common_pool_lock, pool, common_pool));
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
/* Test target repo when in INCREMENTAL mode, initialize it when not.
* For this, we need our FS internal data structures to be temporarily
* available. */
SVN_ERR(initialize_fs_struct(dst_fs));
SVN_ERR(svn_fs_fs__hotcopy_prepare_target(src_fs, dst_fs, dst_path,
incremental, pool));
uninitialize_fs_struct(dst_fs);
/* Now, the destination repo should open just fine. */
SVN_ERR(fs_open(dst_fs, dst_path, common_pool_lock, pool, common_pool));
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
/* Now, we may copy data as needed ... */
return svn_fs_fs__hotcopy(src_fs, dst_fs, incremental,
notify_func, notify_baton,
cancel_func, cancel_baton, pool);
}
/* This function is included for Subversion 1.0.x compatibility. It
has no effect for fsfs backed Subversion filesystems. It conforms
to the fs_library_vtable_t.bdb_logfiles() API. */
static svn_error_t *
fs_logfiles(apr_array_header_t **logfiles,
const char *path,
svn_boolean_t only_unused,
apr_pool_t *pool)
{
/* A no-op for FSFS. */
*logfiles = apr_array_make(pool, 0, sizeof(const char *));
return SVN_NO_ERROR;
}
/* Delete the filesystem located at path PATH. Perform any temporary
allocations in POOL. */
static svn_error_t *
fs_delete_fs(const char *path,
apr_pool_t *pool)
{
/* Remove everything. */
return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
}
static const svn_version_t *
fs_version(void)
{
SVN_VERSION_BODY;
}
static const char *
fs_get_description(void)
{
return _("Module for working with a plain file (FSFS) repository.");
}
static svn_error_t *
fs_set_svn_fs_open(svn_fs_t *fs,
svn_error_t *(*svn_fs_open_)(svn_fs_t **,
const char *,
apr_hash_t *,
apr_pool_t *,
apr_pool_t *))
{
fs_fs_data_t *ffd = fs->fsap_data;
ffd->svn_fs_open_ = svn_fs_open_;
return SVN_NO_ERROR;
}
static void *
fs_info_dup(const void *fsfs_info_void,
apr_pool_t *result_pool)
{
/* All fields are either ints or static strings. */
const svn_fs_fsfs_info_t *fsfs_info = fsfs_info_void;
return apr_pmemdup(result_pool, fsfs_info, sizeof(*fsfs_info));
}
/* Base FS library vtable, used by the FS loader library. */
static fs_library_vtable_t library_vtable = {
fs_version,
fs_create,
fs_open,
fs_open_for_recovery,
fs_upgrade,
fs_verify,
fs_delete_fs,
fs_hotcopy,
fs_get_description,
svn_fs_fs__recover,
fs_pack,
fs_logfiles,
NULL /* parse_id */,
fs_set_svn_fs_open,
fs_info_dup
};
svn_error_t *
svn_fs_fs__init(const svn_version_t *loader_version,
fs_library_vtable_t **vtable, apr_pool_t* common_pool)
{
static const svn_version_checklist_t checklist[] =
{
{ "svn_subr", svn_subr_version },
{ "svn_delta", svn_delta_version },
{ "svn_fs_util", svn_fs_util__version },
{ NULL, NULL }
};
/* Simplified version check to make sure we can safely use the
VTABLE parameter. The FS loader does a more exhaustive check. */
if (loader_version->major != SVN_VER_MAJOR)
return svn_error_createf(SVN_ERR_VERSION_MISMATCH, NULL,
_("Unsupported FS loader version (%d) for fsfs"),
loader_version->major);
SVN_ERR(svn_ver_check_list2(fs_version(), checklist, svn_ver_equal));
*vtable = &library_vtable;
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/fs_fs.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/fs_fs.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/fs_fs.c (revision 309511)
@@ -1,2204 +1,2205 @@
/* fs_fs.c --- filesystem operations specific to fs_fs
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "fs_fs.h"
#include <apr_uuid.h>
#include "svn_private_config.h"
#include "svn_checksum.h"
#include "svn_hash.h"
#include "svn_props.h"
#include "svn_time.h"
#include "svn_dirent_uri.h"
#include "svn_sorts.h"
#include "svn_version.h"
#include "cached_data.h"
#include "id.h"
#include "index.h"
#include "rep-cache.h"
#include "revprops.h"
#include "transaction.h"
#include "tree.h"
#include "util.h"
#include "private/svn_fs_util.h"
#include "private/svn_io_private.h"
#include "private/svn_string_private.h"
#include "private/svn_subr_private.h"
#include "../libsvn_fs/fs-loader.h"
/* The default maximum number of files per directory to store in the
rev and revprops directory. The number below is somewhat arbitrary,
and can be overridden by defining the macro while compiling; the
figure of 1000 is reasonable for VFAT filesystems, which are by far
the worst performers in this area. */
#ifndef SVN_FS_FS_DEFAULT_MAX_FILES_PER_DIR
#define SVN_FS_FS_DEFAULT_MAX_FILES_PER_DIR 1000
#endif
/* Begin deltification after a node history exceeded this this limit.
Useful values are 4 to 64 with 16 being a good compromise between
computational overhead and repository size savings.
Should be a power of 2.
Values < 2 will result in standard skip-delta behavior. */
#define SVN_FS_FS_MAX_LINEAR_DELTIFICATION 16
/* Finding a deltification base takes operations proportional to the
number of changes being skipped. To prevent exploding runtime
during commits, limit the deltification range to this value.
Should be a power of 2 minus one.
Values < 1 disable deltification. */
#define SVN_FS_FS_MAX_DELTIFICATION_WALK 1023
/* Notes:
To avoid opening and closing the rev-files all the time, it would
probably be advantageous to keep each rev-file open for the
lifetime of the transaction object. I'll leave that as a later
optimization for now.
I didn't keep track of pool lifetimes at all in this code. There
are likely some errors because of that.
*/
/* Declarations. */
static svn_error_t *
get_youngest(svn_revnum_t *youngest_p, svn_fs_t *fs, apr_pool_t *pool);
/* Pathname helper functions */
static const char *
path_format(svn_fs_t *fs, apr_pool_t *pool)
{
return svn_dirent_join(fs->path, PATH_FORMAT, pool);
}
static APR_INLINE const char *
path_uuid(svn_fs_t *fs, apr_pool_t *pool)
{
return svn_dirent_join(fs->path, PATH_UUID, pool);
}
const char *
svn_fs_fs__path_current(svn_fs_t *fs, apr_pool_t *pool)
{
return svn_dirent_join(fs->path, PATH_CURRENT, pool);
}
/* Get a lock on empty file LOCK_FILENAME, creating it in POOL. */
static svn_error_t *
get_lock_on_filesystem(const char *lock_filename,
apr_pool_t *pool)
{
return svn_error_trace(svn_io__file_lock_autocreate(lock_filename, pool));
}
/* Reset the HAS_WRITE_LOCK member in the FFD given as BATON_VOID.
When registered with the pool holding the lock on the lock file,
this makes sure the flag gets reset just before we release the lock. */
static apr_status_t
reset_lock_flag(void *baton_void)
{
fs_fs_data_t *ffd = baton_void;
ffd->has_write_lock = FALSE;
return APR_SUCCESS;
}
/* Structure defining a file system lock to be acquired and the function
to be executed while the lock is held.
Instances of this structure may be nested to allow for multiple locks to
be taken out before executing the user-provided body. In that case, BODY
and BATON of the outer instances will be with_lock and a with_lock_baton_t
instance (transparently, no special treatment is required.). It is
illegal to attempt to acquire the same lock twice within the same lock
chain or via nesting calls using separate lock chains.
All instances along the chain share the same LOCK_POOL such that only one
pool needs to be created and cleared for all locks. We also allocate as
much data from that lock pool as possible to minimize memory usage in
caller pools. */
typedef struct with_lock_baton_t
{
/* The filesystem we operate on. Same for all instances along the chain. */
svn_fs_t *fs;
/* Mutex to complement the lock file in an APR threaded process.
No-op object for non-threaded processes but never NULL. */
svn_mutex__t *mutex;
/* Path to the file to lock. */
const char *lock_path;
/* If true, set FS->HAS_WRITE_LOCK after we acquired the lock. */
svn_boolean_t is_global_lock;
/* Function body to execute after we acquired the lock.
This may be user-provided or a nested call to with_lock(). */
svn_error_t *(*body)(void *baton,
apr_pool_t *pool);
/* Baton to pass to BODY; possibly NULL.
This may be user-provided or a nested lock baton instance. */
void *baton;
/* Pool for all allocations along the lock chain and BODY. Will hold the
file locks and gets destroyed after the outermost BODY returned,
releasing all file locks.
Same for all instances along the chain. */
apr_pool_t *lock_pool;
/* TRUE, iff BODY is the user-provided body. */
svn_boolean_t is_inner_most_lock;
/* TRUE, iff this is not a nested lock.
Then responsible for destroying LOCK_POOL. */
svn_boolean_t is_outer_most_lock;
} with_lock_baton_t;
/* Obtain a write lock on the file BATON->LOCK_PATH and call BATON->BODY
with BATON->BATON. If this is the outermost lock call, release all file
locks after the body returned. If BATON->IS_GLOBAL_LOCK is set, set the
HAS_WRITE_LOCK flag while we keep the write lock. */
static svn_error_t *
with_some_lock_file(with_lock_baton_t *baton)
{
apr_pool_t *pool = baton->lock_pool;
svn_error_t *err = get_lock_on_filesystem(baton->lock_path, pool);
if (!err)
{
svn_fs_t *fs = baton->fs;
fs_fs_data_t *ffd = fs->fsap_data;
if (baton->is_global_lock)
{
/* set the "got the lock" flag and register reset function */
apr_pool_cleanup_register(pool,
ffd,
reset_lock_flag,
apr_pool_cleanup_null);
ffd->has_write_lock = TRUE;
}
/* nobody else will modify the repo state
=> read HEAD & pack info once */
if (baton->is_inner_most_lock)
{
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
err = svn_fs_fs__update_min_unpacked_rev(fs, pool);
if (!err)
err = get_youngest(&ffd->youngest_rev_cache, fs, pool);
}
if (!err)
err = baton->body(baton->baton, pool);
}
if (baton->is_outer_most_lock)
svn_pool_destroy(pool);
return svn_error_trace(err);
}
/* Wraps with_some_lock_file, protecting it with BATON->MUTEX.
POOL is unused here and only provided for signature compatibility with
WITH_LOCK_BATON_T.BODY. */
static svn_error_t *
with_lock(void *baton,
apr_pool_t *pool)
{
with_lock_baton_t *lock_baton = baton;
SVN_MUTEX__WITH_LOCK(lock_baton->mutex, with_some_lock_file(lock_baton));
return SVN_NO_ERROR;
}
/* Enum identifying a filesystem lock. */
typedef enum lock_id_t
{
write_lock,
txn_lock,
pack_lock
} lock_id_t;
/* Initialize BATON->MUTEX, BATON->LOCK_PATH and BATON->IS_GLOBAL_LOCK
according to the LOCK_ID. All other members of BATON must already be
valid. */
static void
init_lock_baton(with_lock_baton_t *baton,
lock_id_t lock_id)
{
fs_fs_data_t *ffd = baton->fs->fsap_data;
fs_fs_shared_data_t *ffsd = ffd->shared;
switch (lock_id)
{
case write_lock:
baton->mutex = ffsd->fs_write_lock;
baton->lock_path = svn_fs_fs__path_lock(baton->fs, baton->lock_pool);
baton->is_global_lock = TRUE;
break;
case txn_lock:
baton->mutex = ffsd->txn_current_lock;
baton->lock_path = svn_fs_fs__path_txn_current_lock(baton->fs,
baton->lock_pool);
baton->is_global_lock = FALSE;
break;
case pack_lock:
baton->mutex = ffsd->fs_pack_lock;
baton->lock_path = svn_fs_fs__path_pack_lock(baton->fs,
baton->lock_pool);
baton->is_global_lock = FALSE;
break;
}
}
/* Return the baton for the innermost lock of a (potential) lock chain.
The baton shall take out LOCK_ID from FS and execute BODY with BATON
while the lock is being held. Allocate the result in a sub-pool of POOL.
*/
static with_lock_baton_t *
create_lock_baton(svn_fs_t *fs,
lock_id_t lock_id,
svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
void *baton,
apr_pool_t *pool)
{
/* Allocate everything along the lock chain into a single sub-pool.
This minimizes memory usage and cleanup overhead. */
apr_pool_t *lock_pool = svn_pool_create(pool);
with_lock_baton_t *result = apr_pcalloc(lock_pool, sizeof(*result));
/* Store parameters. */
result->fs = fs;
result->body = body;
result->baton = baton;
/* File locks etc. will use this pool as well for easy cleanup. */
result->lock_pool = lock_pool;
/* Right now, we are the first, (only, ) and last struct in the chain. */
result->is_inner_most_lock = TRUE;
result->is_outer_most_lock = TRUE;
/* Select mutex and lock file path depending on LOCK_ID.
Also, initialize dependent members (IS_GLOBAL_LOCK only, ATM). */
init_lock_baton(result, lock_id);
return result;
}
/* Return a baton that wraps NESTED and requests LOCK_ID as additional lock.
*
* That means, when you create a lock chain, start with the last / innermost
* lock to take out and add the first / outermost lock last.
*/
static with_lock_baton_t *
chain_lock_baton(lock_id_t lock_id,
with_lock_baton_t *nested)
{
/* Use the same pool for batons along the lock chain. */
apr_pool_t *lock_pool = nested->lock_pool;
with_lock_baton_t *result = apr_pcalloc(lock_pool, sizeof(*result));
/* All locks along the chain operate on the same FS. */
result->fs = nested->fs;
/* Execution of this baton means acquiring the nested lock and its
execution. */
result->body = with_lock;
result->baton = nested;
/* Shared among all locks along the chain. */
result->lock_pool = lock_pool;
/* We are the new outermost lock but surely not the innermost lock. */
result->is_inner_most_lock = FALSE;
result->is_outer_most_lock = TRUE;
nested->is_outer_most_lock = FALSE;
/* Select mutex and lock file path depending on LOCK_ID.
Also, initialize dependent members (IS_GLOBAL_LOCK only, ATM). */
init_lock_baton(result, lock_id);
return result;
}
svn_error_t *
svn_fs_fs__with_write_lock(svn_fs_t *fs,
svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
void *baton,
apr_pool_t *pool)
{
return svn_error_trace(
with_lock(create_lock_baton(fs, write_lock, body, baton, pool),
pool));
}
svn_error_t *
svn_fs_fs__with_pack_lock(svn_fs_t *fs,
svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
void *baton,
apr_pool_t *pool)
{
return svn_error_trace(
with_lock(create_lock_baton(fs, pack_lock, body, baton, pool),
pool));
}
svn_error_t *
svn_fs_fs__with_txn_current_lock(svn_fs_t *fs,
svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
void *baton,
apr_pool_t *pool)
{
return svn_error_trace(
with_lock(create_lock_baton(fs, txn_lock, body, baton, pool),
pool));
}
svn_error_t *
svn_fs_fs__with_all_locks(svn_fs_t *fs,
svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
void *baton,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
/* Be sure to use the correct lock ordering as documented in
fs_fs_shared_data_t. The lock chain is being created in
innermost (last to acquire) -> outermost (first to acquire) order. */
with_lock_baton_t *lock_baton
= create_lock_baton(fs, write_lock, body, baton, pool);
if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
lock_baton = chain_lock_baton(pack_lock, lock_baton);
if (ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
lock_baton = chain_lock_baton(txn_lock, lock_baton);
return svn_error_trace(with_lock(lock_baton, pool));
}
/* Check that BUF, a nul-terminated buffer of text from format file PATH,
contains only digits at OFFSET and beyond, raising an error if not.
Uses POOL for temporary allocation. */
static svn_error_t *
check_format_file_buffer_numeric(const char *buf, apr_off_t offset,
const char *path, apr_pool_t *pool)
{
return svn_fs_fs__check_file_buffer_numeric(buf, offset, path, "Format",
pool);
}
/* Return the error SVN_ERR_FS_UNSUPPORTED_FORMAT if FS's format
number is not the same as a format number supported by this
Subversion. */
static svn_error_t *
check_format(int format)
{
/* Blacklist. These formats may be either younger or older than
SVN_FS_FS__FORMAT_NUMBER, but we don't support them. */
if (format == SVN_FS_FS__PACKED_REVPROP_SQLITE_DEV_FORMAT)
return svn_error_createf(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
_("Found format '%d', only created by "
"unreleased dev builds; see "
"http://subversion.apache.org"
"/docs/release-notes/1.7#revprop-packing"),
format);
/* We support all formats from 1-current simultaneously */
if (1 <= format && format <= SVN_FS_FS__FORMAT_NUMBER)
return SVN_NO_ERROR;
return svn_error_createf(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
_("Expected FS format between '1' and '%d'; found format '%d'"),
SVN_FS_FS__FORMAT_NUMBER, format);
}
/* Read the format number and maximum number of files per directory
from PATH and return them in *PFORMAT, *MAX_FILES_PER_DIR and
USE_LOG_ADDRESSIONG respectively.
*MAX_FILES_PER_DIR is obtained from the 'layout' format option, and
will be set to zero if a linear scheme should be used.
*USE_LOG_ADDRESSIONG is obtained from the 'addressing' format option,
and will be set to FALSE for physical addressing.
Use POOL for temporary allocation. */
static svn_error_t *
read_format(int *pformat,
int *max_files_per_dir,
svn_boolean_t *use_log_addressing,
const char *path,
apr_pool_t *pool)
{
svn_error_t *err;
svn_stream_t *stream;
svn_stringbuf_t *content;
svn_stringbuf_t *buf;
svn_boolean_t eos = FALSE;
err = svn_stringbuf_from_file2(&content, path, pool);
if (err && APR_STATUS_IS_ENOENT(err->apr_err))
{
/* Treat an absent format file as format 1. Do not try to
create the format file on the fly, because the repository
might be read-only for us, or this might be a read-only
operation, and the spirit of FSFS is to make no changes
whatseover in read-only operations. See thread starting at
http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=97600
for more. */
svn_error_clear(err);
*pformat = 1;
*max_files_per_dir = 0;
+ *use_log_addressing = FALSE;
return SVN_NO_ERROR;
}
SVN_ERR(err);
stream = svn_stream_from_stringbuf(content, pool);
SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eos, pool));
if (buf->len == 0 && eos)
{
/* Return a more useful error message. */
return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
_("Can't read first line of format file '%s'"),
svn_dirent_local_style(path, pool));
}
/* Check that the first line contains only digits. */
SVN_ERR(check_format_file_buffer_numeric(buf->data, 0, path, pool));
SVN_ERR(svn_cstring_atoi(pformat, buf->data));
/* Check that we support this format at all */
SVN_ERR(check_format(*pformat));
/* Set the default values for anything that can be set via an option. */
*max_files_per_dir = 0;
*use_log_addressing = FALSE;
/* Read any options. */
while (!eos)
{
SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eos, pool));
if (buf->len == 0)
break;
if (*pformat >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT &&
strncmp(buf->data, "layout ", 7) == 0)
{
if (strcmp(buf->data + 7, "linear") == 0)
{
*max_files_per_dir = 0;
continue;
}
if (strncmp(buf->data + 7, "sharded ", 8) == 0)
{
/* Check that the argument is numeric. */
SVN_ERR(check_format_file_buffer_numeric(buf->data, 15, path, pool));
SVN_ERR(svn_cstring_atoi(max_files_per_dir, buf->data + 15));
continue;
}
}
if (*pformat >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT &&
strncmp(buf->data, "addressing ", 11) == 0)
{
if (strcmp(buf->data + 11, "physical") == 0)
{
*use_log_addressing = FALSE;
continue;
}
if (strcmp(buf->data + 11, "logical") == 0)
{
*use_log_addressing = TRUE;
continue;
}
}
return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
_("'%s' contains invalid filesystem format option '%s'"),
svn_dirent_local_style(path, pool), buf->data);
}
/* Non-sharded repositories never use logical addressing.
* If the format file is inconsistent in that respect, something
* probably went wrong.
*/
if (*use_log_addressing && !*max_files_per_dir)
return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
_("'%s' specifies logical addressing for a non-sharded repository"),
svn_dirent_local_style(path, pool));
return SVN_NO_ERROR;
}
/* Write the format number, maximum number of files per directory and
the addressing scheme to a new format file in PATH, possibly expecting
to overwrite a previously existing file.
Use POOL for temporary allocation. */
svn_error_t *
svn_fs_fs__write_format(svn_fs_t *fs,
svn_boolean_t overwrite,
apr_pool_t *pool)
{
svn_stringbuf_t *sb;
fs_fs_data_t *ffd = fs->fsap_data;
const char *path = path_format(fs, pool);
SVN_ERR_ASSERT(1 <= ffd->format
&& ffd->format <= SVN_FS_FS__FORMAT_NUMBER);
sb = svn_stringbuf_createf(pool, "%d\n", ffd->format);
if (ffd->format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
{
if (ffd->max_files_per_dir)
svn_stringbuf_appendcstr(sb, apr_psprintf(pool, "layout sharded %d\n",
ffd->max_files_per_dir));
else
svn_stringbuf_appendcstr(sb, "layout linear\n");
}
if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
{
if (ffd->use_log_addressing)
svn_stringbuf_appendcstr(sb, "addressing logical\n");
else
svn_stringbuf_appendcstr(sb, "addressing physical\n");
}
/* svn_io_write_version_file() does a load of magic to allow it to
replace version files that already exist. We only need to do
that when we're allowed to overwrite an existing file. */
if (! overwrite)
{
/* Create the file */
SVN_ERR(svn_io_file_create(path, sb->data, pool));
}
else
{
SVN_ERR(svn_io_write_atomic(path, sb->data, sb->len,
NULL /* copy_perms_path */, pool));
}
/* And set the perms to make it read only */
return svn_io_set_file_read_only(path, FALSE, pool);
}
svn_boolean_t
svn_fs_fs__fs_supports_mergeinfo(svn_fs_t *fs)
{
fs_fs_data_t *ffd = fs->fsap_data;
return ffd->format >= SVN_FS_FS__MIN_MERGEINFO_FORMAT;
}
/* Check that BLOCK_SIZE is a valid block / page size, i.e. it is within
* the range of what the current system may address in RAM and it is a
* power of 2. Assume that the element size within the block is ITEM_SIZE.
* Use SCRATCH_POOL for temporary allocations.
*/
static svn_error_t *
verify_block_size(apr_int64_t block_size,
apr_size_t item_size,
const char *name,
apr_pool_t *scratch_pool
)
{
/* Limit range. */
if (block_size <= 0)
return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
_("%s is too small for fsfs.conf setting '%s'."),
apr_psprintf(scratch_pool,
"%" APR_INT64_T_FMT,
block_size),
name);
if (block_size > SVN_MAX_OBJECT_SIZE / item_size)
return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
_("%s is too large for fsfs.conf setting '%s'."),
apr_psprintf(scratch_pool,
"%" APR_INT64_T_FMT,
block_size),
name);
/* Ensure it is a power of two.
* For positive X, X & (X-1) will reset the lowest bit set.
* If the result is 0, at most one bit has been set. */
if (0 != (block_size & (block_size - 1)))
return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
_("%s is invalid for fsfs.conf setting '%s' "
"because it is not a power of 2."),
apr_psprintf(scratch_pool,
"%" APR_INT64_T_FMT,
block_size),
name);
return SVN_NO_ERROR;
}
/* Read the configuration information of the file system at FS_PATH
* and set the respective values in FFD. Use pools as usual.
*/
static svn_error_t *
read_config(fs_fs_data_t *ffd,
const char *fs_path,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_config_t *config;
SVN_ERR(svn_config_read3(&config,
svn_dirent_join(fs_path, PATH_CONFIG, scratch_pool),
FALSE, FALSE, FALSE, scratch_pool));
/* Initialize ffd->rep_sharing_allowed. */
if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
SVN_ERR(svn_config_get_bool(config, &ffd->rep_sharing_allowed,
CONFIG_SECTION_REP_SHARING,
CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
else
ffd->rep_sharing_allowed = FALSE;
/* Initialize deltification settings in ffd. */
if (ffd->format >= SVN_FS_FS__MIN_DELTIFICATION_FORMAT)
{
apr_int64_t compression_level;
SVN_ERR(svn_config_get_bool(config, &ffd->deltify_directories,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_ENABLE_DIR_DELTIFICATION,
TRUE));
SVN_ERR(svn_config_get_bool(config, &ffd->deltify_properties,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION,
TRUE));
SVN_ERR(svn_config_get_int64(config, &ffd->max_deltification_walk,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_MAX_DELTIFICATION_WALK,
SVN_FS_FS_MAX_DELTIFICATION_WALK));
SVN_ERR(svn_config_get_int64(config, &ffd->max_linear_deltification,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_MAX_LINEAR_DELTIFICATION,
SVN_FS_FS_MAX_LINEAR_DELTIFICATION));
SVN_ERR(svn_config_get_int64(config, &compression_level,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_COMPRESSION_LEVEL,
SVN_DELTA_COMPRESSION_LEVEL_DEFAULT));
ffd->delta_compression_level
= (int)MIN(MAX(SVN_DELTA_COMPRESSION_LEVEL_NONE, compression_level),
SVN_DELTA_COMPRESSION_LEVEL_MAX);
}
else
{
ffd->deltify_directories = FALSE;
ffd->deltify_properties = FALSE;
ffd->max_deltification_walk = SVN_FS_FS_MAX_DELTIFICATION_WALK;
ffd->max_linear_deltification = SVN_FS_FS_MAX_LINEAR_DELTIFICATION;
ffd->delta_compression_level = SVN_DELTA_COMPRESSION_LEVEL_DEFAULT;
}
/* Initialize revprop packing settings in ffd. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
{
SVN_ERR(svn_config_get_bool(config, &ffd->compress_packed_revprops,
CONFIG_SECTION_PACKED_REVPROPS,
CONFIG_OPTION_COMPRESS_PACKED_REVPROPS,
FALSE));
SVN_ERR(svn_config_get_int64(config, &ffd->revprop_pack_size,
CONFIG_SECTION_PACKED_REVPROPS,
CONFIG_OPTION_REVPROP_PACK_SIZE,
ffd->compress_packed_revprops
? 0x10
: 0x4));
ffd->revprop_pack_size *= 1024;
}
else
{
ffd->revprop_pack_size = 0x10000;
ffd->compress_packed_revprops = FALSE;
}
if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
{
SVN_ERR(svn_config_get_int64(config, &ffd->block_size,
CONFIG_SECTION_IO,
CONFIG_OPTION_BLOCK_SIZE,
64));
SVN_ERR(svn_config_get_int64(config, &ffd->l2p_page_size,
CONFIG_SECTION_IO,
CONFIG_OPTION_L2P_PAGE_SIZE,
0x2000));
SVN_ERR(svn_config_get_int64(config, &ffd->p2l_page_size,
CONFIG_SECTION_IO,
CONFIG_OPTION_P2L_PAGE_SIZE,
0x400));
/* Don't accept unreasonable or illegal values.
* Block size and P2L page size are in kbytes;
* L2P blocks are arrays of apr_off_t. */
SVN_ERR(verify_block_size(ffd->block_size, 0x400,
CONFIG_OPTION_BLOCK_SIZE, scratch_pool));
SVN_ERR(verify_block_size(ffd->p2l_page_size, 0x400,
CONFIG_OPTION_P2L_PAGE_SIZE, scratch_pool));
SVN_ERR(verify_block_size(ffd->l2p_page_size, sizeof(apr_off_t),
CONFIG_OPTION_L2P_PAGE_SIZE, scratch_pool));
/* convert kBytes to bytes */
ffd->block_size *= 0x400;
ffd->p2l_page_size *= 0x400;
/* L2P pages are in entries - not in (k)Bytes */
}
else
{
/* should be irrelevant but we initialize them anyway */
ffd->block_size = 0x1000; /* Matches default APR file buffer size. */
ffd->l2p_page_size = 0x2000; /* Matches above default. */
ffd->p2l_page_size = 0x100000; /* Matches above default in bytes. */
}
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
{
SVN_ERR(svn_config_get_bool(config, &ffd->pack_after_commit,
CONFIG_SECTION_DEBUG,
CONFIG_OPTION_PACK_AFTER_COMMIT,
FALSE));
}
else
{
ffd->pack_after_commit = FALSE;
}
/* memcached configuration */
SVN_ERR(svn_cache__make_memcache_from_config(&ffd->memcache, config,
result_pool, scratch_pool));
SVN_ERR(svn_config_get_bool(config, &ffd->fail_stop,
CONFIG_SECTION_CACHES, CONFIG_OPTION_FAIL_STOP,
FALSE));
return SVN_NO_ERROR;
}
static svn_error_t *
write_config(svn_fs_t *fs,
apr_pool_t *pool)
{
#define NL APR_EOL_STR
static const char * const fsfs_conf_contents =
"### This file controls the configuration of the FSFS filesystem." NL
"" NL
"[" SVN_CACHE_CONFIG_CATEGORY_MEMCACHED_SERVERS "]" NL
"### These options name memcached servers used to cache internal FSFS" NL
"### data. See http://www.danga.com/memcached/ for more information on" NL
"### memcached. To use memcached with FSFS, run one or more memcached" NL
"### servers, and specify each of them as an option like so:" NL
"# first-server = 127.0.0.1:11211" NL
"# remote-memcached = mymemcached.corp.example.com:11212" NL
"### The option name is ignored; the value is of the form HOST:PORT." NL
"### memcached servers can be shared between multiple repositories;" NL
"### however, if you do this, you *must* ensure that repositories have" NL
"### distinct UUIDs and paths, or else cached data from one repository" NL
"### might be used by another accidentally. Note also that memcached has" NL
"### no authentication for reads or writes, so you must ensure that your" NL
"### memcached servers are only accessible by trusted users." NL
"" NL
"[" CONFIG_SECTION_CACHES "]" NL
"### When a cache-related error occurs, normally Subversion ignores it" NL
"### and continues, logging an error if the server is appropriately" NL
"### configured (and ignoring it with file:// access). To make" NL
"### Subversion never ignore cache errors, uncomment this line." NL
"# " CONFIG_OPTION_FAIL_STOP " = true" NL
"" NL
"[" CONFIG_SECTION_REP_SHARING "]" NL
"### To conserve space, the filesystem can optionally avoid storing" NL
"### duplicate representations. This comes at a slight cost in" NL
"### performance, as maintaining a database of shared representations can" NL
"### increase commit times. The space savings are dependent upon the size" NL
"### of the repository, the number of objects it contains and the amount of" NL
"### duplication between them, usually a function of the branching and" NL
"### merging process." NL
"###" NL
"### The following parameter enables rep-sharing in the repository. It can" NL
"### be switched on and off at will, but for best space-saving results" NL
"### should be enabled consistently over the life of the repository." NL
"### 'svnadmin verify' will check the rep-cache regardless of this setting." NL
"### rep-sharing is enabled by default." NL
"# " CONFIG_OPTION_ENABLE_REP_SHARING " = true" NL
"" NL
"[" CONFIG_SECTION_DELTIFICATION "]" NL
"### To conserve space, the filesystem stores data as differences against" NL
"### existing representations. This comes at a slight cost in performance," NL
"### as calculating differences can increase commit times. Reading data" NL
"### will also create higher CPU load and the data will be fragmented." NL
"### Since deltification tends to save significant amounts of disk space," NL
"### the overall I/O load can actually be lower." NL
"###" NL
"### The options in this section allow for tuning the deltification" NL
"### strategy. Their effects on data size and server performance may vary" NL
"### from one repository to another. Versions prior to 1.8 will ignore" NL
"### this section." NL
"###" NL
"### The following parameter enables deltification for directories. It can" NL
"### be switched on and off at will, but for best space-saving results" NL
"### should be enabled consistently over the lifetime of the repository." NL
"### Repositories containing large directories will benefit greatly." NL
"### In rarely accessed repositories, the I/O overhead may be significant" NL
"### as caches will most likely be low." NL
"### directory deltification is enabled by default." NL
"# " CONFIG_OPTION_ENABLE_DIR_DELTIFICATION " = true" NL
"###" NL
"### The following parameter enables deltification for properties on files" NL
"### and directories. Overall, this is a minor tuning option but can save" NL
"### some disk space if you merge frequently or frequently change node" NL
"### properties. You should not activate this if rep-sharing has been" NL
"### disabled because this may result in a net increase in repository size." NL
"### property deltification is enabled by default." NL
"# " CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION " = true" NL
"###" NL
"### During commit, the server may need to walk the whole change history of" NL
"### of a given node to find a suitable deltification base. This linear" NL
"### process can impact commit times, svnadmin load and similar operations." NL
"### This setting limits the depth of the deltification history. If the" NL
"### threshold has been reached, the node will be stored as fulltext and a" NL
"### new deltification history begins." NL
"### Note, this is unrelated to svn log." NL
"### Very large values rarely provide significant additional savings but" NL
"### can impact performance greatly - in particular if directory" NL
"### deltification has been activated. Very small values may be useful in" NL
"### repositories that are dominated by large, changing binaries." NL
"### Should be a power of two minus 1. A value of 0 will effectively" NL
"### disable deltification." NL
"### For 1.8, the default value is 1023; earlier versions have no limit." NL
"# " CONFIG_OPTION_MAX_DELTIFICATION_WALK " = 1023" NL
"###" NL
"### The skip-delta scheme used by FSFS tends to repeatably store redundant" NL
"### delta information where a simple delta against the latest version is" NL
"### often smaller. By default, 1.8+ will therefore use skip deltas only" NL
"### after the linear chain of deltas has grown beyond the threshold" NL
"### specified by this setting." NL
"### Values up to 64 can result in some reduction in repository size for" NL
"### the cost of quickly increasing I/O and CPU costs. Similarly, smaller" NL
"### numbers can reduce those costs at the cost of more disk space. For" NL
"### rarely read repositories or those containing larger binaries, this may" NL
"### present a better trade-off." NL
"### Should be a power of two. A value of 1 or smaller will cause the" NL
"### exclusive use of skip-deltas (as in pre-1.8)." NL
"### For 1.8, the default value is 16; earlier versions use 1." NL
"# " CONFIG_OPTION_MAX_LINEAR_DELTIFICATION " = 16" NL
"###" NL
"### After deltification, we compress the data through zlib to minimize on-" NL
"### disk size. That can be an expensive and ineffective process. This" NL
"### setting controls the usage of zlib in future revisions." NL
"### Revisions with highly compressible data in them may shrink in size" NL
"### if the setting is increased but may take much longer to commit. The" NL
"### time taken to uncompress that data again is widely independent of the" NL
"### compression level." NL
"### Compression will be ineffective if the incoming content is already" NL
"### highly compressed. In that case, disabling the compression entirely" NL
"### will speed up commits as well as reading the data. Repositories with" NL
"### many small compressible files (source code) but also a high percentage" NL
"### of large incompressible ones (artwork) may benefit from compression" NL
"### levels lowered to e.g. 1." NL
"### Valid values are 0 to 9 with 9 providing the highest compression ratio" NL
"### and 0 disabling it altogether." NL
"### The default value is 5." NL
"# " CONFIG_OPTION_COMPRESSION_LEVEL " = 5" NL
"" NL
"[" CONFIG_SECTION_PACKED_REVPROPS "]" NL
"### This parameter controls the size (in kBytes) of packed revprop files." NL
"### Revprops of consecutive revisions will be concatenated into a single" NL
"### file up to but not exceeding the threshold given here. However, each" NL
"### pack file may be much smaller and revprops of a single revision may be" NL
"### much larger than the limit set here. The threshold will be applied" NL
"### before optional compression takes place." NL
"### Large values will reduce disk space usage at the expense of increased" NL
"### latency and CPU usage reading and changing individual revprops." NL
"### Values smaller than 4 kByte will not improve latency any further and " NL
"### quickly render revprop packing ineffective." NL
"### revprop-pack-size is 4 kBytes by default for non-compressed revprop" NL
"### pack files and 16 kBytes when compression has been enabled." NL
"# " CONFIG_OPTION_REVPROP_PACK_SIZE " = 4" NL
"###" NL
"### To save disk space, packed revprop files may be compressed. Standard" NL
"### revprops tend to allow for very effective compression. Reading and" NL
"### even more so writing, become significantly more CPU intensive." NL
"### Compressing packed revprops is disabled by default." NL
"# " CONFIG_OPTION_COMPRESS_PACKED_REVPROPS " = false" NL
"" NL
"[" CONFIG_SECTION_IO "]" NL
"### Parameters in this section control the data access granularity in" NL
"### format 7 repositories and later. The defaults should translate into" NL
"### decent performance over a wide range of setups." NL
"###" NL
"### When a specific piece of information needs to be read from disk, a" NL
"### data block is being read at once and its contents are being cached." NL
"### If the repository is being stored on a RAID, the block size should be" NL
"### either 50% or 100% of RAID block size / granularity. Also, your file" NL
"### system blocks/clusters should be properly aligned and sized. In that" NL
"### setup, each access will hit only one disk (minimizes I/O load) but" NL
"### uses all the data provided by the disk in a single access." NL
"### For SSD-based storage systems, slightly lower values around 16 kB" NL
"### may improve latency while still maximizing throughput. If block-read" NL
"### has not been enabled, this will be capped to 4 kBytes." NL
"### Can be changed at any time but must be a power of 2." NL
"### block-size is given in kBytes and with a default of 64 kBytes." NL
"# " CONFIG_OPTION_BLOCK_SIZE " = 64" NL
"###" NL
"### The log-to-phys index maps data item numbers to offsets within the" NL
"### rev or pack file. This index is organized in pages of a fixed maximum" NL
"### capacity. To access an item, the page table and the respective page" NL
"### must be read." NL
"### This parameter only affects revisions with thousands of changed paths." NL
"### If you have several extremely large revisions (~1 mio changes), think" NL
"### about increasing this setting. Reducing the value will rarely result" NL
"### in a net speedup." NL
"### This is an expert setting. Must be a power of 2." NL
"### l2p-page-size is 8192 entries by default." NL
"# " CONFIG_OPTION_L2P_PAGE_SIZE " = 8192" NL
"###" NL
"### The phys-to-log index maps positions within the rev or pack file to" NL
"### to data items, i.e. describes what piece of information is being" NL
"### stored at any particular offset. The index describes the rev file" NL
"### in chunks (pages) and keeps a global list of all those pages. Large" NL
"### pages mean a shorter page table but a larger per-page description of" NL
"### data items in it. The latency sweetspot depends on the change size" NL
"### distribution but covers a relatively wide range." NL
"### If the repository contains very large files, i.e. individual changes" NL
"### of tens of MB each, increasing the page size will shorten the index" NL
"### file at the expense of a slightly increased latency in sections with" NL
"### smaller changes." NL
"### For source code repositories, this should be about 16x the block-size." NL
"### Must be a power of 2." NL
"### p2l-page-size is given in kBytes and with a default of 1024 kBytes." NL
"# " CONFIG_OPTION_P2L_PAGE_SIZE " = 1024" NL
;
#undef NL
return svn_io_file_create(svn_dirent_join(fs->path, PATH_CONFIG, pool),
fsfs_conf_contents, pool);
}
/* Read / Evaluate the global configuration in FS->CONFIG to set up
* parameters in FS. */
static svn_error_t *
read_global_config(svn_fs_t *fs)
{
fs_fs_data_t *ffd = fs->fsap_data;
/* Providing a config hash is optional. */
if (fs->config)
ffd->use_block_read = svn_hash__get_bool(fs->config,
SVN_FS_CONFIG_FSFS_BLOCK_READ,
FALSE);
else
ffd->use_block_read = FALSE;
/* Ignore the user-specified larger block size if we don't use block-read.
Defaulting to 4k gives us the same access granularity in format 7 as in
older formats. */
if (!ffd->use_block_read)
ffd->block_size = MIN(0x1000, ffd->block_size);
return SVN_NO_ERROR;
}
/* Read FS's UUID file and store the data in the FS struct. */
static svn_error_t *
read_uuid(svn_fs_t *fs,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
apr_file_t *uuid_file;
char buf[APR_UUID_FORMATTED_LENGTH + 2];
apr_size_t limit;
/* Read the repository uuid. */
SVN_ERR(svn_io_file_open(&uuid_file, path_uuid(fs, scratch_pool),
APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
scratch_pool));
limit = sizeof(buf);
SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit, scratch_pool));
fs->uuid = apr_pstrdup(fs->pool, buf);
/* Read the instance ID. */
if (ffd->format >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT)
{
limit = sizeof(buf);
SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit,
scratch_pool));
ffd->instance_id = apr_pstrdup(fs->pool, buf);
}
else
{
ffd->instance_id = fs->uuid;
}
SVN_ERR(svn_io_file_close(uuid_file, scratch_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__read_format_file(svn_fs_t *fs, apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
int format, max_files_per_dir;
svn_boolean_t use_log_addressing;
/* Read info from format file. */
SVN_ERR(read_format(&format, &max_files_per_dir, &use_log_addressing,
path_format(fs, scratch_pool), scratch_pool));
/* Now that we've got *all* info, store / update values in FFD. */
ffd->format = format;
ffd->max_files_per_dir = max_files_per_dir;
ffd->use_log_addressing = use_log_addressing;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__open(svn_fs_t *fs, const char *path, apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
fs->path = apr_pstrdup(fs->pool, path);
/* Read the FS format file. */
SVN_ERR(svn_fs_fs__read_format_file(fs, pool));
/* Read in and cache the repository uuid. */
SVN_ERR(read_uuid(fs, pool));
/* Read the min unpacked revision. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, pool));
/* Read the configuration file. */
SVN_ERR(read_config(ffd, fs->path, fs->pool, pool));
/* Global configuration options. */
SVN_ERR(read_global_config(fs));
return get_youngest(&(ffd->youngest_rev_cache), fs, pool);
}
/* Wrapper around svn_io_file_create which ignores EEXIST. */
static svn_error_t *
create_file_ignore_eexist(const char *file,
const char *contents,
apr_pool_t *pool)
{
svn_error_t *err = svn_io_file_create(file, contents, pool);
if (err && APR_STATUS_IS_EEXIST(err->apr_err))
{
svn_error_clear(err);
err = SVN_NO_ERROR;
}
return svn_error_trace(err);
}
/* Baton type bridging svn_fs_fs__upgrade and upgrade_body carrying
* parameters over between them. */
struct upgrade_baton_t
{
svn_fs_t *fs;
svn_fs_upgrade_notify_t notify_func;
void *notify_baton;
svn_cancel_func_t cancel_func;
void *cancel_baton;
};
static svn_error_t *
upgrade_body(void *baton, apr_pool_t *pool)
{
struct upgrade_baton_t *upgrade_baton = baton;
svn_fs_t *fs = upgrade_baton->fs;
fs_fs_data_t *ffd = fs->fsap_data;
int format, max_files_per_dir;
svn_boolean_t use_log_addressing;
const char *format_path = path_format(fs, pool);
svn_node_kind_t kind;
svn_boolean_t needs_revprop_shard_cleanup = FALSE;
/* Read the FS format number and max-files-per-dir setting. */
SVN_ERR(read_format(&format, &max_files_per_dir, &use_log_addressing,
format_path, pool));
/* If the config file does not exist, create one. */
SVN_ERR(svn_io_check_path(svn_dirent_join(fs->path, PATH_CONFIG, pool),
&kind, pool));
switch (kind)
{
case svn_node_none:
SVN_ERR(write_config(fs, pool));
break;
case svn_node_file:
break;
default:
return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
_("'%s' is not a regular file."
" Please move it out of "
"the way and try again"),
svn_dirent_join(fs->path, PATH_CONFIG, pool));
}
/* If we're already up-to-date, there's nothing else to be done here. */
if (format == SVN_FS_FS__FORMAT_NUMBER)
return SVN_NO_ERROR;
/* If our filesystem predates the existence of the 'txn-current
file', make that file and its corresponding lock file. */
if (format < SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
{
SVN_ERR(create_file_ignore_eexist(
svn_fs_fs__path_txn_current(fs, pool), "0\n",
pool));
SVN_ERR(create_file_ignore_eexist(
svn_fs_fs__path_txn_current_lock(fs, pool), "",
pool));
}
/* If our filesystem predates the existence of the 'txn-protorevs'
dir, make that directory. */
if (format < SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
{
SVN_ERR(svn_io_make_dir_recursively(
svn_fs_fs__path_txn_proto_revs(fs, pool), pool));
}
/* If our filesystem is new enough, write the min unpacked rev file. */
if (format < SVN_FS_FS__MIN_PACKED_FORMAT)
SVN_ERR(svn_io_file_create(svn_fs_fs__path_min_unpacked_rev(fs, pool),
"0\n", pool));
/* If the file system supports revision packing but not revprop packing
*and* the FS has been sharded, pack the revprops up to the point that
revision data has been packed. However, keep the non-packed revprop
files around until after the format bump */
if ( format >= SVN_FS_FS__MIN_PACKED_FORMAT
&& format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT
&& max_files_per_dir > 0)
{
needs_revprop_shard_cleanup = TRUE;
SVN_ERR(svn_fs_fs__upgrade_pack_revprops(fs,
upgrade_baton->notify_func,
upgrade_baton->notify_baton,
upgrade_baton->cancel_func,
upgrade_baton->cancel_baton,
pool));
}
/* We will need the UUID info shortly ...
Read it before the format bump as the UUID file still uses the old
format. */
SVN_ERR(read_uuid(fs, pool));
/* Update the format info in the FS struct. Upgrade steps further
down will use the format from FS to create missing info. */
ffd->format = SVN_FS_FS__FORMAT_NUMBER;
ffd->max_files_per_dir = max_files_per_dir;
ffd->use_log_addressing = use_log_addressing;
/* Always add / bump the instance ID such that no form of caching
accidentally uses outdated information. Keep the UUID. */
SVN_ERR(svn_fs_fs__set_uuid(fs, fs->uuid, NULL, pool));
/* Bump the format file. */
SVN_ERR(svn_fs_fs__write_format(fs, TRUE, pool));
if (upgrade_baton->notify_func)
SVN_ERR(upgrade_baton->notify_func(upgrade_baton->notify_baton,
SVN_FS_FS__FORMAT_NUMBER,
svn_fs_upgrade_format_bumped,
pool));
/* Now, it is safe to remove the redundant revprop files. */
if (needs_revprop_shard_cleanup)
SVN_ERR(svn_fs_fs__upgrade_cleanup_pack_revprops(fs,
upgrade_baton->notify_func,
upgrade_baton->notify_baton,
upgrade_baton->cancel_func,
upgrade_baton->cancel_baton,
pool));
/* Done */
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__upgrade(svn_fs_t *fs,
svn_fs_upgrade_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
struct upgrade_baton_t baton;
baton.fs = fs;
baton.notify_func = notify_func;
baton.notify_baton = notify_baton;
baton.cancel_func = cancel_func;
baton.cancel_baton = cancel_baton;
return svn_fs_fs__with_all_locks(fs, upgrade_body, (void *)&baton, pool);
}
/* Find the youngest revision in a repository at path FS_PATH and
return it in *YOUNGEST_P. Perform temporary allocations in
POOL. */
static svn_error_t *
get_youngest(svn_revnum_t *youngest_p,
svn_fs_t *fs,
apr_pool_t *pool)
{
apr_uint64_t dummy;
SVN_ERR(svn_fs_fs__read_current(youngest_p, &dummy, &dummy, fs, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__youngest_rev(svn_revnum_t *youngest_p,
svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
SVN_ERR(get_youngest(youngest_p, fs, pool));
ffd->youngest_rev_cache = *youngest_p;
return SVN_NO_ERROR;
}
int
svn_fs_fs__shard_size(svn_fs_t *fs)
{
fs_fs_data_t *ffd = fs->fsap_data;
return ffd->max_files_per_dir;
}
svn_error_t *
svn_fs_fs__min_unpacked_rev(svn_revnum_t *min_unpacked,
svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, pool));
*min_unpacked = ffd->min_unpacked_rev;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__ensure_revision_exists(svn_revnum_t rev,
svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
if (! SVN_IS_VALID_REVNUM(rev))
return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
_("Invalid revision number '%ld'"), rev);
/* Did the revision exist the last time we checked the current
file? */
if (rev <= ffd->youngest_rev_cache)
return SVN_NO_ERROR;
SVN_ERR(get_youngest(&(ffd->youngest_rev_cache), fs, pool));
/* Check again. */
if (rev <= ffd->youngest_rev_cache)
return SVN_NO_ERROR;
return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
_("No such revision %ld"), rev);
}
svn_error_t *
svn_fs_fs__file_length(svn_filesize_t *length,
node_revision_t *noderev,
apr_pool_t *pool)
{
representation_t *data_rep = noderev->data_rep;
if (!data_rep)
{
/* Treat "no representation" as "empty file". */
*length = 0;
}
else if (data_rep->expanded_size)
{
/* Standard case: a non-empty file. */
*length = data_rep->expanded_size;
}
else
{
/* Work around a FSFS format quirk (see issue #4554).
A plain representation may specify its EXPANDED LENGTH as "0"
in which case, the SIZE value is what we want.
Because EXPANDED_LENGTH will also be 0 for empty files, while
SIZE is non-null, we need to check wether the content is
actually empty. We simply compare with the MD5 checksum of
empty content (sha-1 is not always available).
*/
svn_checksum_t *empty_md5
= svn_checksum_empty_checksum(svn_checksum_md5, pool);
if (memcmp(empty_md5->digest, data_rep->md5_digest,
sizeof(data_rep->md5_digest)))
{
/* Contents is not empty, i.e. EXPANDED_LENGTH cannot be the
actual file length. */
*length = data_rep->size;
}
else
{
/* Contents is empty. */
*length = 0;
}
}
return SVN_NO_ERROR;
}
svn_boolean_t
svn_fs_fs__noderev_same_rep_key(representation_t *a,
representation_t *b)
{
if (a == b)
return TRUE;
if (a == NULL || b == NULL)
return FALSE;
if (a->item_index != b->item_index)
return FALSE;
if (a->revision != b->revision)
return FALSE;
return memcmp(&a->uniquifier, &b->uniquifier, sizeof(a->uniquifier)) == 0;
}
svn_error_t *
svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
svn_fs_t *fs,
node_revision_t *a,
node_revision_t *b,
apr_pool_t *scratch_pool)
{
svn_stream_t *contents_a, *contents_b;
representation_t *rep_a = a->data_rep;
representation_t *rep_b = b->data_rep;
svn_boolean_t a_empty = !rep_a;
svn_boolean_t b_empty = !rep_b;
/* This makes sure that neither rep will be NULL later on */
if (a_empty && b_empty)
{
*equal = TRUE;
return SVN_NO_ERROR;
}
/* Same path in same rev or txn? */
if (svn_fs_fs__id_eq(a->id, b->id))
{
*equal = TRUE;
return SVN_NO_ERROR;
}
/* Beware of the combination NULL rep and possibly empty rep.
* Due to EXPANDED_SIZE not being reliable, we can't easily detect empty
* reps. So, we can only take further shortcuts if both reps are given. */
if (!a_empty && !b_empty)
{
/* File text representations always know their checksums -
* even in a txn. */
if (memcmp(rep_a->md5_digest, rep_b->md5_digest,
sizeof(rep_a->md5_digest)))
{
*equal = FALSE;
return SVN_NO_ERROR;
}
/* Paranoia. Compare SHA1 checksums because that's the level of
confidence we require for e.g. the working copy. */
if (rep_a->has_sha1 && rep_b->has_sha1)
{
*equal = memcmp(rep_a->sha1_digest, rep_b->sha1_digest,
sizeof(rep_a->sha1_digest)) == 0;
return SVN_NO_ERROR;
}
}
SVN_ERR(svn_fs_fs__get_contents(&contents_a, fs, rep_a, TRUE,
scratch_pool));
SVN_ERR(svn_fs_fs__get_contents(&contents_b, fs, rep_b, TRUE,
scratch_pool));
SVN_ERR(svn_stream_contents_same2(equal, contents_a, contents_b,
scratch_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__prop_rep_equal(svn_boolean_t *equal,
svn_fs_t *fs,
node_revision_t *a,
node_revision_t *b,
apr_pool_t *scratch_pool)
{
representation_t *rep_a = a->prop_rep;
representation_t *rep_b = b->prop_rep;
apr_hash_t *proplist_a;
apr_hash_t *proplist_b;
/* Mainly for a==b==NULL */
if (rep_a == rep_b)
{
*equal = TRUE;
return SVN_NO_ERROR;
}
/* Committed property lists can be compared quickly */
if ( rep_a && rep_b
&& !svn_fs_fs__id_txn_used(&rep_a->txn_id)
&& !svn_fs_fs__id_txn_used(&rep_b->txn_id))
{
/* MD5 must be given. Having the same checksum is good enough for
accepting the prop lists as equal. */
*equal = memcmp(rep_a->md5_digest, rep_b->md5_digest,
sizeof(rep_a->md5_digest)) == 0;
return SVN_NO_ERROR;
}
/* Same path in same txn? */
if (svn_fs_fs__id_eq(a->id, b->id))
{
*equal = TRUE;
return SVN_NO_ERROR;
}
/* At least one of the reps has been modified in a txn.
Fetch and compare them. */
SVN_ERR(svn_fs_fs__get_proplist(&proplist_a, fs, a, scratch_pool));
SVN_ERR(svn_fs_fs__get_proplist(&proplist_b, fs, b, scratch_pool));
*equal = svn_fs__prop_lists_equal(proplist_a, proplist_b, scratch_pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__file_checksum(svn_checksum_t **checksum,
node_revision_t *noderev,
svn_checksum_kind_t kind,
apr_pool_t *pool)
{
*checksum = NULL;
if (noderev->data_rep)
{
svn_checksum_t temp;
temp.kind = kind;
switch(kind)
{
case svn_checksum_md5:
temp.digest = noderev->data_rep->md5_digest;
break;
case svn_checksum_sha1:
if (! noderev->data_rep->has_sha1)
return SVN_NO_ERROR;
temp.digest = noderev->data_rep->sha1_digest;
break;
default:
return SVN_NO_ERROR;
}
*checksum = svn_checksum_dup(&temp, pool);
}
return SVN_NO_ERROR;
}
representation_t *
svn_fs_fs__rep_copy(representation_t *rep,
apr_pool_t *pool)
{
if (rep == NULL)
return NULL;
return apr_pmemdup(pool, rep, sizeof(*rep));
}
/* Write out the zeroth revision for filesystem FS.
Perform temporary allocations in SCRATCH_POOL. */
static svn_error_t *
write_revision_zero(svn_fs_t *fs,
apr_pool_t *scratch_pool)
{
/* Use an explicit sub-pool to have full control over temp file lifetimes.
* Since we have it, use it for everything else as well. */
apr_pool_t *subpool = svn_pool_create(scratch_pool);
const char *path_revision_zero = svn_fs_fs__path_rev(fs, 0, subpool);
apr_hash_t *proplist;
svn_string_t date;
/* Write out a rev file for revision 0. */
if (svn_fs_fs__use_log_addressing(fs))
{
apr_array_header_t *index_entries;
svn_fs_fs__p2l_entry_t *entry;
svn_fs_fs__revision_file_t *rev_file;
const char *l2p_proto_index, *p2l_proto_index;
/* Write a skeleton r0 with no indexes. */
SVN_ERR(svn_io_file_create(path_revision_zero,
"PLAIN\nEND\nENDREP\n"
"id: 0.0.r0/2\n"
"type: dir\n"
"count: 0\n"
"text: 0 3 4 4 "
"2d2977d1c96f487abe4a1e202dd03b4e\n"
"cpath: /\n"
"\n\n", subpool));
/* Construct the index P2L contents: describe the 3 items we have.
Be sure to create them in on-disk order. */
index_entries = apr_array_make(subpool, 3, sizeof(entry));
entry = apr_pcalloc(subpool, sizeof(*entry));
entry->offset = 0;
entry->size = 17;
entry->type = SVN_FS_FS__ITEM_TYPE_DIR_REP;
entry->item.revision = 0;
entry->item.number = SVN_FS_FS__ITEM_INDEX_FIRST_USER;
APR_ARRAY_PUSH(index_entries, svn_fs_fs__p2l_entry_t *) = entry;
entry = apr_pcalloc(subpool, sizeof(*entry));
entry->offset = 17;
entry->size = 89;
entry->type = SVN_FS_FS__ITEM_TYPE_NODEREV;
entry->item.revision = 0;
entry->item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
APR_ARRAY_PUSH(index_entries, svn_fs_fs__p2l_entry_t *) = entry;
entry = apr_pcalloc(subpool, sizeof(*entry));
entry->offset = 106;
entry->size = 1;
entry->type = SVN_FS_FS__ITEM_TYPE_CHANGES;
entry->item.revision = 0;
entry->item.number = SVN_FS_FS__ITEM_INDEX_CHANGES;
APR_ARRAY_PUSH(index_entries, svn_fs_fs__p2l_entry_t *) = entry;
/* Now re-open r0, create proto-index files from our entries and
rewrite the index section of r0. */
SVN_ERR(svn_fs_fs__open_pack_or_rev_file_writable(&rev_file, fs, 0,
subpool, subpool));
SVN_ERR(svn_fs_fs__p2l_index_from_p2l_entries(&p2l_proto_index, fs,
rev_file, index_entries,
subpool, subpool));
SVN_ERR(svn_fs_fs__l2p_index_from_p2l_entries(&l2p_proto_index, fs,
index_entries,
subpool, subpool));
SVN_ERR(svn_fs_fs__add_index_data(fs, rev_file->file, l2p_proto_index,
p2l_proto_index, 0, subpool));
SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
}
else
SVN_ERR(svn_io_file_create(path_revision_zero,
"PLAIN\nEND\nENDREP\n"
"id: 0.0.r0/17\n"
"type: dir\n"
"count: 0\n"
"text: 0 0 4 4 "
"2d2977d1c96f487abe4a1e202dd03b4e\n"
"cpath: /\n"
"\n\n17 107\n", subpool));
SVN_ERR(svn_io_set_file_read_only(path_revision_zero, FALSE, subpool));
/* Set a date on revision 0. */
date.data = svn_time_to_cstring(apr_time_now(), subpool);
date.len = strlen(date.data);
proplist = apr_hash_make(subpool);
svn_hash_sets(proplist, SVN_PROP_REVISION_DATE, &date);
SVN_ERR(svn_fs_fs__set_revision_proplist(fs, 0, proplist, subpool));
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__create_file_tree(svn_fs_t *fs,
const char *path,
int format,
int shard_size,
svn_boolean_t use_log_addressing,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
fs->path = apr_pstrdup(fs->pool, path);
ffd->format = format;
/* Use an appropriate sharding mode if supported by the format. */
if (format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
ffd->max_files_per_dir = shard_size;
else
ffd->max_files_per_dir = 0;
/* Select the addressing mode depending on the format. */
if (format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
ffd->use_log_addressing = use_log_addressing;
else
ffd->use_log_addressing = FALSE;
/* Create the revision data directories. */
if (ffd->max_files_per_dir)
SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_rev_shard(fs, 0,
pool),
pool));
else
SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(path, PATH_REVS_DIR,
pool),
pool));
/* Create the revprops directory. */
if (ffd->max_files_per_dir)
SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_revprops_shard(fs, 0,
pool),
pool));
else
SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(path,
PATH_REVPROPS_DIR,
pool),
pool));
/* Create the transaction directory. */
SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_txns_dir(fs, pool),
pool));
/* Create the protorevs directory. */
if (format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_txn_proto_revs(fs,
pool),
pool));
/* Create the 'current' file. */
SVN_ERR(svn_io_file_create_empty(svn_fs_fs__path_current(fs, pool), pool));
SVN_ERR(svn_fs_fs__write_current(fs, 0, 1, 1, pool));
/* Create the 'uuid' file. */
SVN_ERR(svn_io_file_create_empty(svn_fs_fs__path_lock(fs, pool), pool));
SVN_ERR(svn_fs_fs__set_uuid(fs, NULL, NULL, pool));
/* Create the fsfs.conf file if supported. Older server versions would
simply ignore the file but that might result in a different behavior
than with the later releases. Also, hotcopy would ignore, i.e. not
copy, a fsfs.conf with old formats. */
if (ffd->format >= SVN_FS_FS__MIN_CONFIG_FILE)
SVN_ERR(write_config(fs, pool));
SVN_ERR(read_config(ffd, fs->path, fs->pool, pool));
/* Global configuration options. */
SVN_ERR(read_global_config(fs));
/* Add revision 0. */
SVN_ERR(write_revision_zero(fs, pool));
/* Create the min unpacked rev file. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
SVN_ERR(svn_io_file_create(svn_fs_fs__path_min_unpacked_rev(fs, pool),
"0\n", pool));
/* Create the txn-current file if the repository supports
the transaction sequence file. */
if (format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
{
SVN_ERR(svn_io_file_create(svn_fs_fs__path_txn_current(fs, pool),
"0\n", pool));
SVN_ERR(svn_io_file_create_empty(
svn_fs_fs__path_txn_current_lock(fs, pool),
pool));
}
ffd->youngest_rev_cache = 0;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__create(svn_fs_t *fs,
const char *path,
apr_pool_t *pool)
{
int format = SVN_FS_FS__FORMAT_NUMBER;
int shard_size = SVN_FS_FS_DEFAULT_MAX_FILES_PER_DIR;
svn_boolean_t log_addressing;
/* Process the given filesystem config. */
if (fs->config)
{
svn_version_t *compatible_version;
const char *shard_size_str;
SVN_ERR(svn_fs__compatible_version(&compatible_version, fs->config,
pool));
/* select format number */
switch(compatible_version->minor)
{
case 0: return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
_("FSFS is not compatible with Subversion prior to 1.1"));
case 1:
case 2:
case 3: format = 1;
break;
case 4: format = 2;
break;
case 5: format = 3;
break;
case 6:
case 7: format = 4;
break;
case 8: format = 6;
break;
default:format = SVN_FS_FS__FORMAT_NUMBER;
}
shard_size_str = svn_hash_gets(fs->config, SVN_FS_CONFIG_FSFS_SHARD_SIZE);
if (shard_size_str)
{
apr_int64_t val;
SVN_ERR(svn_cstring_strtoi64(&val, shard_size_str, 0,
APR_INT32_MAX, 10));
shard_size = (int) val;
}
}
log_addressing = svn_hash__get_bool(fs->config,
SVN_FS_CONFIG_FSFS_LOG_ADDRESSING,
TRUE);
/* Actual FS creation. */
SVN_ERR(svn_fs_fs__create_file_tree(fs, path, format, shard_size,
log_addressing, pool));
/* This filesystem is ready. Stamp it with a format number. */
SVN_ERR(svn_fs_fs__write_format(fs, FALSE, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__set_uuid(svn_fs_t *fs,
const char *uuid,
const char *instance_id,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
const char *uuid_path = path_uuid(fs, pool);
svn_stringbuf_t *contents = svn_stringbuf_create_empty(pool);
if (! uuid)
uuid = svn_uuid_generate(pool);
if (! instance_id)
instance_id = svn_uuid_generate(pool);
svn_stringbuf_appendcstr(contents, uuid);
svn_stringbuf_appendcstr(contents, "\n");
if (ffd->format >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT)
{
svn_stringbuf_appendcstr(contents, instance_id);
svn_stringbuf_appendcstr(contents, "\n");
}
/* We use the permissions of the 'current' file, because the 'uuid'
file does not exist during repository creation. */
SVN_ERR(svn_io_write_atomic(uuid_path, contents->data, contents->len,
svn_fs_fs__path_current(fs, pool) /* perms */,
pool));
fs->uuid = apr_pstrdup(fs->pool, uuid);
if (ffd->format >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT)
ffd->instance_id = apr_pstrdup(fs->pool, instance_id);
else
ffd->instance_id = fs->uuid;
return SVN_NO_ERROR;
}
/** Node origin lazy cache. */
/* If directory PATH does not exist, create it and give it the same
permissions as FS_path.*/
svn_error_t *
svn_fs_fs__ensure_dir_exists(const char *path,
const char *fs_path,
apr_pool_t *pool)
{
svn_error_t *err = svn_io_dir_make(path, APR_OS_DEFAULT, pool);
if (err && APR_STATUS_IS_EEXIST(err->apr_err))
{
svn_error_clear(err);
return SVN_NO_ERROR;
}
SVN_ERR(err);
/* We successfully created a new directory. Dup the permissions
from FS->path. */
return svn_io_copy_perms(fs_path, path, pool);
}
/* Set *NODE_ORIGINS to a hash mapping 'const char *' node IDs to
'svn_string_t *' node revision IDs. Use POOL for allocations. */
static svn_error_t *
get_node_origins_from_file(svn_fs_t *fs,
apr_hash_t **node_origins,
const char *node_origins_file,
apr_pool_t *pool)
{
apr_file_t *fd;
svn_error_t *err;
svn_stream_t *stream;
*node_origins = NULL;
err = svn_io_file_open(&fd, node_origins_file,
APR_READ, APR_OS_DEFAULT, pool);
if (err && APR_STATUS_IS_ENOENT(err->apr_err))
{
svn_error_clear(err);
return SVN_NO_ERROR;
}
SVN_ERR(err);
stream = svn_stream_from_aprfile2(fd, FALSE, pool);
*node_origins = apr_hash_make(pool);
err = svn_hash_read2(*node_origins, stream, SVN_HASH_TERMINATOR, pool);
if (err)
return svn_error_quick_wrapf(err, _("malformed node origin data in '%s'"),
node_origins_file);
return svn_stream_close(stream);
}
svn_error_t *
svn_fs_fs__get_node_origin(const svn_fs_id_t **origin_id,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *node_id,
apr_pool_t *pool)
{
apr_hash_t *node_origins;
*origin_id = NULL;
SVN_ERR(get_node_origins_from_file(fs, &node_origins,
svn_fs_fs__path_node_origin(fs, node_id,
pool),
pool));
if (node_origins)
{
char node_id_ptr[SVN_INT64_BUFFER_SIZE];
apr_size_t len = svn__ui64tobase36(node_id_ptr, node_id->number);
svn_string_t *origin_id_str
= apr_hash_get(node_origins, node_id_ptr, len);
if (origin_id_str)
SVN_ERR(svn_fs_fs__id_parse(origin_id,
apr_pstrdup(pool, origin_id_str->data),
pool));
}
return SVN_NO_ERROR;
}
/* Helper for svn_fs_fs__set_node_origin. Takes a NODE_ID/NODE_REV_ID
pair and adds it to the NODE_ORIGINS_PATH file. */
static svn_error_t *
set_node_origins_for_file(svn_fs_t *fs,
const char *node_origins_path,
const svn_fs_fs__id_part_t *node_id,
svn_string_t *node_rev_id,
apr_pool_t *pool)
{
const char *path_tmp;
svn_stream_t *stream;
apr_hash_t *origins_hash;
svn_string_t *old_node_rev_id;
/* the hash serialization functions require strings as keys */
char node_id_ptr[SVN_INT64_BUFFER_SIZE];
apr_size_t len = svn__ui64tobase36(node_id_ptr, node_id->number);
SVN_ERR(svn_fs_fs__ensure_dir_exists(svn_dirent_join(fs->path,
PATH_NODE_ORIGINS_DIR,
pool),
fs->path, pool));
/* Read the previously existing origins (if any), and merge our
update with it. */
SVN_ERR(get_node_origins_from_file(fs, &origins_hash,
node_origins_path, pool));
if (! origins_hash)
origins_hash = apr_hash_make(pool);
old_node_rev_id = apr_hash_get(origins_hash, node_id_ptr, len);
if (old_node_rev_id && !svn_string_compare(node_rev_id, old_node_rev_id))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Node origin for '%s' exists with a different "
"value (%s) than what we were about to store "
"(%s)"),
node_id_ptr, old_node_rev_id->data,
node_rev_id->data);
apr_hash_set(origins_hash, node_id_ptr, len, node_rev_id);
/* Sure, there's a race condition here. Two processes could be
trying to add different cache elements to the same file at the
same time, and the entries added by the first one to write will
be lost. But this is just a cache of reconstructible data, so
we'll accept this problem in return for not having to deal with
locking overhead. */
/* Create a temporary file, write out our hash, and close the file. */
SVN_ERR(svn_stream_open_unique(&stream, &path_tmp,
svn_dirent_dirname(node_origins_path, pool),
svn_io_file_del_none, pool, pool));
SVN_ERR(svn_hash_write2(origins_hash, stream, SVN_HASH_TERMINATOR, pool));
SVN_ERR(svn_stream_close(stream));
/* Rename the temp file as the real destination */
return svn_io_file_rename(path_tmp, node_origins_path, pool);
}
svn_error_t *
svn_fs_fs__set_node_origin(svn_fs_t *fs,
const svn_fs_fs__id_part_t *node_id,
const svn_fs_id_t *node_rev_id,
apr_pool_t *pool)
{
svn_error_t *err;
const char *filename = svn_fs_fs__path_node_origin(fs, node_id, pool);
err = set_node_origins_for_file(fs, filename,
node_id,
svn_fs_fs__id_unparse(node_rev_id, pool),
pool);
if (err && APR_STATUS_IS_EACCES(err->apr_err))
{
/* It's just a cache; stop trying if I can't write. */
svn_error_clear(err);
err = NULL;
}
return svn_error_trace(err);
}
/*** Revisions ***/
svn_error_t *
svn_fs_fs__revision_prop(svn_string_t **value_p,
svn_fs_t *fs,
svn_revnum_t rev,
const char *propname,
apr_pool_t *pool)
{
apr_hash_t *table;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
SVN_ERR(svn_fs_fs__get_revision_proplist(&table, fs, rev, pool));
*value_p = svn_hash_gets(table, propname);
return SVN_NO_ERROR;
}
/* Baton used for change_rev_prop_body below. */
struct change_rev_prop_baton {
svn_fs_t *fs;
svn_revnum_t rev;
const char *name;
const svn_string_t *const *old_value_p;
const svn_string_t *value;
};
/* The work-horse for svn_fs_fs__change_rev_prop, called with the FS
write lock. This implements the svn_fs_fs__with_write_lock()
'body' callback type. BATON is a 'struct change_rev_prop_baton *'. */
static svn_error_t *
change_rev_prop_body(void *baton, apr_pool_t *pool)
{
struct change_rev_prop_baton *cb = baton;
apr_hash_t *table;
SVN_ERR(svn_fs_fs__get_revision_proplist(&table, cb->fs, cb->rev, pool));
if (cb->old_value_p)
{
const svn_string_t *wanted_value = *cb->old_value_p;
const svn_string_t *present_value = svn_hash_gets(table, cb->name);
if ((!wanted_value != !present_value)
|| (wanted_value && present_value
&& !svn_string_compare(wanted_value, present_value)))
{
/* What we expected isn't what we found. */
return svn_error_createf(SVN_ERR_FS_PROP_BASEVALUE_MISMATCH, NULL,
_("revprop '%s' has unexpected value in "
"filesystem"),
cb->name);
}
/* Fall through. */
}
svn_hash_sets(table, cb->name, cb->value);
return svn_fs_fs__set_revision_proplist(cb->fs, cb->rev, table, pool);
}
svn_error_t *
svn_fs_fs__change_rev_prop(svn_fs_t *fs,
svn_revnum_t rev,
const char *name,
const svn_string_t *const *old_value_p,
const svn_string_t *value,
apr_pool_t *pool)
{
struct change_rev_prop_baton cb;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
cb.fs = fs;
cb.rev = rev;
cb.name = name;
cb.old_value_p = old_value_p;
cb.value = value;
return svn_fs_fs__with_write_lock(fs, change_rev_prop_body, &cb, pool);
}
svn_error_t *
svn_fs_fs__info_format(int *fs_format,
svn_version_t **supports_version,
svn_fs_t *fs,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
*fs_format = ffd->format;
*supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
(*supports_version)->major = SVN_VER_MAJOR;
(*supports_version)->minor = 1;
(*supports_version)->patch = 0;
(*supports_version)->tag = "";
switch (ffd->format)
{
case 1:
break;
case 2:
(*supports_version)->minor = 4;
break;
case 3:
(*supports_version)->minor = 5;
break;
case 4:
(*supports_version)->minor = 6;
break;
case 6:
(*supports_version)->minor = 8;
break;
case 7:
(*supports_version)->minor = 9;
break;
#ifdef SVN_DEBUG
# if SVN_FS_FS__FORMAT_NUMBER != 7
# error "Need to add a 'case' statement here"
# endif
#endif
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__info_config_files(apr_array_header_t **files,
svn_fs_t *fs,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
*files = apr_array_make(result_pool, 1, sizeof(const char *));
APR_ARRAY_PUSH(*files, const char *) = svn_dirent_join(fs->path, PATH_CONFIG,
result_pool);
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/low_level.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/low_level.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/low_level.c (revision 309511)
@@ -1,1196 +1,1208 @@
/* low_level.c --- low level r/w access to fs_fs file structures
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "svn_private_config.h"
#include "svn_hash.h"
#include "svn_pools.h"
#include "svn_sorts.h"
#include "private/svn_sorts_private.h"
#include "private/svn_string_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_fspath.h"
#include "../libsvn_fs/fs-loader.h"
#include "low_level.h"
/* Headers used to describe node-revision in the revision file. */
#define HEADER_ID "id"
#define HEADER_TYPE "type"
#define HEADER_COUNT "count"
#define HEADER_PROPS "props"
#define HEADER_TEXT "text"
#define HEADER_CPATH "cpath"
#define HEADER_PRED "pred"
#define HEADER_COPYFROM "copyfrom"
#define HEADER_COPYROOT "copyroot"
#define HEADER_FRESHTXNRT "is-fresh-txn-root"
#define HEADER_MINFO_HERE "minfo-here"
#define HEADER_MINFO_CNT "minfo-cnt"
/* Kinds that a change can be. */
#define ACTION_MODIFY "modify"
#define ACTION_ADD "add"
#define ACTION_DELETE "delete"
#define ACTION_REPLACE "replace"
#define ACTION_RESET "reset"
/* True and False flags. */
#define FLAG_TRUE "true"
#define FLAG_FALSE "false"
/* Kinds of representation. */
#define REP_PLAIN "PLAIN"
#define REP_DELTA "DELTA"
/* An arbitrary maximum path length, so clients can't run us out of memory
* by giving us arbitrarily large paths. */
#define FSFS_MAX_PATH_LEN 4096
/* The 256 is an arbitrary size large enough to hold the node id and the
* various flags. */
#define MAX_CHANGE_LINE_LEN FSFS_MAX_PATH_LEN + 256
/* Convert the C string in *TEXT to a revision number and return it in *REV.
* Overflows, negative values other than -1 and terminating characters other
* than 0x20 or 0x0 will cause an error. Set *TEXT to the first char after
* the initial separator or to EOS.
*/
static svn_error_t *
parse_revnum(svn_revnum_t *rev,
const char **text)
{
const char *string = *text;
if ((string[0] == '-') && (string[1] == '1'))
{
*rev = SVN_INVALID_REVNUM;
string += 2;
}
else
{
SVN_ERR(svn_revnum_parse(rev, string, &string));
}
if (*string == ' ')
++string;
else if (*string != '\0')
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid character in revision number"));
*text = string;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__parse_revision_trailer(apr_off_t *root_offset,
apr_off_t *changes_offset,
svn_stringbuf_t *trailer,
svn_revnum_t rev)
{
int i, num_bytes;
const char *str;
/* This cast should be safe since the maximum amount read, 64, will
never be bigger than the size of an int. */
num_bytes = (int) trailer->len;
/* The last byte should be a newline. */
if (trailer->len == 0 || trailer->data[trailer->len - 1] != '\n')
{
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Revision file (r%ld) lacks trailing newline"),
rev);
}
/* Look for the next previous newline. */
for (i = num_bytes - 2; i >= 0; i--)
{
if (trailer->data[i] == '\n')
break;
}
if (i < 0)
{
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Final line in revision file (r%ld) longer "
"than 64 characters"),
rev);
}
i++;
str = &trailer->data[i];
/* find the next space */
for ( ; i < (num_bytes - 2) ; i++)
if (trailer->data[i] == ' ')
break;
if (i == (num_bytes - 2))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Final line in revision file r%ld missing space"),
rev);
if (root_offset)
{
apr_int64_t val;
trailer->data[i] = '\0';
SVN_ERR(svn_cstring_atoi64(&val, str));
*root_offset = (apr_off_t)val;
}
i++;
str = &trailer->data[i];
/* find the next newline */
for ( ; i < num_bytes; i++)
if (trailer->data[i] == '\n')
break;
if (changes_offset)
{
apr_int64_t val;
trailer->data[i] = '\0';
SVN_ERR(svn_cstring_atoi64(&val, str));
*changes_offset = (apr_off_t)val;
}
return SVN_NO_ERROR;
}
svn_stringbuf_t *
svn_fs_fs__unparse_revision_trailer(apr_off_t root_offset,
apr_off_t changes_offset,
apr_pool_t *result_pool)
{
return svn_stringbuf_createf(result_pool,
"%" APR_OFF_T_FMT " %" APR_OFF_T_FMT "\n",
root_offset,
changes_offset);
}
svn_error_t *
svn_fs_fs__parse_footer(apr_off_t *l2p_offset,
svn_checksum_t **l2p_checksum,
apr_off_t *p2l_offset,
svn_checksum_t **p2l_checksum,
svn_stringbuf_t *footer,
svn_revnum_t rev,
apr_pool_t *result_pool)
{
apr_int64_t val;
char *last_str = footer->data;
/* Get the L2P offset. */
const char *str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid revision footer"));
SVN_ERR(svn_cstring_atoi64(&val, str));
*l2p_offset = (apr_off_t)val;
/* Get the L2P checksum. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid revision footer"));
SVN_ERR(svn_checksum_parse_hex(l2p_checksum, svn_checksum_md5, str,
result_pool));
/* Get the P2L offset. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid revision footer"));
SVN_ERR(svn_cstring_atoi64(&val, str));
*p2l_offset = (apr_off_t)val;
/* Get the P2L checksum. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid revision footer"));
SVN_ERR(svn_checksum_parse_hex(p2l_checksum, svn_checksum_md5, str,
result_pool));
return SVN_NO_ERROR;
}
svn_stringbuf_t *
svn_fs_fs__unparse_footer(apr_off_t l2p_offset,
svn_checksum_t *l2p_checksum,
apr_off_t p2l_offset,
svn_checksum_t *p2l_checksum,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
return svn_stringbuf_createf(result_pool,
"%" APR_OFF_T_FMT " %s %" APR_OFF_T_FMT " %s",
l2p_offset,
svn_checksum_to_cstring(l2p_checksum,
scratch_pool),
p2l_offset,
svn_checksum_to_cstring(p2l_checksum,
scratch_pool));
}
/* Read the next entry in the changes record from file FILE and store
the resulting change in *CHANGE_P. If there is no next record,
store NULL there. Perform all allocations from POOL. */
static svn_error_t *
read_change(change_t **change_p,
svn_stream_t *stream,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_stringbuf_t *line;
svn_boolean_t eof = TRUE;
change_t *change;
char *str, *last_str, *kind_str;
svn_fs_path_change2_t *info;
/* Default return value. */
*change_p = NULL;
SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
/* Check for a blank line. */
if (eof || (line->len == 0))
return SVN_NO_ERROR;
change = apr_pcalloc(result_pool, sizeof(*change));
info = &change->info;
last_str = line->data;
/* Get the node-id of the change. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
SVN_ERR(svn_fs_fs__id_parse(&info->node_rev_id, str, result_pool));
if (info->node_rev_id == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
/* Get the change type. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
/* Don't bother to check the format number before looking for
* node-kinds: just read them if you find them. */
info->node_kind = svn_node_unknown;
kind_str = strchr(str, '-');
if (kind_str)
{
/* Cap off the end of "str" (the action). */
*kind_str = '\0';
kind_str++;
if (strcmp(kind_str, SVN_FS_FS__KIND_FILE) == 0)
info->node_kind = svn_node_file;
else if (strcmp(kind_str, SVN_FS_FS__KIND_DIR) == 0)
info->node_kind = svn_node_dir;
else
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
}
if (strcmp(str, ACTION_MODIFY) == 0)
{
info->change_kind = svn_fs_path_change_modify;
}
else if (strcmp(str, ACTION_ADD) == 0)
{
info->change_kind = svn_fs_path_change_add;
}
else if (strcmp(str, ACTION_DELETE) == 0)
{
info->change_kind = svn_fs_path_change_delete;
}
else if (strcmp(str, ACTION_REPLACE) == 0)
{
info->change_kind = svn_fs_path_change_replace;
}
else if (strcmp(str, ACTION_RESET) == 0)
{
info->change_kind = svn_fs_path_change_reset;
}
else
{
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid change kind in rev file"));
}
/* Get the text-mod flag. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
if (strcmp(str, FLAG_TRUE) == 0)
{
info->text_mod = TRUE;
}
else if (strcmp(str, FLAG_FALSE) == 0)
{
info->text_mod = FALSE;
}
else
{
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid text-mod flag in rev-file"));
}
/* Get the prop-mod flag. */
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
if (strcmp(str, FLAG_TRUE) == 0)
{
info->prop_mod = TRUE;
}
else if (strcmp(str, FLAG_FALSE) == 0)
{
info->prop_mod = FALSE;
}
else
{
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid prop-mod flag in rev-file"));
}
/* Get the mergeinfo-mod flag if given. Otherwise, the next thing
is the path starting with a slash. Also, we must initialize the
flag explicitly because 0 is not valid for a svn_tristate_t. */
info->mergeinfo_mod = svn_tristate_unknown;
if (*last_str != '/')
{
str = svn_cstring_tokenize(" ", &last_str);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
if (strcmp(str, FLAG_TRUE) == 0)
{
info->mergeinfo_mod = svn_tristate_true;
}
else if (strcmp(str, FLAG_FALSE) == 0)
{
info->mergeinfo_mod = svn_tristate_false;
}
else
{
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid mergeinfo-mod flag in rev-file"));
}
}
/* Get the changed path. */
if (!svn_fspath__is_canonical(last_str))
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid path in changes line"));
change->path.len = strlen(last_str);
change->path.data = apr_pstrdup(result_pool, last_str);
/* Read the next line, the copyfrom line. */
SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
info->copyfrom_known = TRUE;
if (eof || line->len == 0)
{
info->copyfrom_rev = SVN_INVALID_REVNUM;
info->copyfrom_path = NULL;
}
else
{
last_str = line->data;
SVN_ERR(parse_revnum(&info->copyfrom_rev, (const char **)&last_str));
if (!svn_fspath__is_canonical(last_str))
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid copy-from path in changes line"));
info->copyfrom_path = apr_pstrdup(result_pool, last_str);
}
*change_p = change;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__read_changes(apr_array_header_t **changes,
svn_stream_t *stream,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
change_t *change;
apr_pool_t *iterpool;
/* Pre-allocate enough room for most change lists.
(will be auto-expanded as necessary).
Chose the default to just below 2^N such that the doubling reallocs
will request roughly 2^M bytes from the OS without exceeding the
respective two-power by just a few bytes (leaves room array and APR
node overhead for large enough M).
*/
*changes = apr_array_make(result_pool, 63, sizeof(change_t *));
SVN_ERR(read_change(&change, stream, result_pool, scratch_pool));
iterpool = svn_pool_create(scratch_pool);
while (change)
{
APR_ARRAY_PUSH(*changes, change_t*) = change;
SVN_ERR(read_change(&change, stream, result_pool, iterpool));
svn_pool_clear(iterpool);
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__read_changes_incrementally(svn_stream_t *stream,
svn_fs_fs__change_receiver_t
change_receiver,
void *change_receiver_baton,
apr_pool_t *scratch_pool)
{
change_t *change;
apr_pool_t *iterpool;
iterpool = svn_pool_create(scratch_pool);
do
{
svn_pool_clear(iterpool);
SVN_ERR(read_change(&change, stream, iterpool, iterpool));
if (change)
SVN_ERR(change_receiver(change_receiver_baton, change, iterpool));
}
while (change);
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Write a single change entry, path PATH, change CHANGE, to STREAM.
Only include the node kind field if INCLUDE_NODE_KIND is true. Only
include the mergeinfo-mod field if INCLUDE_MERGEINFO_MODS is true.
All temporary allocations are in SCRATCH_POOL. */
static svn_error_t *
write_change_entry(svn_stream_t *stream,
const char *path,
svn_fs_path_change2_t *change,
svn_boolean_t include_node_kind,
svn_boolean_t include_mergeinfo_mods,
apr_pool_t *scratch_pool)
{
const char *idstr;
const char *change_string = NULL;
const char *kind_string = "";
const char *mergeinfo_string = "";
svn_stringbuf_t *buf;
apr_size_t len;
switch (change->change_kind)
{
case svn_fs_path_change_modify:
change_string = ACTION_MODIFY;
break;
case svn_fs_path_change_add:
change_string = ACTION_ADD;
break;
case svn_fs_path_change_delete:
change_string = ACTION_DELETE;
break;
case svn_fs_path_change_replace:
change_string = ACTION_REPLACE;
break;
case svn_fs_path_change_reset:
change_string = ACTION_RESET;
break;
default:
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid change type %d"),
change->change_kind);
}
if (change->node_rev_id)
idstr = svn_fs_fs__id_unparse(change->node_rev_id, scratch_pool)->data;
else
idstr = ACTION_RESET;
if (include_node_kind)
{
SVN_ERR_ASSERT(change->node_kind == svn_node_dir
|| change->node_kind == svn_node_file);
kind_string = apr_psprintf(scratch_pool, "-%s",
change->node_kind == svn_node_dir
? SVN_FS_FS__KIND_DIR
: SVN_FS_FS__KIND_FILE);
}
if (include_mergeinfo_mods && change->mergeinfo_mod != svn_tristate_unknown)
mergeinfo_string = apr_psprintf(scratch_pool, " %s",
change->mergeinfo_mod == svn_tristate_true
? FLAG_TRUE
: FLAG_FALSE);
buf = svn_stringbuf_createf(scratch_pool, "%s %s%s %s %s%s %s\n",
idstr, change_string, kind_string,
change->text_mod ? FLAG_TRUE : FLAG_FALSE,
change->prop_mod ? FLAG_TRUE : FLAG_FALSE,
mergeinfo_string,
path);
if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
{
svn_stringbuf_appendcstr(buf, apr_psprintf(scratch_pool, "%ld %s",
change->copyfrom_rev,
change->copyfrom_path));
}
svn_stringbuf_appendbyte(buf, '\n');
/* Write all change info in one write call. */
len = buf->len;
return svn_error_trace(svn_stream_write(stream, buf->data, &len));
}
svn_error_t *
svn_fs_fs__write_changes(svn_stream_t *stream,
svn_fs_t *fs,
apr_hash_t *changes,
svn_boolean_t terminate_list,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
fs_fs_data_t *ffd = fs->fsap_data;
svn_boolean_t include_node_kinds =
ffd->format >= SVN_FS_FS__MIN_KIND_IN_CHANGED_FORMAT;
svn_boolean_t include_mergeinfo_mods =
ffd->format >= SVN_FS_FS__MIN_MERGEINFO_IN_CHANGED_FORMAT;
apr_array_header_t *sorted_changed_paths;
int i;
/* For the sake of the repository administrator sort the changes so
that the final file is deterministic and repeatable, however the
rest of the FSFS code doesn't require any particular order here.
Also, this sorting is only effective in writing all entries with
a single call as write_final_changed_path_info() does. For the
list being written incrementally during transaction, we actually
*must not* change the order of entries from different calls.
*/
sorted_changed_paths = svn_sort__hash(changes,
svn_sort_compare_items_lexically,
scratch_pool);
/* Write all items to disk in the new order. */
for (i = 0; i < sorted_changed_paths->nelts; ++i)
{
svn_fs_path_change2_t *change;
const char *path;
svn_pool_clear(iterpool);
change = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).value;
path = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).key;
/* Write out the new entry into the final rev-file. */
SVN_ERR(write_change_entry(stream, path, change, include_node_kinds,
include_mergeinfo_mods, iterpool));
}
if (terminate_list)
svn_stream_puts(stream, "\n");
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Given a revision file FILE that has been pre-positioned at the
beginning of a Node-Rev header block, read in that header block and
store it in the apr_hash_t HEADERS. All allocations will be from
RESULT_POOL. */
static svn_error_t *
read_header_block(apr_hash_t **headers,
svn_stream_t *stream,
apr_pool_t *result_pool)
{
*headers = svn_hash__make(result_pool);
while (1)
{
svn_stringbuf_t *header_str;
const char *name, *value;
apr_size_t i = 0;
apr_size_t name_len;
svn_boolean_t eof;
SVN_ERR(svn_stream_readline(stream, &header_str, "\n", &eof,
result_pool));
if (eof || header_str->len == 0)
break; /* end of header block */
while (header_str->data[i] != ':')
{
if (header_str->data[i] == '\0')
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Found malformed header '%s' in "
"revision file"),
header_str->data);
i++;
}
/* Create a 'name' string and point to it. */
header_str->data[i] = '\0';
name = header_str->data;
name_len = i;
/* Check if we have enough data to parse. */
if (i + 2 > header_str->len)
{
/* Restore the original line for the error. */
header_str->data[i] = ':';
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Found malformed header '%s' in "
"revision file"),
header_str->data);
}
/* Skip over the NULL byte and the space following it. */
i += 2;
value = header_str->data + i;
/* header_str is safely in our pool, so we can use bits of it as
key and value. */
apr_hash_set(*headers, name, name_len, value);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__parse_representation(representation_t **rep_p,
svn_stringbuf_t *text,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
representation_t *rep;
char *str;
apr_int64_t val;
char *string = text->data;
svn_checksum_t *checksum;
const char *end;
rep = apr_pcalloc(result_pool, sizeof(*rep));
*rep_p = rep;
SVN_ERR(parse_revnum(&rep->revision, (const char **)&string));
/* initialize transaction info (never stored) */
svn_fs_fs__id_txn_reset(&rep->txn_id);
/* while in transactions, it is legal to simply write "-1" */
str = svn_cstring_tokenize(" ", &string);
if (str == NULL)
{
if (rep->revision == SVN_INVALID_REVNUM)
return SVN_NO_ERROR;
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
}
SVN_ERR(svn_cstring_atoi64(&val, str));
rep->item_index = (apr_uint64_t)val;
str = svn_cstring_tokenize(" ", &string);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
SVN_ERR(svn_cstring_atoi64(&val, str));
rep->size = (svn_filesize_t)val;
str = svn_cstring_tokenize(" ", &string);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
SVN_ERR(svn_cstring_atoi64(&val, str));
rep->expanded_size = (svn_filesize_t)val;
/* Read in the MD5 hash. */
str = svn_cstring_tokenize(" ", &string);
if ((str == NULL) || (strlen(str) != (APR_MD5_DIGESTSIZE * 2)))
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_md5, str,
scratch_pool));
- memcpy(rep->md5_digest, checksum->digest, sizeof(rep->md5_digest));
+ /* If STR is a all-zero checksum, CHECKSUM will be NULL and REP already
+ contains the correct value. */
+ if (checksum)
+ memcpy(rep->md5_digest, checksum->digest, sizeof(rep->md5_digest));
+
/* The remaining fields are only used for formats >= 4, so check that. */
str = svn_cstring_tokenize(" ", &string);
if (str == NULL)
return SVN_NO_ERROR;
/* Read the SHA1 hash. */
if (strlen(str) != (APR_SHA1_DIGESTSIZE * 2))
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1, str,
scratch_pool));
+
+ /* We do have a valid SHA1 but it might be all 0.
+ We cannot be sure where that came from (Alas! legacy), so let's not
+ claim we know the SHA1 in that case. */
rep->has_sha1 = checksum != NULL;
- memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
+
+ /* If STR is a all-zero checksum, CHECKSUM will be NULL and REP already
+ contains the correct value. */
+ if (checksum)
+ memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
/* Read the uniquifier. */
str = svn_cstring_tokenize("/", &string);
if (str == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
SVN_ERR(svn_fs_fs__id_txn_parse(&rep->uniquifier.noderev_txn_id, str));
str = svn_cstring_tokenize(" ", &string);
if (str == NULL || *str != '_')
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
++str;
rep->uniquifier.number = svn__base36toui64(&end, str);
if (*end)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed text representation offset line in node-rev"));
return SVN_NO_ERROR;
}
/* Wrap svn_fs_fs__parse_representation(), extracting its TXN_ID from our
NODEREV_ID, and adding an error message. */
static svn_error_t *
read_rep_offsets(representation_t **rep_p,
char *string,
const svn_fs_id_t *noderev_id,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_error_t *err
= svn_fs_fs__parse_representation(rep_p,
svn_stringbuf_create_wrap(string,
scratch_pool),
result_pool,
scratch_pool);
if (err)
{
const svn_string_t *id_unparsed;
const char *where;
id_unparsed = svn_fs_fs__id_unparse(noderev_id, scratch_pool);
where = apr_psprintf(scratch_pool,
_("While reading representation offsets "
"for node-revision '%s':"),
noderev_id ? id_unparsed->data : "(null)");
return svn_error_quick_wrap(err, where);
}
if ((*rep_p)->revision == SVN_INVALID_REVNUM)
if (noderev_id)
(*rep_p)->txn_id = *svn_fs_fs__id_txn_id(noderev_id);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__read_noderev(node_revision_t **noderev_p,
svn_stream_t *stream,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_hash_t *headers;
node_revision_t *noderev;
char *value;
const char *noderev_id;
SVN_ERR(read_header_block(&headers, stream, scratch_pool));
noderev = apr_pcalloc(result_pool, sizeof(*noderev));
/* Read the node-rev id. */
value = svn_hash_gets(headers, HEADER_ID);
if (value == NULL)
/* ### More information: filename/offset coordinates */
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Missing id field in node-rev"));
SVN_ERR(svn_stream_close(stream));
SVN_ERR(svn_fs_fs__id_parse(&noderev->id, value, result_pool));
noderev_id = value; /* for error messages later */
/* Read the type. */
value = svn_hash_gets(headers, HEADER_TYPE);
if ((value == NULL) ||
( strcmp(value, SVN_FS_FS__KIND_FILE)
&& strcmp(value, SVN_FS_FS__KIND_DIR)))
/* ### s/kind/type/ */
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Missing kind field in node-rev '%s'"),
noderev_id);
noderev->kind = (strcmp(value, SVN_FS_FS__KIND_FILE) == 0)
? svn_node_file
: svn_node_dir;
/* Read the 'count' field. */
value = svn_hash_gets(headers, HEADER_COUNT);
if (value)
SVN_ERR(svn_cstring_atoi(&noderev->predecessor_count, value));
else
noderev->predecessor_count = 0;
/* Get the properties location. */
value = svn_hash_gets(headers, HEADER_PROPS);
if (value)
{
SVN_ERR(read_rep_offsets(&noderev->prop_rep, value,
noderev->id, result_pool, scratch_pool));
}
/* Get the data location. */
value = svn_hash_gets(headers, HEADER_TEXT);
if (value)
{
SVN_ERR(read_rep_offsets(&noderev->data_rep, value,
noderev->id, result_pool, scratch_pool));
}
/* Get the created path. */
value = svn_hash_gets(headers, HEADER_CPATH);
if (value == NULL)
{
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Missing cpath field in node-rev '%s'"),
noderev_id);
}
else
{
if (!svn_fspath__is_canonical(value))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Non-canonical cpath field in node-rev '%s'"),
noderev_id);
noderev->created_path = apr_pstrdup(result_pool, value);
}
/* Get the predecessor ID. */
value = svn_hash_gets(headers, HEADER_PRED);
if (value)
SVN_ERR(svn_fs_fs__id_parse(&noderev->predecessor_id, value,
result_pool));
/* Get the copyroot. */
value = svn_hash_gets(headers, HEADER_COPYROOT);
if (value == NULL)
{
noderev->copyroot_path = apr_pstrdup(result_pool, noderev->created_path);
noderev->copyroot_rev = svn_fs_fs__id_rev(noderev->id);
}
else
{
SVN_ERR(parse_revnum(&noderev->copyroot_rev, (const char **)&value));
if (!svn_fspath__is_canonical(value))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed copyroot line in node-rev '%s'"),
noderev_id);
noderev->copyroot_path = apr_pstrdup(result_pool, value);
}
/* Get the copyfrom. */
value = svn_hash_gets(headers, HEADER_COPYFROM);
if (value == NULL)
{
noderev->copyfrom_path = NULL;
noderev->copyfrom_rev = SVN_INVALID_REVNUM;
}
else
{
SVN_ERR(parse_revnum(&noderev->copyfrom_rev, (const char **)&value));
if (*value == 0)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed copyfrom line in node-rev '%s'"),
noderev_id);
noderev->copyfrom_path = apr_pstrdup(result_pool, value);
}
/* Get whether this is a fresh txn root. */
value = svn_hash_gets(headers, HEADER_FRESHTXNRT);
noderev->is_fresh_txn_root = (value != NULL);
/* Get the mergeinfo count. */
value = svn_hash_gets(headers, HEADER_MINFO_CNT);
if (value)
SVN_ERR(svn_cstring_atoi64(&noderev->mergeinfo_count, value));
else
noderev->mergeinfo_count = 0;
/* Get whether *this* node has mergeinfo. */
value = svn_hash_gets(headers, HEADER_MINFO_HERE);
noderev->has_mergeinfo = (value != NULL);
*noderev_p = noderev;
return SVN_NO_ERROR;
}
/* Return a textual representation of the DIGEST of given KIND.
* If IS_NULL is TRUE, no digest is available.
* Allocate the result in RESULT_POOL.
*/
static const char *
format_digest(const unsigned char *digest,
svn_checksum_kind_t kind,
svn_boolean_t is_null,
apr_pool_t *result_pool)
{
svn_checksum_t checksum;
checksum.digest = digest;
checksum.kind = kind;
if (is_null)
return "(null)";
return svn_checksum_to_cstring_display(&checksum, result_pool);
}
svn_stringbuf_t *
svn_fs_fs__unparse_representation(representation_t *rep,
int format,
svn_boolean_t mutable_rep_truncated,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
char buffer[SVN_INT64_BUFFER_SIZE];
if (svn_fs_fs__id_txn_used(&rep->txn_id) && mutable_rep_truncated)
return svn_stringbuf_ncreate("-1", 2, result_pool);
if (format < SVN_FS_FS__MIN_REP_SHARING_FORMAT || !rep->has_sha1)
return svn_stringbuf_createf
(result_pool, "%ld %" APR_UINT64_T_FMT " %" SVN_FILESIZE_T_FMT
" %" SVN_FILESIZE_T_FMT " %s",
rep->revision, rep->item_index, rep->size,
rep->expanded_size,
format_digest(rep->md5_digest, svn_checksum_md5, FALSE,
scratch_pool));
svn__ui64tobase36(buffer, rep->uniquifier.number);
return svn_stringbuf_createf
(result_pool, "%ld %" APR_UINT64_T_FMT " %" SVN_FILESIZE_T_FMT
" %" SVN_FILESIZE_T_FMT " %s %s %s/_%s",
rep->revision, rep->item_index, rep->size,
rep->expanded_size,
format_digest(rep->md5_digest, svn_checksum_md5,
FALSE, scratch_pool),
format_digest(rep->sha1_digest, svn_checksum_sha1,
!rep->has_sha1, scratch_pool),
svn_fs_fs__id_txn_unparse(&rep->uniquifier.noderev_txn_id,
scratch_pool),
buffer);
}
svn_error_t *
svn_fs_fs__write_noderev(svn_stream_t *outfile,
node_revision_t *noderev,
int format,
svn_boolean_t include_mergeinfo,
apr_pool_t *scratch_pool)
{
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_ID ": %s\n",
svn_fs_fs__id_unparse(noderev->id,
scratch_pool)->data));
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TYPE ": %s\n",
(noderev->kind == svn_node_file) ?
SVN_FS_FS__KIND_FILE : SVN_FS_FS__KIND_DIR));
if (noderev->predecessor_id)
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PRED ": %s\n",
svn_fs_fs__id_unparse(noderev->predecessor_id,
scratch_pool)->data));
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COUNT ": %d\n",
noderev->predecessor_count));
if (noderev->data_rep)
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TEXT ": %s\n",
svn_fs_fs__unparse_representation
(noderev->data_rep,
format,
noderev->kind == svn_node_dir,
scratch_pool, scratch_pool)->data));
if (noderev->prop_rep)
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PROPS ": %s\n",
svn_fs_fs__unparse_representation
(noderev->prop_rep, format,
TRUE, scratch_pool, scratch_pool)->data));
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_CPATH ": %s\n",
noderev->created_path));
if (noderev->copyfrom_path)
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYFROM ": %ld"
" %s\n",
noderev->copyfrom_rev,
noderev->copyfrom_path));
if ((noderev->copyroot_rev != svn_fs_fs__id_rev(noderev->id)) ||
(strcmp(noderev->copyroot_path, noderev->created_path) != 0))
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYROOT ": %ld"
" %s\n",
noderev->copyroot_rev,
noderev->copyroot_path));
if (noderev->is_fresh_txn_root)
SVN_ERR(svn_stream_puts(outfile, HEADER_FRESHTXNRT ": y\n"));
if (include_mergeinfo)
{
if (noderev->mergeinfo_count > 0)
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_MINFO_CNT
": %" APR_INT64_T_FMT "\n",
noderev->mergeinfo_count));
if (noderev->has_mergeinfo)
SVN_ERR(svn_stream_puts(outfile, HEADER_MINFO_HERE ": y\n"));
}
return svn_stream_puts(outfile, "\n");
}
svn_error_t *
svn_fs_fs__read_rep_header(svn_fs_fs__rep_header_t **header,
svn_stream_t *stream,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_stringbuf_t *buffer;
char *str, *last_str;
apr_int64_t val;
svn_boolean_t eol = FALSE;
SVN_ERR(svn_stream_readline(stream, &buffer, "\n", &eol, scratch_pool));
*header = apr_pcalloc(result_pool, sizeof(**header));
(*header)->header_size = buffer->len + 1;
if (strcmp(buffer->data, REP_PLAIN) == 0)
{
(*header)->type = svn_fs_fs__rep_plain;
return SVN_NO_ERROR;
}
if (strcmp(buffer->data, REP_DELTA) == 0)
{
/* This is a delta against the empty stream. */
(*header)->type = svn_fs_fs__rep_self_delta;
return SVN_NO_ERROR;
}
(*header)->type = svn_fs_fs__rep_delta;
/* We have hopefully a DELTA vs. a non-empty base revision. */
last_str = buffer->data;
str = svn_cstring_tokenize(" ", &last_str);
if (! str || (strcmp(str, REP_DELTA) != 0))
goto error;
SVN_ERR(parse_revnum(&(*header)->base_revision, (const char **)&last_str));
str = svn_cstring_tokenize(" ", &last_str);
if (! str)
goto error;
SVN_ERR(svn_cstring_atoi64(&val, str));
(*header)->base_item_index = (apr_off_t)val;
str = svn_cstring_tokenize(" ", &last_str);
if (! str)
goto error;
SVN_ERR(svn_cstring_atoi64(&val, str));
(*header)->base_length = (svn_filesize_t)val;
return SVN_NO_ERROR;
error:
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Malformed representation header"));
}
svn_error_t *
svn_fs_fs__write_rep_header(svn_fs_fs__rep_header_t *header,
svn_stream_t *stream,
apr_pool_t *scratch_pool)
{
const char *text;
switch (header->type)
{
case svn_fs_fs__rep_plain:
text = REP_PLAIN "\n";
break;
case svn_fs_fs__rep_self_delta:
text = REP_DELTA "\n";
break;
default:
text = apr_psprintf(scratch_pool, REP_DELTA " %ld %" APR_OFF_T_FMT
" %" SVN_FILESIZE_T_FMT "\n",
header->base_revision, header->base_item_index,
header->base_length);
}
return svn_error_trace(svn_stream_puts(stream, text));
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/pack.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/pack.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/pack.c (revision 309511)
@@ -1,2039 +1,2061 @@
/* pack.c --- FSFS shard packing functionality
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <assert.h>
#include <string.h>
#include "svn_pools.h"
#include "svn_dirent_uri.h"
#include "svn_sorts.h"
#include "private/svn_temp_serializer.h"
#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_string_private.h"
#include "private/svn_io_private.h"
#include "fs_fs.h"
#include "pack.h"
#include "util.h"
#include "id.h"
#include "index.h"
#include "low_level.h"
#include "revprops.h"
#include "transaction.h"
#include "../libsvn_fs/fs-loader.h"
#include "svn_private_config.h"
#include "temp_serializer.h"
/* Logical addressing packing logic:
*
* We pack files on a pack file basis (e.g. 1000 revs) without changing
* existing pack files nor the revision files outside the range to pack.
*
* First, we will scan the revision file indexes to determine the number
* of items to "place" (i.e. determine their optimal position within the
* future pack file). For each item, we will need a constant amount of
* memory to track it. A MAX_MEM parameter sets a limit to the number of
* items we may place in one go. That means, we may not be able to add
* all revisions at once. Instead, we will run the placement for a subset
* of revisions at a time. The very unlikely worst case will simply append
* all revision data with just a little reshuffling inside each revision.
*
* In a second step, we read all revisions in the selected range, build
* the item tracking information and copy the items themselves from the
* revision files to temporary files. The latter serve as buckets for a
* very coarse bucket presort: Separate change lists, file properties,
* directory properties and noderevs + representations from one another.
*
* The third step will determine an optimized placement for the items in
* each of the 4 buckets separately. The first three will simply order
* their items by revision, starting with the newest once. Placing rep
* and noderev items is a more elaborate process documented in the code.
*
* In short, we store items in the following order:
* - changed paths lists
* - node property
* - directory properties
* - directory representations corresponding noderevs, lexical path order
* with special treatment of "trunk" and "branches"
* - same for file representations
*
* Step 4 copies the items from the temporary buckets into the final
* pack file and writes the temporary index files.
*
* Finally, after the last range of revisions, create the final indexes.
*/
/* Maximum amount of memory we allocate for placement information during
* the pack process.
*/
#define DEFAULT_MAX_MEM (64 * 1024 * 1024)
/* Data structure describing a node change at PATH, REVISION.
* We will sort these instances by PATH and NODE_ID such that we can combine
* similar nodes in the same reps container and store containers in path
* major order.
*/
typedef struct path_order_t
{
/* changed path */
svn_prefix_string__t *path;
/* node ID for this PATH in REVISION */
svn_fs_fs__id_part_t node_id;
/* when this change happened */
svn_revnum_t revision;
/* noderev predecessor count */
int predecessor_count;
/* this is a directory node */
svn_boolean_t is_dir;
/* length of the expanded representation content */
apr_int64_t expanded_size;
/* item ID of the noderev linked to the change. May be (0, 0). */
svn_fs_fs__id_part_t noderev_id;
/* item ID of the representation containing the new data. May be (0, 0). */
svn_fs_fs__id_part_t rep_id;
} path_order_t;
/* Represents a reference from item FROM to item TO. FROM may be a noderev
* or rep_id while TO is (currently) always a representation. We will sort
* them by TO which allows us to collect all dependent items.
*/
typedef struct reference_t
{
svn_fs_fs__id_part_t to;
svn_fs_fs__id_part_t from;
} reference_t;
/* This structure keeps track of all the temporary data and status that
* needs to be kept around during the creation of one pack file. After
* each revision range (in case we can't process all revs at once due to
* memory restrictions), parts of the data will get re-initialized.
*/
typedef struct pack_context_t
{
/* file system that we operate on */
svn_fs_t *fs;
/* cancel function to invoke at regular intervals. May be NULL */
svn_cancel_func_t cancel_func;
/* baton to pass to CANCEL_FUNC */
void *cancel_baton;
/* first revision in the shard (and future pack file) */
svn_revnum_t shard_rev;
/* first revision in the range to process (>= SHARD_REV) */
svn_revnum_t start_rev;
/* first revision after the range to process (<= SHARD_END_REV) */
svn_revnum_t end_rev;
/* first revision after the current shard */
svn_revnum_t shard_end_rev;
/* log-to-phys proto index for the whole pack file */
apr_file_t *proto_l2p_index;
/* phys-to-log proto index for the whole pack file */
apr_file_t *proto_p2l_index;
/* full shard directory path (containing the unpacked revisions) */
const char *shard_dir;
/* full packed shard directory path (containing the pack file + indexes) */
const char *pack_file_dir;
/* full pack file path (including PACK_FILE_DIR) */
const char *pack_file_path;
/* current write position (i.e. file length) in the pack file */
apr_off_t pack_offset;
/* the pack file to ultimately write all data to */
apr_file_t *pack_file;
/* array of svn_fs_fs__p2l_entry_t *, all referring to change lists.
* Will be filled in phase 2 and be cleared after each revision range. */
apr_array_header_t *changes;
/* temp file receiving all change list items (referenced by CHANGES).
* Will be filled in phase 2 and be cleared after each revision range. */
apr_file_t *changes_file;
/* array of svn_fs_fs__p2l_entry_t *, all referring to file properties.
* Will be filled in phase 2 and be cleared after each revision range. */
apr_array_header_t *file_props;
/* temp file receiving all file prop items (referenced by FILE_PROPS).
* Will be filled in phase 2 and be cleared after each revision range.*/
apr_file_t *file_props_file;
/* array of svn_fs_fs__p2l_entry_t *, all referring to directory properties.
* Will be filled in phase 2 and be cleared after each revision range. */
apr_array_header_t *dir_props;
/* temp file receiving all directory prop items (referenced by DIR_PROPS).
* Will be filled in phase 2 and be cleared after each revision range.*/
apr_file_t *dir_props_file;
/* container for all PATH members in PATH_ORDER. */
svn_prefix_tree__t *paths;
/* array of path_order_t *. Will be filled in phase 2 and be cleared
* after each revision range. Sorted by PATH, NODE_ID. */
apr_array_header_t *path_order;
/* array of reference_t* linking representations to their delta bases.
* Will be filled in phase 2 and be cleared after each revision range.
* It will be sorted by the FROM members (for rep->base rep lookup). */
apr_array_header_t *references;
/* array of svn_fs_fs__p2l_entry_t*. Will be filled in phase 2 and be
* cleared after each revision range. During phase 3, we will set items
* to NULL that we already processed. */
apr_array_header_t *reps;
/* array of int, marking for each revision, the which offset their items
* begin in REPS. Will be filled in phase 2 and be cleared after
* each revision range. */
apr_array_header_t *rev_offsets;
/* temp file receiving all items referenced by REPS.
* Will be filled in phase 2 and be cleared after each revision range.*/
apr_file_t *reps_file;
/* pool used for temporary data structures that will be cleaned up when
* the next range of revisions is being processed */
apr_pool_t *info_pool;
} pack_context_t;
/* Create and initialize a new pack context for packing shard SHARD_REV in
* SHARD_DIR into PACK_FILE_DIR within filesystem FS. Allocate it in POOL
* and return the structure in *CONTEXT.
*
* Limit the number of items being copied per iteration to MAX_ITEMS.
* Set CANCEL_FUNC and CANCEL_BATON as well.
*/
static svn_error_t *
initialize_pack_context(pack_context_t *context,
svn_fs_t *fs,
const char *pack_file_dir,
const char *shard_dir,
svn_revnum_t shard_rev,
int max_items,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
const char *temp_dir;
int max_revs = MIN(ffd->max_files_per_dir, max_items);
SVN_ERR_ASSERT(ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT);
SVN_ERR_ASSERT(shard_rev % ffd->max_files_per_dir == 0);
/* where we will place our various temp files */
SVN_ERR(svn_io_temp_dir(&temp_dir, pool));
/* store parameters */
context->fs = fs;
context->cancel_func = cancel_func;
context->cancel_baton = cancel_baton;
context->shard_rev = shard_rev;
context->start_rev = shard_rev;
context->end_rev = shard_rev;
context->shard_end_rev = shard_rev + ffd->max_files_per_dir;
/* Create the new directory and pack file. */
context->shard_dir = shard_dir;
context->pack_file_dir = pack_file_dir;
context->pack_file_path
= svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
SVN_ERR(svn_io_file_open(&context->pack_file, context->pack_file_path,
APR_WRITE | APR_BUFFERED | APR_BINARY | APR_EXCL
| APR_CREATE, APR_OS_DEFAULT, pool));
/* Proto index files */
SVN_ERR(svn_fs_fs__l2p_proto_index_open(
&context->proto_l2p_index,
svn_dirent_join(pack_file_dir,
PATH_INDEX PATH_EXT_L2P_INDEX,
pool),
pool));
SVN_ERR(svn_fs_fs__p2l_proto_index_open(
&context->proto_p2l_index,
svn_dirent_join(pack_file_dir,
PATH_INDEX PATH_EXT_P2L_INDEX,
pool),
pool));
/* item buckets: one item info array and one temp file per bucket */
context->changes = apr_array_make(pool, max_items,
sizeof(svn_fs_fs__p2l_entry_t *));
SVN_ERR(svn_io_open_unique_file3(&context->changes_file, NULL, temp_dir,
svn_io_file_del_on_close, pool, pool));
context->file_props = apr_array_make(pool, max_items,
sizeof(svn_fs_fs__p2l_entry_t *));
SVN_ERR(svn_io_open_unique_file3(&context->file_props_file, NULL, temp_dir,
svn_io_file_del_on_close, pool, pool));
context->dir_props = apr_array_make(pool, max_items,
sizeof(svn_fs_fs__p2l_entry_t *));
SVN_ERR(svn_io_open_unique_file3(&context->dir_props_file, NULL, temp_dir,
svn_io_file_del_on_close, pool, pool));
/* noderev and representation item bucket */
context->rev_offsets = apr_array_make(pool, max_revs, sizeof(int));
context->path_order = apr_array_make(pool, max_items,
sizeof(path_order_t *));
context->references = apr_array_make(pool, max_items,
sizeof(reference_t *));
context->reps = apr_array_make(pool, max_items,
sizeof(svn_fs_fs__p2l_entry_t *));
SVN_ERR(svn_io_open_unique_file3(&context->reps_file, NULL, temp_dir,
svn_io_file_del_on_close, pool, pool));
/* the pool used for temp structures */
context->info_pool = svn_pool_create(pool);
context->paths = svn_prefix_tree__create(context->info_pool);
return SVN_NO_ERROR;
}
/* Clean up / free all revision range specific data and files in CONTEXT.
* Use POOL for temporary allocations.
*/
static svn_error_t *
reset_pack_context(pack_context_t *context,
apr_pool_t *pool)
{
+ const char *temp_dir;
+
apr_array_clear(context->changes);
- SVN_ERR(svn_io_file_trunc(context->changes_file, 0, pool));
+ SVN_ERR(svn_io_file_close(context->changes_file, pool));
apr_array_clear(context->file_props);
- SVN_ERR(svn_io_file_trunc(context->file_props_file, 0, pool));
+ SVN_ERR(svn_io_file_close(context->file_props_file, pool));
apr_array_clear(context->dir_props);
- SVN_ERR(svn_io_file_trunc(context->dir_props_file, 0, pool));
+ SVN_ERR(svn_io_file_close(context->dir_props_file, pool));
apr_array_clear(context->rev_offsets);
apr_array_clear(context->path_order);
apr_array_clear(context->references);
apr_array_clear(context->reps);
- SVN_ERR(svn_io_file_trunc(context->reps_file, 0, pool));
+ SVN_ERR(svn_io_file_close(context->reps_file, pool));
svn_pool_clear(context->info_pool);
+ /* The new temporary files must live at least as long as any other info
+ * object in CONTEXT. */
+ SVN_ERR(svn_io_temp_dir(&temp_dir, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->changes_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->file_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->dir_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->reps_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ context->paths = svn_prefix_tree__create(context->info_pool);
+
return SVN_NO_ERROR;
}
/* Call this after the last revision range. It will finalize all index files
* for CONTEXT and close any open files. Use POOL for temporary allocations.
*/
static svn_error_t *
close_pack_context(pack_context_t *context,
apr_pool_t *pool)
{
const char *proto_l2p_index_path;
const char *proto_p2l_index_path;
/* need the file names for the actual index creation call further down */
SVN_ERR(svn_io_file_name_get(&proto_l2p_index_path,
context->proto_l2p_index, pool));
SVN_ERR(svn_io_file_name_get(&proto_p2l_index_path,
context->proto_p2l_index, pool));
/* finalize proto index files */
SVN_ERR(svn_io_file_close(context->proto_l2p_index, pool));
SVN_ERR(svn_io_file_close(context->proto_p2l_index, pool));
/* Append the actual index data to the pack file. */
SVN_ERR(svn_fs_fs__add_index_data(context->fs, context->pack_file,
proto_l2p_index_path,
proto_p2l_index_path,
context->shard_rev,
pool));
/* remove proto index files */
SVN_ERR(svn_io_remove_file2(proto_l2p_index_path, FALSE, pool));
SVN_ERR(svn_io_remove_file2(proto_p2l_index_path, FALSE, pool));
/* Ensure that packed file is written to disk.*/
SVN_ERR(svn_io_file_flush_to_disk(context->pack_file, pool));
SVN_ERR(svn_io_file_close(context->pack_file, pool));
return SVN_NO_ERROR;
}
/* Efficiently copy SIZE bytes from SOURCE to DEST. Invoke the CANCEL_FUNC
* from CONTEXT at regular intervals. Use POOL for allocations.
*/
static svn_error_t *
copy_file_data(pack_context_t *context,
apr_file_t *dest,
apr_file_t *source,
apr_off_t size,
apr_pool_t *pool)
{
/* most non-representation items will be small. Minimize the buffer
* and infrastructure overhead in that case. */
enum { STACK_BUFFER_SIZE = 1024 };
if (size < STACK_BUFFER_SIZE)
{
/* copy small data using a fixed-size buffer on stack */
char buffer[STACK_BUFFER_SIZE];
SVN_ERR(svn_io_file_read_full2(source, buffer, (apr_size_t)size,
NULL, NULL, pool));
SVN_ERR(svn_io_file_write_full(dest, buffer, (apr_size_t)size,
NULL, pool));
}
else
{
/* use streaming copies for larger data blocks. That may require
* the allocation of larger buffers and we should make sure that
* this extra memory is released asap. */
fs_fs_data_t *ffd = context->fs->fsap_data;
apr_pool_t *copypool = svn_pool_create(pool);
char *buffer = apr_palloc(copypool, ffd->block_size);
while (size)
{
apr_size_t to_copy = (apr_size_t)(MIN(size, ffd->block_size));
if (context->cancel_func)
SVN_ERR(context->cancel_func(context->cancel_baton));
SVN_ERR(svn_io_file_read_full2(source, buffer, to_copy,
NULL, NULL, pool));
SVN_ERR(svn_io_file_write_full(dest, buffer, to_copy,
NULL, pool));
size -= to_copy;
}
svn_pool_destroy(copypool);
}
return SVN_NO_ERROR;
}
/* Writes SIZE bytes, all 0, to DEST. Uses POOL for allocations.
*/
static svn_error_t *
write_null_bytes(apr_file_t *dest,
apr_off_t size,
apr_pool_t *pool)
{
/* Have a collection of high-quality, easy to access NUL bytes handy. */
enum { BUFFER_SIZE = 1024 };
static const char buffer[BUFFER_SIZE] = { 0 };
/* copy SIZE of them into the file's buffer */
while (size)
{
apr_size_t to_write = MIN(size, BUFFER_SIZE);
SVN_ERR(svn_io_file_write_full(dest, buffer, to_write, NULL, pool));
size -= to_write;
}
return SVN_NO_ERROR;
}
/* Copy the "simple" item (changed paths list or property representation)
* from the current position in REV_FILE to TEMP_FILE using CONTEXT. Add
* a copy of ENTRY to ENTRIES but with an updated offset value that points
* to the copy destination in TEMP_FILE. Use POOL for allocations.
*/
static svn_error_t *
copy_item_to_temp(pack_context_t *context,
apr_array_header_t *entries,
apr_file_t *temp_file,
apr_file_t *rev_file,
svn_fs_fs__p2l_entry_t *entry,
apr_pool_t *pool)
{
svn_fs_fs__p2l_entry_t *new_entry
= apr_pmemdup(context->info_pool, entry, sizeof(*entry));
SVN_ERR(svn_fs_fs__get_file_offset(&new_entry->offset, temp_file, pool));
APR_ARRAY_PUSH(entries, svn_fs_fs__p2l_entry_t *) = new_entry;
SVN_ERR(copy_file_data(context, temp_file, rev_file, entry->size, pool));
return SVN_NO_ERROR;
}
/* Return the offset within CONTEXT->REPS that corresponds to item
* ITEM_INDEX in REVISION.
*/
static int
get_item_array_index(pack_context_t *context,
svn_revnum_t revision,
apr_int64_t item_index)
{
assert(revision >= context->start_rev);
return (int)item_index + APR_ARRAY_IDX(context->rev_offsets,
revision - context->start_rev,
int);
}
/* Write INFO to the correct position in CONTEXT->REP_INFOS. The latter
* may need auto-expanding. Overwriting an array element is not allowed.
*/
static void
add_item_rep_mapping(pack_context_t *context,
svn_fs_fs__p2l_entry_t *entry)
{
int idx;
/* index of INFO */
idx = get_item_array_index(context,
entry->item.revision,
entry->item.number);
/* make sure the index exists in the array */
while (context->reps->nelts <= idx)
APR_ARRAY_PUSH(context->reps, void *) = NULL;
/* set the element. If there is already an entry, there are probably
* two items claiming to be the same -> bail out */
assert(!APR_ARRAY_IDX(context->reps, idx, void *));
APR_ARRAY_IDX(context->reps, idx, void *) = entry;
}
/* Return the P2L entry from CONTEXT->REPS for the given ID. If there is
* none (or not anymore), return NULL. If RESET has been specified, set
* the array entry to NULL after returning the entry.
*/
static svn_fs_fs__p2l_entry_t *
get_item(pack_context_t *context,
const svn_fs_fs__id_part_t *id,
svn_boolean_t reset)
{
svn_fs_fs__p2l_entry_t *result = NULL;
if (id->number && id->revision >= context->start_rev)
{
int idx = get_item_array_index(context, id->revision, id->number);
if (context->reps->nelts > idx)
{
result = APR_ARRAY_IDX(context->reps, idx, void *);
if (result && reset)
APR_ARRAY_IDX(context->reps, idx, void *) = NULL;
}
}
return result;
}
/* Copy representation item identified by ENTRY from the current position
* in REV_FILE into CONTEXT->REPS_FILE. Add all tracking into needed by
* our placement algorithm to CONTEXT. Use POOL for temporary allocations.
*/
static svn_error_t *
copy_rep_to_temp(pack_context_t *context,
apr_file_t *rev_file,
svn_fs_fs__p2l_entry_t *entry,
apr_pool_t *pool)
{
svn_fs_fs__rep_header_t *rep_header;
svn_stream_t *stream;
apr_off_t source_offset = entry->offset;
/* create a copy of ENTRY, make it point to the copy destination and
* store it in CONTEXT */
entry = apr_pmemdup(context->info_pool, entry, sizeof(*entry));
SVN_ERR(svn_fs_fs__get_file_offset(&entry->offset, context->reps_file, pool));
add_item_rep_mapping(context, entry);
/* read & parse the representation header */
stream = svn_stream_from_aprfile2(rev_file, TRUE, pool);
SVN_ERR(svn_fs_fs__read_rep_header(&rep_header, stream, pool, pool));
svn_stream_close(stream);
/* if the representation is a delta against some other rep, link the two */
if ( rep_header->type == svn_fs_fs__rep_delta
&& rep_header->base_revision >= context->start_rev)
{
reference_t *reference = apr_pcalloc(context->info_pool,
sizeof(*reference));
reference->from = entry->item;
reference->to.revision = rep_header->base_revision;
reference->to.number = rep_header->base_item_index;
APR_ARRAY_PUSH(context->references, reference_t *) = reference;
}
/* copy the whole rep (including header!) to our temp file */
SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &source_offset, pool));
SVN_ERR(copy_file_data(context, context->reps_file, rev_file, entry->size,
pool));
return SVN_NO_ERROR;
}
/* Directories first, dirs / files sorted by name in reverse lexical order.
* This maximizes the chance of two items being located close to one another
* in *all* pack files independent of their change order. It also groups
* multi-project repos nicely according to their sub-projects. The reverse
* order aspect gives "trunk" preference over "tags" and "branches", so
* trunk-related items are more likely to be contiguous.
*/
static int
compare_dir_entries_format7(const svn_sort__item_t *a,
const svn_sort__item_t *b)
{
const svn_fs_dirent_t *lhs = (const svn_fs_dirent_t *) a->value;
const svn_fs_dirent_t *rhs = (const svn_fs_dirent_t *) b->value;
if (lhs->kind != rhs->kind)
return lhs->kind == svn_node_dir ? -1 : 1;
return strcmp(lhs->name, rhs->name);
}
/* Directories entries sorted by revision (decreasing - to max cache hits)
* and offset (increasing - to max benefit from APR file buffering).
*/
static int
compare_dir_entries_format6(const svn_sort__item_t *a,
const svn_sort__item_t *b)
{
const svn_fs_dirent_t *lhs = (const svn_fs_dirent_t *) a->value;
const svn_fs_dirent_t *rhs = (const svn_fs_dirent_t *) b->value;
const svn_fs_fs__id_part_t *lhs_rev_item
= svn_fs_fs__id_rev_item(lhs->id);
const svn_fs_fs__id_part_t *rhs_rev_item
= svn_fs_fs__id_rev_item(rhs->id);
/* decreasing ("reverse") order on revs */
if (lhs_rev_item->revision != rhs_rev_item->revision)
return lhs_rev_item->revision > rhs_rev_item->revision ? -1 : 1;
/* increasing order on offsets */
if (lhs_rev_item->number != rhs_rev_item->number)
return lhs_rev_item->number > rhs_rev_item->number ? 1 : -1;
return 0;
}
apr_array_header_t *
svn_fs_fs__order_dir_entries(svn_fs_t *fs,
apr_hash_t *directory,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_array_header_t *ordered
= svn_sort__hash(directory,
svn_fs_fs__use_log_addressing(fs)
? compare_dir_entries_format7
: compare_dir_entries_format6,
scratch_pool);
apr_array_header_t *result
= apr_array_make(result_pool, ordered->nelts, sizeof(svn_fs_dirent_t *));
int i;
for (i = 0; i < ordered->nelts; ++i)
APR_ARRAY_PUSH(result, svn_fs_dirent_t *)
= APR_ARRAY_IDX(ordered, i, svn_sort__item_t).value;
return result;
}
/* Return a duplicate of the the ORIGINAL path and with special sub-strins
* (e.g. "trunk") modified in such a way that have a lower lexicographic
* value than any other "normal" file name.
*/
static const char *
tweak_path_for_ordering(const char *original,
apr_pool_t *pool)
{
/* We may add further special cases as needed. */
enum {SPECIAL_COUNT = 2};
static const char *special[SPECIAL_COUNT] = {"trunk", "branch"};
char *pos;
char *path = apr_pstrdup(pool, original);
int i;
/* Replace the first char of any "special" sub-string we find by
* a control char, i.e. '\1' .. '\31'. In the rare event that this
* would clash with existing paths, no data will be lost but merely
* the node ordering will be sub-optimal.
*/
for (i = 0; i < SPECIAL_COUNT; ++i)
for (pos = strstr(path, special[i]);
pos;
pos = strstr(pos + 1, special[i]))
{
*pos = (char)(i + '\1');
}
return path;
}
/* Copy node revision item identified by ENTRY from the current position
* in REV_FILE into CONTEXT->REPS_FILE. Add all tracking into needed by
* our placement algorithm to CONTEXT. Use POOL for temporary allocations.
*/
static svn_error_t *
copy_node_to_temp(pack_context_t *context,
apr_file_t *rev_file,
svn_fs_fs__p2l_entry_t *entry,
apr_pool_t *pool)
{
path_order_t *path_order = apr_pcalloc(context->info_pool,
sizeof(*path_order));
node_revision_t *noderev;
const char *sort_path;
svn_stream_t *stream;
apr_off_t source_offset = entry->offset;
/* read & parse noderev */
stream = svn_stream_from_aprfile2(rev_file, TRUE, pool);
SVN_ERR(svn_fs_fs__read_noderev(&noderev, stream, pool, pool));
svn_stream_close(stream);
/* create a copy of ENTRY, make it point to the copy destination and
* store it in CONTEXT */
entry = apr_pmemdup(context->info_pool, entry, sizeof(*entry));
SVN_ERR(svn_fs_fs__get_file_offset(&entry->offset, context->reps_file,
pool));
add_item_rep_mapping(context, entry);
/* copy the noderev to our temp file */
SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &source_offset, pool));
SVN_ERR(copy_file_data(context, context->reps_file, rev_file, entry->size,
pool));
/* if the node has a data representation, make that the node's "base".
* This will (often) cause the noderev to be placed right in front of
* its data representation. */
if (noderev->data_rep && noderev->data_rep->revision >= context->start_rev)
{
path_order->rep_id.revision = noderev->data_rep->revision;
path_order->rep_id.number = noderev->data_rep->item_index;
path_order->expanded_size = noderev->data_rep->expanded_size
? noderev->data_rep->expanded_size
: noderev->data_rep->size;
}
/* Sort path is the key used for ordering noderevs and associated reps.
* It will not be stored in the final pack file. */
sort_path = tweak_path_for_ordering(noderev->created_path, pool);
path_order->path = svn_prefix_string__create(context->paths, sort_path);
path_order->node_id = *svn_fs_fs__id_node_id(noderev->id);
path_order->revision = svn_fs_fs__id_rev(noderev->id);
path_order->predecessor_count = noderev->predecessor_count;
path_order->is_dir = noderev->kind == svn_node_dir;
path_order->noderev_id = *svn_fs_fs__id_rev_item(noderev->id);
APR_ARRAY_PUSH(context->path_order, path_order_t *) = path_order;
return SVN_NO_ERROR;
}
/* implements compare_fn_t. Bring all directories in front of the files
and sort descendingly by PATH, NODE_ID and REVISION.
*/
static int
compare_path_order(const path_order_t * const * lhs_p,
const path_order_t * const * rhs_p)
{
const path_order_t * lhs = *lhs_p;
const path_order_t * rhs = *rhs_p;
/* cluster all directories */
int diff = rhs->is_dir - lhs->is_dir;
if (diff)
return diff;
/* lexicographic order on path and node (i.e. latest first) */
diff = svn_prefix_string__compare(lhs->path, rhs->path);
if (diff)
return diff;
/* reverse order on node (i.e. latest first) */
diff = svn_fs_fs__id_part_compare(&rhs->node_id, &lhs->node_id);
if (diff)
return diff;
/* reverse order on revision (i.e. latest first) */
if (lhs->revision != rhs->revision)
return lhs->revision < rhs->revision ? 1 : -1;
return 0;
}
/* implements compare_fn_t. Sort ascendingly by FROM, TO.
*/
static int
compare_references(const reference_t * const * lhs_p,
const reference_t * const * rhs_p)
{
const reference_t * lhs = *lhs_p;
const reference_t * rhs = *rhs_p;
int diff = svn_fs_fs__id_part_compare(&lhs->from, &rhs->from);
return diff ? diff : svn_fs_fs__id_part_compare(&lhs->to, &rhs->to);
}
/* implements compare_fn_t. Assume ascending order by FROM.
*/
static int
compare_ref_to_item(const reference_t * const * lhs_p,
const svn_fs_fs__id_part_t * rhs_p)
{
return svn_fs_fs__id_part_compare(&(*lhs_p)->from, rhs_p);
}
/* implements compare_fn_t. Finds the DIR / FILE boundary.
*/
static int
compare_is_dir(const path_order_t * const * lhs_p,
const void *unused)
{
return (*lhs_p)->is_dir ? -1 : 0;
}
/* Look for the least significant bit set in VALUE and return the smallest
* number with the same property, i.e. the largest power of 2 that is a
* factor in VALUE. */
static int
roundness(int value)
{
return value ? value - (value & (value - 1)) : INT_MAX;
}
/* Order a range of data collected in CONTEXT such that we can place them
* in the desired order. The input is taken from *PATH_ORDER, offsets FIRST
* to LAST and then written in the final order to the same range in *TEMP.
*/
static void
sort_reps_range(pack_context_t *context,
const path_order_t **path_order,
const path_order_t **temp,
int first,
int last)
{
const svn_prefix_string__t *path;
int i, dest, best;
svn_fs_fs__id_part_t rep_id;
fs_fs_data_t *ffd = context->fs->fsap_data;
/* The logic below would fail for empty ranges. */
if (first == last)
return;
/* Re-order noderevs like this:
*
* (1) Most likely to be referenced by future pack files, in path order.
* (2) highest revision rep per path + dependency chain
* (3) Remaining reps in path, rev order
*
* We simply pick & chose from the existing path, rev order.
*/
dest = first;
path = path_order[first]->path;
best = first;
/* (1) For each path, pick the "roundest" representation and put it in
* front of all other nodes in the pack file. The "roundest" rep is
* the one most likely to be referenced from future pack files, i.e. we
* concentrate those potential "foreign link targets" in one section of
* the pack file.
*
* And we only apply this to reps outside the linear deltification
* sections because references *into* linear deltification ranges are
* much less likely.
*/
for (i = first; i < last; ++i)
{
/* Investigated all nodes for the current path? */
if (svn_prefix_string__compare(path, path_order[i]->path))
{
/* next path */
path = path_order[i]->path;
/* Pick roundest non-linear deltified node. */
if (roundness(path_order[best]->predecessor_count)
>= ffd->max_linear_deltification)
{
temp[dest++] = path_order[best];
path_order[best] = NULL;
best = i;
}
}
/* next entry */
if ( roundness(path_order[best]->predecessor_count)
< roundness(path_order[i]->predecessor_count))
best = i;
}
/* Treat the last path the same as all others. */
if (roundness(path_order[best]->predecessor_count)
>= ffd->max_linear_deltification)
{
temp[dest++] = path_order[best];
path_order[best] = NULL;
}
/* (2) For each (remaining) path, pick the nodes along the delta chain
* for the highest revision. Due to our ordering, this is the first
* node we encounter for any path.
*
* Most references that don't hit a delta base picked in (1), will
* access HEAD of the respective path. Keeping all its dependency chain
* in one place turns reconstruction into a linear scan of minimal length.
*/
for (i = first; i < last; ++i)
if (path_order[i])
{
/* This is the first path we still have to handle. */
path = path_order[i]->path;
rep_id = path_order[i]->rep_id;
break;
}
for (i = first; i < last; ++i)
if (path_order[i])
{
/* New path? */
if (svn_prefix_string__compare(path, path_order[i]->path))
{
path = path_order[i]->path;
rep_id = path_order[i]->rep_id;
}
/* Pick nodes along the deltification chain. Skip side-branches. */
if (svn_fs_fs__id_part_eq(&path_order[i]->rep_id, &rep_id))
{
reference_t **reference;
temp[dest++] = path_order[i];
path_order[i] = NULL;
reference = svn_sort__array_lookup(context->references,
&rep_id, NULL,
(int (*)(const void *, const void *))compare_ref_to_item);
if (reference)
rep_id = (*reference)->to;
}
}
/* (3) All remaining nodes in path, rev order. Linear deltification
* makes HEAD delta chains from (2) cover all or most of their deltas
* in a given pack file. So, this is just a few remnants that we put
* at the end of the pack file.
*/
for (i = first; i < last; ++i)
if (path_order[i])
temp[dest++] = path_order[i];
/* We now know the final ordering. */
assert(dest == last);
}
/* Order the data collected in CONTEXT such that we can place them in the
* desired order.
*/
static void
sort_reps(pack_context_t *context)
{
apr_pool_t *temp_pool;
const path_order_t **temp, **path_order;
int i, count, dir_count;
/* We will later assume that there is at least one node / path.
*/
if (context->path_order->nelts == 0)
{
assert(context->references->nelts == 0);
return;
}
/* Sort containers by path and IDs, respectively.
*/
svn_sort__array(context->path_order,
(int (*)(const void *, const void *))compare_path_order);
svn_sort__array(context->references,
(int (*)(const void *, const void *))compare_references);
/* Directories are already in front; sort directories section and files
* section separately but use the same heuristics (see sub-function).
*/
temp_pool = svn_pool_create(context->info_pool);
count = context->path_order->nelts;
temp = apr_pcalloc(temp_pool, count * sizeof(*temp));
path_order = (void *)context->path_order->elts;
/* Find the boundary between DIR and FILE section. */
dir_count = svn_sort__bsearch_lower_bound(context->path_order, NULL,
(int (*)(const void *, const void *))compare_is_dir);
/* Sort those sub-sections separately. */
sort_reps_range(context, path_order, temp, 0, dir_count);
sort_reps_range(context, path_order, temp, dir_count, count);
/* We now know the final ordering. */
for (i = 0; i < count; ++i)
path_order[i] = temp[i];
svn_pool_destroy(temp_pool);
}
/* implements compare_fn_t. Place LHS before RHS, if the latter is older.
*/
static int
compare_p2l_info(const svn_fs_fs__p2l_entry_t * const * lhs,
const svn_fs_fs__p2l_entry_t * const * rhs)
{
assert(*lhs != *rhs);
if ((*lhs)->item.revision == (*rhs)->item.revision)
return (*lhs)->item.number > (*rhs)->item.number ? -1 : 1;
return (*lhs)->item.revision > (*rhs)->item.revision ? -1 : 1;
}
/* Sort svn_fs_fs__p2l_entry_t * array ENTRIES by age. Place the latest
* items first.
*/
static void
sort_items(apr_array_header_t *entries)
{
svn_sort__array(entries,
(int (*)(const void *, const void *))compare_p2l_info);
}
/* Return the remaining unused bytes in the current block in CONTEXT's
* pack file.
*/
static apr_ssize_t
get_block_left(pack_context_t *context)
{
fs_fs_data_t *ffd = context->fs->fsap_data;
return ffd->block_size - (context->pack_offset % ffd->block_size);
}
/* To prevent items from overlapping a block boundary, we will usually
* put them into the next block and top up the old one with NUL bytes.
* Pad CONTEXT's pack file to the end of the current block, if TO_ADD does
* not fit into the current block and the padding is short enough.
* Use POOL for allocations.
*/
static svn_error_t *
auto_pad_block(pack_context_t *context,
apr_off_t to_add,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = context->fs->fsap_data;
/* This is the maximum number of bytes "wasted" that way per block.
* Larger items will cross the block boundaries. */
const apr_off_t max_padding = MAX(ffd->block_size / 50, 512);
/* Is wasted space small enough to align the current item to the next
* block? */
apr_off_t padding = get_block_left(context);
if (padding < to_add && padding < max_padding)
{
/* Yes. To up with NUL bytes and don't forget to create
* an P2L index entry marking this section as unused. */
svn_fs_fs__p2l_entry_t null_entry;
null_entry.offset = context->pack_offset;
null_entry.size = padding;
null_entry.type = SVN_FS_FS__ITEM_TYPE_UNUSED;
null_entry.item.revision = SVN_INVALID_REVNUM;
null_entry.item.number = SVN_FS_FS__ITEM_INDEX_UNUSED;
null_entry.fnv1_checksum = 0;
SVN_ERR(write_null_bytes(context->pack_file, padding, pool));
SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(
context->proto_p2l_index, &null_entry, pool));
context->pack_offset += padding;
}
return SVN_NO_ERROR;
}
/* Read the contents of ITEM, if not empty, from TEMP_FILE and write it
* to CONTEXT->PACK_FILE. Use POOL for allocations.
*/
static svn_error_t *
store_item(pack_context_t *context,
apr_file_t *temp_file,
svn_fs_fs__p2l_entry_t *item,
apr_pool_t *pool)
{
apr_off_t safety_margin;
/* skip empty entries */
if (item->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
return SVN_NO_ERROR;
/* If the next item does not fit into the current block, auto-pad it.
Take special care of textual noderevs since their parsers may
prefetch up to 80 bytes and we don't want them to cross block
boundaries. */
safety_margin = item->type == SVN_FS_FS__ITEM_TYPE_NODEREV
? SVN__LINE_CHUNK_SIZE
: 0;
SVN_ERR(auto_pad_block(context, item->size + safety_margin, pool));
/* select the item in the source file and copy it into the target
* pack file */
SVN_ERR(svn_io_file_seek(temp_file, APR_SET, &item->offset, pool));
SVN_ERR(copy_file_data(context, context->pack_file, temp_file,
item->size, pool));
/* write index entry and update current position */
item->offset = context->pack_offset;
context->pack_offset += item->size;
SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(context->proto_p2l_index,
item, pool));
APR_ARRAY_PUSH(context->reps, svn_fs_fs__p2l_entry_t *) = item;
return SVN_NO_ERROR;
}
/* Read the contents of the non-empty items in ITEMS from TEMP_FILE and
* write them to CONTEXT->PACK_FILE. Use POOL for allocations.
*/
static svn_error_t *
store_items(pack_context_t *context,
apr_file_t *temp_file,
apr_array_header_t *items,
apr_pool_t *pool)
{
int i;
apr_pool_t *iterpool = svn_pool_create(pool);
/* copy all items in strict order */
for (i = 0; i < items->nelts; ++i)
{
svn_pool_clear(iterpool);
SVN_ERR(store_item(context, temp_file,
APR_ARRAY_IDX(items, i, svn_fs_fs__p2l_entry_t *),
iterpool));
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Copy (append) the items identified by svn_fs_fs__p2l_entry_t * elements
* in ENTRIES strictly in order from TEMP_FILE into CONTEXT->PACK_FILE.
* Use POOL for temporary allocations.
*/
static svn_error_t *
copy_reps_from_temp(pack_context_t *context,
apr_file_t *temp_file,
apr_pool_t *pool)
{
apr_pool_t *iterpool = svn_pool_create(pool);
apr_array_header_t *path_order = context->path_order;
int i;
/* copy items in path order. */
for (i = 0; i < path_order->nelts; ++i)
{
path_order_t *current_path;
svn_fs_fs__p2l_entry_t *node_part;
svn_fs_fs__p2l_entry_t *rep_part;
svn_pool_clear(iterpool);
current_path = APR_ARRAY_IDX(path_order, i, path_order_t *);
node_part = get_item(context, &current_path->noderev_id, TRUE);
rep_part = get_item(context, &current_path->rep_id, TRUE);
if (node_part)
SVN_ERR(store_item(context, temp_file, node_part, iterpool));
if (rep_part)
SVN_ERR(store_item(context, temp_file, rep_part, iterpool));
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* implements compare_fn_t. Place LHS before RHS, if the latter belongs to
* a newer revision.
*/
static int
compare_p2l_info_rev(const svn_fs_fs__p2l_entry_t * const * lhs_p,
const svn_fs_fs__p2l_entry_t * const * rhs_p)
{
const svn_fs_fs__p2l_entry_t * lhs = *lhs_p;
const svn_fs_fs__p2l_entry_t * rhs = *rhs_p;
if (lhs->item.revision == rhs->item.revision)
return 0;
return lhs->item.revision < rhs->item.revision ? -1 : 1;
}
/* Write the log-to-phys proto index file for CONTEXT and use POOL for
* temporary allocations. All items in all buckets must have been placed
* by now.
*/
static svn_error_t *
write_l2p_index(pack_context_t *context,
apr_pool_t *pool)
{
apr_pool_t *iterpool = svn_pool_create(pool);
svn_revnum_t prev_rev = SVN_INVALID_REVNUM;
int i, dest;
/* eliminate empty entries from CONTEXT->REPS */
for (i = 0, dest = 0; i < context->reps->nelts; ++i)
{
svn_fs_fs__p2l_entry_t *entry
= APR_ARRAY_IDX(context->reps, i, svn_fs_fs__p2l_entry_t *);
if (entry)
APR_ARRAY_IDX(context->reps, dest++, svn_fs_fs__p2l_entry_t *)
= entry;
}
context->reps->nelts = dest;
/* we need to write the l2p index revision by revision */
svn_sort__array(context->reps,
(int (*)(const void *, const void *))compare_p2l_info_rev);
/* write index entries */
for (i = 0; i < context->reps->nelts; ++i)
{
svn_fs_fs__p2l_entry_t *p2l_entry
= APR_ARRAY_IDX(context->reps, i, svn_fs_fs__p2l_entry_t *);
if (p2l_entry == NULL)
continue;
/* next revision? */
if (prev_rev != p2l_entry->item.revision)
{
prev_rev = p2l_entry->item.revision;
SVN_ERR(svn_fs_fs__l2p_proto_index_add_revision(
context->proto_l2p_index, iterpool));
}
/* add entry */
SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(context->proto_l2p_index,
p2l_entry->offset,
p2l_entry->item.number,
iterpool));
/* keep memory usage in check */
if (i % 256 == 0)
svn_pool_clear(iterpool);
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Pack the current revision range of CONTEXT, i.e. this covers phases 2
* to 4. Use POOL for allocations.
*/
static svn_error_t *
pack_range(pack_context_t *context,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = context->fs->fsap_data;
apr_pool_t *revpool = svn_pool_create(pool);
apr_pool_t *iterpool = svn_pool_create(pool);
apr_pool_t *iterpool2 = svn_pool_create(pool);
/* Phase 2: Copy items into various buckets and build tracking info */
svn_revnum_t revision;
for (revision = context->start_rev; revision < context->end_rev; ++revision)
{
apr_off_t offset = 0;
svn_fs_fs__revision_file_t *rev_file;
svn_pool_clear(revpool);
/* Get the rev file dimensions (mainly index locations). */
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, context->fs,
revision, revpool, iterpool));
SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
/* store the indirect array index */
APR_ARRAY_PUSH(context->rev_offsets, int) = context->reps->nelts;
/* read the phys-to-log index file until we covered the whole rev file.
* That index contains enough info to build both target indexes from it. */
while (offset < rev_file->l2p_offset)
{
/* read one cluster */
int i;
apr_array_header_t *entries;
svn_pool_clear(iterpool);
SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, context->fs,
rev_file, revision, offset,
ffd->p2l_page_size, iterpool,
iterpool));
for (i = 0; i < entries->nelts; ++i)
{
svn_fs_fs__p2l_entry_t *entry
= &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
/* skip first entry if that was duplicated due crossing a
cluster boundary */
if (offset > entry->offset)
continue;
svn_pool_clear(iterpool2);
/* process entry while inside the rev file */
offset = entry->offset;
if (offset < rev_file->l2p_offset)
{
SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset,
iterpool2));
if (entry->type == SVN_FS_FS__ITEM_TYPE_CHANGES)
SVN_ERR(copy_item_to_temp(context,
context->changes,
context->changes_file,
rev_file->file, entry,
iterpool2));
else if (entry->type == SVN_FS_FS__ITEM_TYPE_FILE_PROPS)
SVN_ERR(copy_item_to_temp(context,
context->file_props,
context->file_props_file,
rev_file->file, entry,
iterpool2));
else if (entry->type == SVN_FS_FS__ITEM_TYPE_DIR_PROPS)
SVN_ERR(copy_item_to_temp(context,
context->dir_props,
context->dir_props_file,
rev_file->file, entry,
iterpool2));
else if ( entry->type == SVN_FS_FS__ITEM_TYPE_FILE_REP
|| entry->type == SVN_FS_FS__ITEM_TYPE_DIR_REP)
SVN_ERR(copy_rep_to_temp(context, rev_file->file, entry,
iterpool2));
else if (entry->type == SVN_FS_FS__ITEM_TYPE_NODEREV)
SVN_ERR(copy_node_to_temp(context, rev_file->file, entry,
iterpool2));
else
SVN_ERR_ASSERT(entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED);
offset += entry->size;
}
}
if (context->cancel_func)
SVN_ERR(context->cancel_func(context->cancel_baton));
}
}
svn_pool_destroy(iterpool2);
svn_pool_destroy(iterpool);
/* phase 3: placement.
* Use "newest first" placement for simple items. */
sort_items(context->changes);
sort_items(context->file_props);
sort_items(context->dir_props);
/* follow dependencies recursively for noderevs and data representations */
sort_reps(context);
/* phase 4: copy bucket data to pack file. Write P2L index. */
SVN_ERR(store_items(context, context->changes_file, context->changes,
revpool));
svn_pool_clear(revpool);
SVN_ERR(store_items(context, context->file_props_file, context->file_props,
revpool));
svn_pool_clear(revpool);
SVN_ERR(store_items(context, context->dir_props_file, context->dir_props,
revpool));
svn_pool_clear(revpool);
SVN_ERR(copy_reps_from_temp(context, context->reps_file, revpool));
svn_pool_clear(revpool);
/* write L2P index as well (now that we know all target offsets) */
SVN_ERR(write_l2p_index(context, revpool));
svn_pool_destroy(revpool);
return SVN_NO_ERROR;
}
/* Append CONTEXT->START_REV to the context's pack file with no re-ordering.
* This function will only be used for very large revisions (>>100k changes).
* Use POOL for temporary allocations.
*/
static svn_error_t *
append_revision(pack_context_t *context,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = context->fs->fsap_data;
apr_off_t offset = 0;
apr_pool_t *iterpool = svn_pool_create(pool);
svn_fs_fs__revision_file_t *rev_file;
- apr_finfo_t finfo;
+ svn_filesize_t revdata_size;
- /* Get the size of the file. */
- const char *path = svn_dirent_join(context->shard_dir,
- apr_psprintf(iterpool, "%ld",
- context->start_rev),
- pool);
- SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, pool));
-
- /* Copy all the bits from the rev file to the end of the pack file. */
+ /* Copy all non-index contents the rev file to the end of the pack file. */
SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, context->fs,
context->start_rev, pool,
iterpool));
+
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ revdata_size = rev_file->l2p_offset;
+
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, ffd->block_size, NULL, 0,
+ iterpool));
SVN_ERR(copy_file_data(context, context->pack_file, rev_file->file,
- finfo.size, iterpool));
+ revdata_size, iterpool));
/* mark the start of a new revision */
SVN_ERR(svn_fs_fs__l2p_proto_index_add_revision(context->proto_l2p_index,
pool));
/* read the phys-to-log index file until we covered the whole rev file.
* That index contains enough info to build both target indexes from it. */
- while (offset < finfo.size)
+ while (offset < revdata_size)
{
/* read one cluster */
int i;
apr_array_header_t *entries;
svn_pool_clear(iterpool);
SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, context->fs, rev_file,
context->start_rev, offset,
ffd->p2l_page_size, iterpool,
iterpool));
for (i = 0; i < entries->nelts; ++i)
{
svn_fs_fs__p2l_entry_t *entry
= &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
/* skip first entry if that was duplicated due crossing a
cluster boundary */
if (offset > entry->offset)
continue;
/* process entry while inside the rev file */
offset = entry->offset;
- if (offset < finfo.size)
+ if (offset < revdata_size)
{
entry->offset += context->pack_offset;
offset += entry->size;
SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(
context->proto_l2p_index, entry->offset,
entry->item.number, iterpool));
SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(
context->proto_p2l_index, entry, iterpool));
}
}
}
svn_pool_destroy(iterpool);
- context->pack_offset += finfo.size;
+ context->pack_offset += revdata_size;
SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
return SVN_NO_ERROR;
}
/* Logical addressing mode packing logic.
*
* Pack the revision shard starting at SHARD_REV in filesystem FS from
* SHARD_DIR into the PACK_FILE_DIR, using POOL for allocations. Limit
* the extra memory consumption to MAX_MEM bytes. CANCEL_FUNC and
* CANCEL_BATON are what you think they are.
*/
static svn_error_t *
pack_log_addressed(svn_fs_t *fs,
const char *pack_file_dir,
const char *shard_dir,
svn_revnum_t shard_rev,
apr_size_t max_mem,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
enum
{
/* estimated amount of memory used to represent one item in memory
* during rev file packing */
PER_ITEM_MEM = APR_ALIGN_DEFAULT(sizeof(path_order_t))
+ APR_ALIGN_DEFAULT(2 *sizeof(void*))
+ APR_ALIGN_DEFAULT(sizeof(reference_t))
+ APR_ALIGN_DEFAULT(sizeof(svn_fs_fs__p2l_entry_t))
+ 6 * sizeof(void*)
};
int max_items;
apr_array_header_t *max_ids;
pack_context_t context = { 0 };
int i;
apr_size_t item_count = 0;
apr_pool_t *iterpool = svn_pool_create(pool);
/* Prevent integer overflow. We use apr arrays to process the items so
* the maximum number of items is INT_MAX. */
{
apr_size_t temp = max_mem / PER_ITEM_MEM;
SVN_ERR_ASSERT(temp <= INT_MAX);
max_items = (int)temp;
}
/* set up a pack context */
SVN_ERR(initialize_pack_context(&context, fs, pack_file_dir, shard_dir,
shard_rev, max_items, cancel_func,
cancel_baton, pool));
/* phase 1: determine the size of the revisions to pack */
SVN_ERR(svn_fs_fs__l2p_get_max_ids(&max_ids, fs, shard_rev,
context.shard_end_rev - shard_rev,
pool, pool));
/* pack revisions in ranges that don't exceed MAX_MEM */
for (i = 0; i < max_ids->nelts; ++i)
if (APR_ARRAY_IDX(max_ids, i, apr_uint64_t) + item_count <= max_items)
{
+ item_count += APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
context.end_rev++;
}
else
{
svn_pool_clear(iterpool);
/* some unpacked revisions before this one? */
if (context.start_rev < context.end_rev)
{
/* pack them intelligently (might be just 1 rev but still ...) */
SVN_ERR(pack_range(&context, iterpool));
SVN_ERR(reset_pack_context(&context, iterpool));
item_count = 0;
}
/* next revision range is to start with the current revision */
context.start_rev = i + context.shard_rev;
context.end_rev = context.start_rev + 1;
/* if this is a very large revision, we must place it as is */
if (APR_ARRAY_IDX(max_ids, i, apr_uint64_t) > max_items)
{
SVN_ERR(append_revision(&context, iterpool));
context.start_rev++;
}
else
item_count += (apr_size_t)APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
}
/* non-empty revision range at the end? */
if (context.start_rev < context.end_rev)
SVN_ERR(pack_range(&context, iterpool));
/* last phase: finalize indexes and clean up */
SVN_ERR(reset_pack_context(&context, iterpool));
SVN_ERR(close_pack_context(&context, iterpool));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Given REV in FS, set *REV_OFFSET to REV's offset in the packed file.
Use POOL for temporary allocations. */
svn_error_t *
svn_fs_fs__get_packed_offset(apr_off_t *rev_offset,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_stream_t *manifest_stream;
svn_boolean_t is_cached;
svn_revnum_t shard;
apr_int64_t shard_pos;
apr_array_header_t *manifest;
apr_pool_t *iterpool;
shard = rev / ffd->max_files_per_dir;
/* position of the shard within the manifest */
shard_pos = rev % ffd->max_files_per_dir;
/* fetch exactly that element into *rev_offset, if the manifest is found
in the cache */
SVN_ERR(svn_cache__get_partial((void **) rev_offset, &is_cached,
ffd->packed_offset_cache, &shard,
svn_fs_fs__get_sharded_offset, &shard_pos,
pool));
if (is_cached)
return SVN_NO_ERROR;
/* Open the manifest file. */
SVN_ERR(svn_stream_open_readonly(&manifest_stream,
svn_fs_fs__path_rev_packed(fs, rev,
PATH_MANIFEST,
pool),
pool, pool));
/* While we're here, let's just read the entire manifest file into an array,
so we can cache the entire thing. */
iterpool = svn_pool_create(pool);
manifest = apr_array_make(pool, ffd->max_files_per_dir, sizeof(apr_off_t));
while (1)
{
svn_boolean_t eof;
apr_int64_t val;
svn_pool_clear(iterpool);
SVN_ERR(svn_fs_fs__read_number_from_stream(&val, &eof, manifest_stream,
iterpool));
if (eof)
break;
APR_ARRAY_PUSH(manifest, apr_off_t) = (apr_off_t)val;
}
svn_pool_destroy(iterpool);
*rev_offset = APR_ARRAY_IDX(manifest, rev % ffd->max_files_per_dir,
apr_off_t);
/* Close up shop and cache the array. */
SVN_ERR(svn_stream_close(manifest_stream));
return svn_cache__set(ffd->packed_offset_cache, &shard, manifest, pool);
}
/* Packing logic for physical addresssing mode:
* Simply concatenate all revision contents.
*
* Pack the revision shard starting at SHARD_REV containing exactly
* MAX_FILES_PER_DIR revisions from SHARD_PATH into the PACK_FILE_DIR,
* using POOL for allocations. CANCEL_FUNC and CANCEL_BATON are what you
* think they are.
*/
static svn_error_t *
pack_phys_addressed(const char *pack_file_dir,
const char *shard_path,
svn_revnum_t start_rev,
int max_files_per_dir,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
const char *pack_file_path, *manifest_file_path;
apr_file_t *pack_file;
apr_file_t *manifest_file;
svn_stream_t *manifest_stream;
svn_revnum_t end_rev, rev;
apr_off_t next_offset;
apr_pool_t *iterpool;
/* Some useful paths. */
pack_file_path = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
manifest_file_path = svn_dirent_join(pack_file_dir, PATH_MANIFEST, pool);
/* Create the new directory and pack file.
* Use unbuffered apr_file_t since we're going to write using 16kb
* chunks. */
SVN_ERR(svn_io_file_open(&pack_file, pack_file_path,
APR_WRITE | APR_CREATE | APR_EXCL,
APR_OS_DEFAULT, pool));
/* Create the manifest file. */
SVN_ERR(svn_io_file_open(&manifest_file, manifest_file_path,
APR_WRITE | APR_BUFFERED | APR_CREATE | APR_EXCL,
APR_OS_DEFAULT, pool));
manifest_stream = svn_stream_from_aprfile2(manifest_file, TRUE, pool);
end_rev = start_rev + max_files_per_dir - 1;
next_offset = 0;
iterpool = svn_pool_create(pool);
/* Iterate over the revisions in this shard, squashing them together. */
for (rev = start_rev; rev <= end_rev; rev++)
{
svn_stream_t *rev_stream;
apr_finfo_t finfo;
const char *path;
svn_pool_clear(iterpool);
/* Get the size of the file. */
path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
iterpool);
SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, iterpool));
/* build manifest */
SVN_ERR(svn_stream_printf(manifest_stream, iterpool,
"%" APR_OFF_T_FMT "\n", next_offset));
next_offset += finfo.size;
/* Copy all the bits from the rev file to the end of the pack file. */
SVN_ERR(svn_stream_open_readonly(&rev_stream, path, iterpool, iterpool));
SVN_ERR(svn_stream_copy3(rev_stream,
svn_stream_from_aprfile2(pack_file, TRUE, pool),
cancel_func, cancel_baton, iterpool));
}
/* Close stream over APR file. */
SVN_ERR(svn_stream_close(manifest_stream));
/* Ensure that pack file is written to disk. */
SVN_ERR(svn_io_file_flush_to_disk(manifest_file, pool));
SVN_ERR(svn_io_file_close(manifest_file, pool));
/* disallow write access to the manifest file */
SVN_ERR(svn_io_set_file_read_only(manifest_file_path, FALSE, iterpool));
/* Ensure that pack file is written to disk. */
SVN_ERR(svn_io_file_flush_to_disk(pack_file, pool));
SVN_ERR(svn_io_file_close(pack_file, pool));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* In filesystem FS, pack the revision SHARD containing exactly
* MAX_FILES_PER_DIR revisions from SHARD_PATH into the PACK_FILE_DIR,
* using POOL for allocations. Try to limit the amount of temporary
* memory needed to MAX_MEM bytes. CANCEL_FUNC and CANCEL_BATON are what
* you think they are.
*
* If for some reason we detect a partial packing already performed, we
* remove the pack file and start again.
*
* The actual packing will be done in a format-specific sub-function.
*/
static svn_error_t *
pack_rev_shard(svn_fs_t *fs,
const char *pack_file_dir,
const char *shard_path,
apr_int64_t shard,
int max_files_per_dir,
apr_size_t max_mem,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
const char *pack_file_path;
svn_revnum_t shard_rev = (svn_revnum_t) (shard * max_files_per_dir);
/* Some useful paths. */
pack_file_path = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
/* Remove any existing pack file for this shard, since it is incomplete. */
SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
pool));
/* Create the new directory and pack file. */
SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, pool));
/* Index information files */
if (svn_fs_fs__use_log_addressing(fs))
SVN_ERR(pack_log_addressed(fs, pack_file_dir, shard_path, shard_rev,
max_mem, cancel_func, cancel_baton, pool));
else
SVN_ERR(pack_phys_addressed(pack_file_dir, shard_path, shard_rev,
max_files_per_dir, cancel_func,
cancel_baton, pool));
SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, pool));
SVN_ERR(svn_io_set_file_read_only(pack_file_path, FALSE, pool));
return SVN_NO_ERROR;
}
/* Baton struct used by pack_body(), pack_shard() and synced_pack_shard().
These calls are nested and for every level additional fields will be
available. */
struct pack_baton
{
/* Valid when entering pack_body(). */
svn_fs_t *fs;
svn_fs_pack_notify_t notify_func;
void *notify_baton;
svn_cancel_func_t cancel_func;
void *cancel_baton;
+ size_t max_mem;
/* Additional entries valid when entering pack_shard(). */
const char *revs_dir;
const char *revsprops_dir;
apr_int64_t shard;
/* Additional entries valid when entering synced_pack_shard(). */
const char *rev_shard_path;
};
/* Part of the pack process that requires global (write) synchronization.
* We pack the revision properties of the shard described by BATON and
* In the file system at FS_PATH, pack the SHARD in REVS_DIR and replace
* the non-packed revprop & rev shard folder(s) with the packed ones.
* The packed rev folder has been created prior to calling this function.
*/
static svn_error_t *
synced_pack_shard(void *baton,
apr_pool_t *pool)
{
struct pack_baton *pb = baton;
fs_fs_data_t *ffd = pb->fs->fsap_data;
const char *revprops_shard_path, *revprops_pack_file_dir;
/* if enabled, pack the revprops in an equivalent way */
if (pb->revsprops_dir)
{
revprops_pack_file_dir = svn_dirent_join(pb->revsprops_dir,
apr_psprintf(pool,
"%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
pb->shard),
pool);
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
apr_psprintf(pool, "%" APR_INT64_T_FMT, pb->shard),
pool);
SVN_ERR(svn_fs_fs__pack_revprops_shard(revprops_pack_file_dir,
revprops_shard_path,
pb->shard,
ffd->max_files_per_dir,
(int)(0.9*ffd->revprop_pack_size),
ffd->compress_packed_revprops
? SVN__COMPRESSION_ZLIB_DEFAULT
: SVN__COMPRESSION_NONE,
pb->cancel_func,
pb->cancel_baton,
pool));
}
/* Update the min-unpacked-rev file to reflect our newly packed shard. */
SVN_ERR(svn_fs_fs__write_min_unpacked_rev(pb->fs,
(svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir),
pool));
ffd->min_unpacked_rev
= (svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir);
/* Finally, remove the existing shard directories.
* For revprops, clean up older obsolete shards as well as they might
* have been left over from an interrupted FS upgrade. */
SVN_ERR(svn_io_remove_dir2(pb->rev_shard_path, TRUE,
pb->cancel_func, pb->cancel_baton, pool));
if (pb->revsprops_dir)
{
svn_node_kind_t kind = svn_node_dir;
apr_int64_t to_cleanup = pb->shard;
do
{
SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
to_cleanup,
ffd->max_files_per_dir,
pb->cancel_func,
pb->cancel_baton,
pool));
/* If the previous shard exists, clean it up as well.
Don't try to clean up shard 0 as it we can't tell quickly
whether it actually needs cleaning up. */
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
pool);
SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
}
while (kind == svn_node_dir && to_cleanup > 0);
}
return SVN_NO_ERROR;
}
/* Pack the shard described by BATON.
*
* If for some reason we detect a partial packing already performed,
* we remove the pack file and start again.
*/
static svn_error_t *
pack_shard(struct pack_baton *baton,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = baton->fs->fsap_data;
const char *rev_pack_file_dir;
/* Notify caller we're starting to pack this shard. */
if (baton->notify_func)
SVN_ERR(baton->notify_func(baton->notify_baton, baton->shard,
svn_fs_pack_notify_start, pool));
/* Some useful paths. */
rev_pack_file_dir = svn_dirent_join(baton->revs_dir,
apr_psprintf(pool,
"%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
baton->shard),
pool);
baton->rev_shard_path = svn_dirent_join(baton->revs_dir,
apr_psprintf(pool,
"%" APR_INT64_T_FMT,
baton->shard),
pool);
/* pack the revision content */
SVN_ERR(pack_rev_shard(baton->fs, rev_pack_file_dir, baton->rev_shard_path,
baton->shard, ffd->max_files_per_dir,
- DEFAULT_MAX_MEM, baton->cancel_func,
+ baton->max_mem, baton->cancel_func,
baton->cancel_baton, pool));
/* For newer repo formats, we only acquired the pack lock so far.
Before modifying the repo state by switching over to the packed
data, we need to acquire the global (write) lock. */
if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
SVN_ERR(svn_fs_fs__with_write_lock(baton->fs, synced_pack_shard, baton,
pool));
else
SVN_ERR(synced_pack_shard(baton, pool));
/* Notify caller we're starting to pack this shard. */
if (baton->notify_func)
SVN_ERR(baton->notify_func(baton->notify_baton, baton->shard,
svn_fs_pack_notify_end, pool));
return SVN_NO_ERROR;
}
/* The work-horse for svn_fs_fs__pack, called with the FS write lock.
This implements the svn_fs_fs__with_write_lock() 'body' callback
type. BATON is a 'struct pack_baton *'.
WARNING: if you add a call to this function, please note:
The code currently assumes that any piece of code running with
the write-lock set can rely on the ffd->min_unpacked_rev and
ffd->min_unpacked_revprop caches to be up-to-date (and, by
extension, on not having to use a retry when calling
svn_fs_fs__path_rev_absolute() and friends). If you add a call
to this function, consider whether you have to call
svn_fs_fs__update_min_unpacked_rev().
See this thread: http://thread.gmane.org/1291206765.3782.3309.camel@edith
*/
static svn_error_t *
pack_body(void *baton,
apr_pool_t *pool)
{
struct pack_baton *pb = baton;
fs_fs_data_t *ffd = pb->fs->fsap_data;
apr_int64_t completed_shards;
svn_revnum_t youngest;
apr_pool_t *iterpool;
/* If the repository isn't a new enough format, we don't support packing.
Return a friendly error to that effect. */
if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT)
return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("FSFS format (%d) too old to pack; please upgrade the filesystem."),
ffd->format);
/* If we aren't using sharding, we can't do any packing, so quit. */
if (!ffd->max_files_per_dir)
return SVN_NO_ERROR;
SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, pb->fs,
pool));
SVN_ERR(svn_fs_fs__youngest_rev(&youngest, pb->fs, pool));
completed_shards = (youngest + 1) / ffd->max_files_per_dir;
/* See if we've already completed all possible shards thus far. */
if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
return SVN_NO_ERROR;
pb->revs_dir = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, pool);
if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
pb->revsprops_dir = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR,
pool);
iterpool = svn_pool_create(pool);
for (pb->shard = ffd->min_unpacked_rev / ffd->max_files_per_dir;
pb->shard < completed_shards;
pb->shard++)
{
svn_pool_clear(iterpool);
if (pb->cancel_func)
SVN_ERR(pb->cancel_func(pb->cancel_baton));
SVN_ERR(pack_shard(pb, iterpool));
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__pack(svn_fs_t *fs,
+ apr_size_t max_mem,
svn_fs_pack_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
struct pack_baton pb = { 0 };
fs_fs_data_t *ffd = fs->fsap_data;
svn_error_t *err;
pb.fs = fs;
pb.notify_func = notify_func;
pb.notify_baton = notify_baton;
pb.cancel_func = cancel_func;
pb.cancel_baton = cancel_baton;
+ pb.max_mem = max_mem ? max_mem : DEFAULT_MAX_MEM;
if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
{
/* Newer repositories provide a pack operation specific lock.
Acquire it to prevent concurrent packs.
Since the file lock's lifetime is bound to a pool, we create a
separate subpool here to release the lock immediately after the
operation finished.
*/
err = svn_fs_fs__with_pack_lock(fs, pack_body, &pb, pool);
}
else
{
/* Use the global write lock for older repos. */
err = svn_fs_fs__with_write_lock(fs, pack_body, &pb, pool);
}
return svn_error_trace(err);
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/pack.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/pack.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/pack.h (revision 309511)
@@ -1,64 +1,70 @@
/* pack.h : interface FSFS pack functionality
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#ifndef SVN_LIBSVN_FS__PACK_H
#define SVN_LIBSVN_FS__PACK_H
#include "fs.h"
/* Possibly pack the repository at PATH. This just take full shards, and
- combines all the revision files into a single one, with a manifest header.
+ combines all the revision files into a single one, with a manifest header
+ when required by the repository format.
+
+ MAX_MEM limits the size of in-memory data structures needed for reordering
+ items in format 7 repositories. 0 means use the built-in default.
+
If given, NOTIFY_FUNC will be called with NOTIFY_BATON to report progress.
Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
Existing filesystem references need not change. */
svn_error_t *
svn_fs_fs__pack(svn_fs_t *fs,
+ apr_size_t max_mem,
svn_fs_pack_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool);
/**
* For the packed revision @a rev in @a fs, determine the offset within
* the revision pack file and return it in @a rev_offset. Use @a pool for
* allocations.
*/
svn_error_t *
svn_fs_fs__get_packed_offset(apr_off_t *rev_offset,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool);
/* Return the svn_dir_entry_t* objects of DIRECTORY in an APR array
* allocated in RESULT_POOL with entries added in storage (on-disk) order.
* FS' format will be used to pick the optimal ordering strategy. Use
* SCRATCH_POOL for temporary allocations.
*/
apr_array_header_t *
svn_fs_fs__order_dir_entries(svn_fs_t *fs,
apr_hash_t *directory,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
#endif
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache-db.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache-db.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache-db.h (revision 309511)
@@ -1,91 +1,91 @@
-/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_fs_fs/token-map.h.
+/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_fs_fs/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_CREATE_SCHEMA 0
#define STMT_0_INFO {"STMT_CREATE_SCHEMA", NULL}
#define STMT_0 \
"CREATE TABLE rep_cache ( " \
" hash TEXT NOT NULL PRIMARY KEY, " \
" revision INTEGER NOT NULL, " \
" offset INTEGER NOT NULL, " \
" size INTEGER NOT NULL, " \
" expanded_size INTEGER NOT NULL " \
" ); " \
"PRAGMA USER_VERSION = 1; " \
""
#define STMT_GET_REP 1
#define STMT_1_INFO {"STMT_GET_REP", NULL}
#define STMT_1 \
"SELECT revision, offset, size, expanded_size " \
"FROM rep_cache " \
"WHERE hash = ?1 " \
""
#define STMT_SET_REP 2
#define STMT_2_INFO {"STMT_SET_REP", NULL}
#define STMT_2 \
"INSERT OR FAIL INTO rep_cache (hash, revision, offset, size, expanded_size) " \
"VALUES (?1, ?2, ?3, ?4, ?5) " \
""
#define STMT_GET_REPS_FOR_RANGE 3
#define STMT_3_INFO {"STMT_GET_REPS_FOR_RANGE", NULL}
#define STMT_3 \
"SELECT hash, revision, offset, size, expanded_size " \
"FROM rep_cache " \
"WHERE revision >= ?1 AND revision <= ?2 " \
""
#define STMT_GET_MAX_REV 4
#define STMT_4_INFO {"STMT_GET_MAX_REV", NULL}
#define STMT_4 \
"SELECT MAX(revision) " \
"FROM rep_cache " \
""
#define STMT_DEL_REPS_YOUNGER_THAN_REV 5
#define STMT_5_INFO {"STMT_DEL_REPS_YOUNGER_THAN_REV", NULL}
#define STMT_5 \
"DELETE FROM rep_cache " \
"WHERE revision > ?1 " \
""
#define STMT_LOCK_REP 6
#define STMT_6_INFO {"STMT_LOCK_REP", NULL}
#define STMT_6 \
"BEGIN TRANSACTION; " \
"INSERT INTO rep_cache VALUES ('dummy', 0, 0, 0, 0) " \
""
#define STMT_UNLOCK_REP 7
#define STMT_7_INFO {"STMT_UNLOCK_REP", NULL}
#define STMT_7 \
"ROLLBACK TRANSACTION; " \
""
#define REP_CACHE_DB_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
STMT_1, \
STMT_2, \
STMT_3, \
STMT_4, \
STMT_5, \
STMT_6, \
STMT_7, \
NULL \
}
#define REP_CACHE_DB_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
STMT_1_INFO, \
STMT_2_INFO, \
STMT_3_INFO, \
STMT_4_INFO, \
STMT_5_INFO, \
STMT_6_INFO, \
STMT_7_INFO, \
{NULL, NULL} \
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.c (revision 309511)
@@ -1,418 +1,440 @@
/* rep-sharing.c --- the rep-sharing cache for fsfs
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "svn_pools.h"
#include "svn_private_config.h"
#include "fs_fs.h"
#include "fs.h"
#include "rep-cache.h"
#include "../libsvn_fs/fs-loader.h"
#include "svn_path.h"
#include "private/svn_sqlite.h"
#include "rep-cache-db.h"
/* A few magic values */
#define REP_CACHE_SCHEMA_FORMAT 1
REP_CACHE_DB_SQL_DECLARE_STATEMENTS(statements);
/** Helper functions. **/
static APR_INLINE const char *
path_rep_cache_db(const char *fs_path,
apr_pool_t *result_pool)
{
return svn_dirent_join(fs_path, REP_CACHE_DB_NAME, result_pool);
}
+#define SVN_ERR_CLOSE(x, db) do \
+{ \
+ svn_error_t *svn__err = (x); \
+ if (svn__err) \
+ return svn_error_compose_create(svn__err, svn_sqlite__close(db)); \
+} while (0)
+
/** Library-private API's. **/
/* Body of svn_fs_fs__open_rep_cache().
Implements svn_atomic__init_once().init_func.
*/
static svn_error_t *
open_rep_cache(void *baton,
apr_pool_t *pool)
{
svn_fs_t *fs = baton;
fs_fs_data_t *ffd = fs->fsap_data;
svn_sqlite__db_t *sdb;
const char *db_path;
int version;
/* Open (or create) the sqlite database. It will be automatically
closed when fs->pool is destroyed. */
db_path = path_rep_cache_db(fs->path, pool);
#ifndef WIN32
{
/* We want to extend the permissions that apply to the repository
as a whole when creating a new rep cache and not simply default
to umask. */
svn_boolean_t exists;
SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, fs, pool));
if (!exists)
{
const char *current = svn_fs_fs__path_current(fs, pool);
svn_error_t *err = svn_io_file_create_empty(db_path, pool);
if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
/* A real error. */
return svn_error_trace(err);
else if (err)
/* Some other thread/process created the file. */
svn_error_clear(err);
else
/* We created the file. */
SVN_ERR(svn_io_copy_perms(current, db_path, pool));
}
}
#endif
SVN_ERR(svn_sqlite__open(&sdb, db_path,
svn_sqlite__mode_rwcreate, statements,
0, NULL, 0,
fs->pool, pool));
- SVN_ERR(svn_sqlite__read_schema_version(&version, sdb, pool));
+ SVN_ERR_CLOSE(svn_sqlite__read_schema_version(&version, sdb, pool), sdb);
if (version < REP_CACHE_SCHEMA_FORMAT)
{
/* Must be 0 -- an uninitialized (no schema) database. Create
the schema. Results in schema version of 1. */
- SVN_ERR(svn_sqlite__exec_statements(sdb, STMT_CREATE_SCHEMA));
+ SVN_ERR_CLOSE(svn_sqlite__exec_statements(sdb, STMT_CREATE_SCHEMA), sdb);
}
/* This is used as a flag that the database is available so don't
set it earlier. */
ffd->rep_cache_db = sdb;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__open_rep_cache(svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_error_t *err = svn_atomic__init_once(&ffd->rep_cache_db_opened,
open_rep_cache, fs, pool);
return svn_error_quick_wrap(err, _("Couldn't open rep-cache database"));
+}
+
+svn_error_t *
+svn_fs_fs__close_rep_cache(svn_fs_t *fs)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ if (ffd->rep_cache_db)
+ {
+ SVN_ERR(svn_sqlite__close(ffd->rep_cache_db));
+ ffd->rep_cache_db = NULL;
+ ffd->rep_cache_db_opened = 0;
+ }
+
+ return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__exists_rep_cache(svn_boolean_t *exists,
svn_fs_t *fs, apr_pool_t *pool)
{
svn_node_kind_t kind;
SVN_ERR(svn_io_check_path(path_rep_cache_db(fs->path, pool),
&kind, pool));
*exists = (kind != svn_node_none);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__walk_rep_reference(svn_fs_t *fs,
svn_revnum_t start,
svn_revnum_t end,
svn_error_t *(*walker)(representation_t *,
void *,
svn_fs_t *,
apr_pool_t *),
void *walker_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
int iterations = 0;
apr_pool_t *iterpool = svn_pool_create(pool);
/* Don't check ffd->rep_sharing_allowed. */
SVN_ERR_ASSERT(ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT);
if (! ffd->rep_cache_db)
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* Check global invariants. */
if (start == 0)
{
svn_revnum_t max;
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
STMT_GET_MAX_REV));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
max = svn_sqlite__column_revnum(stmt, 0);
SVN_ERR(svn_sqlite__reset(stmt));
if (SVN_IS_VALID_REVNUM(max)) /* The rep-cache could be empty. */
SVN_ERR(svn_fs_fs__ensure_revision_exists(max, fs, iterpool));
}
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
STMT_GET_REPS_FOR_RANGE));
SVN_ERR(svn_sqlite__bindf(stmt, "rr",
start, end));
/* Walk the cache entries. */
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while (have_row)
{
representation_t *rep;
const char *sha1_digest;
svn_error_t *err;
svn_checksum_t *checksum;
/* Clear ITERPOOL occasionally. */
if (iterations++ % 16 == 0)
svn_pool_clear(iterpool);
/* Check for cancellation. */
if (cancel_func)
{
err = cancel_func(cancel_baton);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
}
/* Construct a representation_t. */
rep = apr_pcalloc(iterpool, sizeof(*rep));
svn_fs_fs__id_txn_reset(&rep->txn_id);
sha1_digest = svn_sqlite__column_text(stmt, 0, iterpool);
err = svn_checksum_parse_hex(&checksum, svn_checksum_sha1,
sha1_digest, iterpool);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
rep->has_sha1 = TRUE;
memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
rep->revision = svn_sqlite__column_revnum(stmt, 1);
rep->item_index = svn_sqlite__column_int64(stmt, 2);
rep->size = svn_sqlite__column_int64(stmt, 3);
rep->expanded_size = svn_sqlite__column_int64(stmt, 4);
/* Walk. */
err = walker(rep, walker_baton, fs, iterpool);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
SVN_ERR(svn_sqlite__reset(stmt));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* This function's caller ignores most errors it returns.
If you extend this function, check the callsite to see if you have
to make it not-ignore additional error codes. */
svn_error_t *
svn_fs_fs__get_rep_reference(representation_t **rep,
svn_fs_t *fs,
svn_checksum_t *checksum,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
if (! ffd->rep_cache_db)
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* We only allow SHA1 checksums in this table. */
if (checksum->kind != svn_checksum_sha1)
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
_("Only SHA1 checksums can be used as keys in the "
"rep_cache table.\n"));
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db, STMT_GET_REP));
SVN_ERR(svn_sqlite__bindf(stmt, "s",
svn_checksum_to_cstring(checksum, pool)));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
if (have_row)
{
*rep = apr_pcalloc(pool, sizeof(**rep));
svn_fs_fs__id_txn_reset(&(*rep)->txn_id);
memcpy((*rep)->sha1_digest, checksum->digest,
sizeof((*rep)->sha1_digest));
(*rep)->has_sha1 = TRUE;
(*rep)->revision = svn_sqlite__column_revnum(stmt, 0);
(*rep)->item_index = svn_sqlite__column_int64(stmt, 1);
(*rep)->size = svn_sqlite__column_int64(stmt, 2);
(*rep)->expanded_size = svn_sqlite__column_int64(stmt, 3);
}
else
*rep = NULL;
SVN_ERR(svn_sqlite__reset(stmt));
if (*rep)
{
/* Check that REP refers to a revision that exists in FS. */
svn_error_t *err = svn_fs_fs__ensure_revision_exists((*rep)->revision,
fs, pool);
if (err)
return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
"Checksum '%s' in rep-cache is beyond HEAD",
svn_checksum_to_cstring_display(checksum,
pool));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__set_rep_reference(svn_fs_t *fs,
representation_t *rep,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_sqlite__stmt_t *stmt;
svn_error_t *err;
svn_checksum_t checksum;
checksum.kind = svn_checksum_sha1;
checksum.digest = rep->sha1_digest;
SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
if (! ffd->rep_cache_db)
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* We only allow SHA1 checksums in this table. */
if (! rep->has_sha1)
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
_("Only SHA1 checksums can be used as keys in the "
"rep_cache table.\n"));
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db, STMT_SET_REP));
SVN_ERR(svn_sqlite__bindf(stmt, "siiii",
svn_checksum_to_cstring(&checksum, pool),
(apr_int64_t) rep->revision,
(apr_int64_t) rep->item_index,
(apr_int64_t) rep->size,
(apr_int64_t) rep->expanded_size));
err = svn_sqlite__insert(NULL, stmt);
if (err)
{
representation_t *old_rep;
if (err->apr_err != SVN_ERR_SQLITE_CONSTRAINT)
return svn_error_trace(err);
svn_error_clear(err);
/* Constraint failed so the mapping for SHA1_CHECKSUM->REP
should exist. If so that's cool -- just do nothing. If not,
that's a red flag! */
SVN_ERR(svn_fs_fs__get_rep_reference(&old_rep, fs, &checksum, pool));
if (!old_rep)
{
/* Something really odd at this point, we failed to insert the
checksum AND failed to read an existing checksum. Do we need
to flag this? */
}
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__del_rep_reference(svn_fs_t *fs,
svn_revnum_t youngest,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_sqlite__stmt_t *stmt;
SVN_ERR_ASSERT(ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT);
if (! ffd->rep_cache_db)
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
STMT_DEL_REPS_YOUNGER_THAN_REV));
SVN_ERR(svn_sqlite__bindf(stmt, "r", youngest));
SVN_ERR(svn_sqlite__step_done(stmt));
return SVN_NO_ERROR;
}
/* Start a transaction to take an SQLite reserved lock that prevents
other writes.
See unlock_rep_cache(). */
static svn_error_t *
lock_rep_cache(svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
if (! ffd->rep_cache_db)
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
SVN_ERR(svn_sqlite__exec_statements(ffd->rep_cache_db, STMT_LOCK_REP));
return SVN_NO_ERROR;
}
/* End the transaction started by lock_rep_cache(). */
static svn_error_t *
unlock_rep_cache(svn_fs_t *fs,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
SVN_ERR_ASSERT(ffd->rep_cache_db); /* was opened by lock_rep_cache() */
SVN_ERR(svn_sqlite__exec_statements(ffd->rep_cache_db, STMT_UNLOCK_REP));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__with_rep_cache_lock(svn_fs_t *fs,
svn_error_t *(*body)(void *,
apr_pool_t *),
void *baton,
apr_pool_t *pool)
{
svn_error_t *err;
SVN_ERR(lock_rep_cache(fs, pool));
err = body(baton, pool);
return svn_error_compose_create(err, unlock_rep_cache(fs, pool));
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.h (revision 309511)
@@ -1,103 +1,107 @@
/* rep-cache.h : interface to rep cache db functions
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#ifndef SVN_LIBSVN_FS_FS_REP_CACHE_H
#define SVN_LIBSVN_FS_FS_REP_CACHE_H
#include "svn_error.h"
#include "fs.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define REP_CACHE_DB_NAME "rep-cache.db"
/* Open and create, if needed, the rep cache database associated with FS.
Use POOL for temporary allocations. */
svn_error_t *
svn_fs_fs__open_rep_cache(svn_fs_t *fs,
apr_pool_t *pool);
+/* Close the rep cache database associated with FS. */
+svn_error_t *
+svn_fs_fs__close_rep_cache(svn_fs_t *fs);
+
/* Set *EXISTS to TRUE iff the rep-cache DB file exists. */
svn_error_t *
svn_fs_fs__exists_rep_cache(svn_boolean_t *exists,
svn_fs_t *fs, apr_pool_t *pool);
/* Iterate all representations currently in FS's cache. */
svn_error_t *
svn_fs_fs__walk_rep_reference(svn_fs_t *fs,
svn_revnum_t start,
svn_revnum_t end,
svn_error_t *(*walker)(representation_t *rep,
void *walker_baton,
svn_fs_t *fs,
apr_pool_t *scratch_pool),
void *walker_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool);
/* Return the representation REP in FS which has fulltext CHECKSUM.
REP is allocated in POOL. If the rep cache database has not been
opened, just set *REP to NULL. Returns SVN_ERR_FS_CORRUPT if
a reference beyond HEAD is detected. */
svn_error_t *
svn_fs_fs__get_rep_reference(representation_t **rep,
svn_fs_t *fs,
svn_checksum_t *checksum,
apr_pool_t *pool);
/* Set the representation REP in FS, using REP->CHECKSUM.
Use POOL for temporary allocations. Returns SVN_ERR_FS_CORRUPT if
an existing reference beyond HEAD is detected.
If the rep cache database has not been opened, this may be a no op. */
svn_error_t *
svn_fs_fs__set_rep_reference(svn_fs_t *fs,
representation_t *rep,
apr_pool_t *pool);
/* Delete from the cache all reps corresponding to revisions younger
than YOUNGEST. */
svn_error_t *
svn_fs_fs__del_rep_reference(svn_fs_t *fs,
svn_revnum_t youngest,
apr_pool_t *pool);
/* Start a transaction to take an SQLite reserved lock that prevents
other writes, call BODY, end the transaction, and return what BODY returned.
*/
svn_error_t *
svn_fs_fs__with_rep_cache_lock(svn_fs_t *fs,
svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
void *baton,
apr_pool_t *pool);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_LIBSVN_FS_FS_REP_CACHE_H */
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/transaction.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/transaction.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/transaction.c (revision 309511)
@@ -1,3858 +1,3877 @@
/* transaction.c --- transaction-related functions of FSFS
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "transaction.h"
#include <assert.h>
#include <apr_sha1.h>
#include "svn_hash.h"
#include "svn_props.h"
#include "svn_sorts.h"
#include "svn_time.h"
#include "svn_dirent_uri.h"
#include "fs_fs.h"
#include "index.h"
#include "tree.h"
#include "util.h"
#include "id.h"
#include "low_level.h"
#include "temp_serializer.h"
#include "cached_data.h"
#include "lock.h"
#include "rep-cache.h"
#include "private/svn_fs_util.h"
#include "private/svn_fspath.h"
#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_string_private.h"
#include "../libsvn_fs/fs-loader.h"
#include "svn_private_config.h"
/* Return the name of the sha1->rep mapping file in transaction TXN_ID
* within FS for the given SHA1 checksum. Use POOL for allocations.
*/
static APR_INLINE const char *
path_txn_sha1(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
const unsigned char *sha1,
apr_pool_t *pool)
{
svn_checksum_t checksum;
checksum.digest = sha1;
checksum.kind = svn_checksum_sha1;
return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
svn_checksum_to_cstring(&checksum, pool),
pool);
}
static APR_INLINE const char *
path_txn_changes(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
PATH_CHANGES, pool);
}
static APR_INLINE const char *
path_txn_props(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
PATH_TXN_PROPS, pool);
}
static APR_INLINE const char *
path_txn_props_final(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
PATH_TXN_PROPS_FINAL, pool);
}
static APR_INLINE const char *
path_txn_next_ids(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
PATH_NEXT_IDS, pool);
}
/* The vtable associated with an open transaction object. */
static txn_vtable_t txn_vtable = {
svn_fs_fs__commit_txn,
svn_fs_fs__abort_txn,
svn_fs_fs__txn_prop,
svn_fs_fs__txn_proplist,
svn_fs_fs__change_txn_prop,
svn_fs_fs__txn_root,
svn_fs_fs__change_txn_props
};
/* FSFS-specific data being attached to svn_fs_txn_t.
*/
typedef struct fs_txn_data_t
{
/* Strongly typed representation of the TXN's ID member. */
svn_fs_fs__id_part_t txn_id;
} fs_txn_data_t;
const svn_fs_fs__id_part_t *
svn_fs_fs__txn_get_id(svn_fs_txn_t *txn)
{
fs_txn_data_t *ftd = txn->fsap_data;
return &ftd->txn_id;
}
/* Functions for working with shared transaction data. */
/* Return the transaction object for transaction TXN_ID from the
transaction list of filesystem FS (which must already be locked via the
txn_list_lock mutex). If the transaction does not exist in the list,
then create a new transaction object and return it (if CREATE_NEW is
true) or return NULL (otherwise). */
static fs_fs_shared_txn_data_t *
get_shared_txn(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
svn_boolean_t create_new)
{
fs_fs_data_t *ffd = fs->fsap_data;
fs_fs_shared_data_t *ffsd = ffd->shared;
fs_fs_shared_txn_data_t *txn;
for (txn = ffsd->txns; txn; txn = txn->next)
if (svn_fs_fs__id_part_eq(&txn->txn_id, txn_id))
break;
if (txn || !create_new)
return txn;
/* Use the transaction object from the (single-object) freelist,
if one is available, or otherwise create a new object. */
if (ffsd->free_txn)
{
txn = ffsd->free_txn;
ffsd->free_txn = NULL;
}
else
{
apr_pool_t *subpool = svn_pool_create(ffsd->common_pool);
txn = apr_palloc(subpool, sizeof(*txn));
txn->pool = subpool;
}
txn->txn_id = *txn_id;
txn->being_written = FALSE;
/* Link this transaction into the head of the list. We will typically
be dealing with only one active transaction at a time, so it makes
sense for searches through the transaction list to look at the
newest transactions first. */
txn->next = ffsd->txns;
ffsd->txns = txn;
return txn;
}
/* Free the transaction object for transaction TXN_ID, and remove it
from the transaction list of filesystem FS (which must already be
locked via the txn_list_lock mutex). Do nothing if the transaction
does not exist. */
static void
free_shared_txn(svn_fs_t *fs, const svn_fs_fs__id_part_t *txn_id)
{
fs_fs_data_t *ffd = fs->fsap_data;
fs_fs_shared_data_t *ffsd = ffd->shared;
fs_fs_shared_txn_data_t *txn, *prev = NULL;
for (txn = ffsd->txns; txn; prev = txn, txn = txn->next)
if (svn_fs_fs__id_part_eq(&txn->txn_id, txn_id))
break;
if (!txn)
return;
if (prev)
prev->next = txn->next;
else
ffsd->txns = txn->next;
/* As we typically will be dealing with one transaction after another,
we will maintain a single-object free list so that we can hopefully
keep reusing the same transaction object. */
if (!ffsd->free_txn)
ffsd->free_txn = txn;
else
svn_pool_destroy(txn->pool);
}
/* Obtain a lock on the transaction list of filesystem FS, call BODY
with FS, BATON, and POOL, and then unlock the transaction list.
Return what BODY returned. */
static svn_error_t *
with_txnlist_lock(svn_fs_t *fs,
svn_error_t *(*body)(svn_fs_t *fs,
const void *baton,
apr_pool_t *pool),
const void *baton,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
fs_fs_shared_data_t *ffsd = ffd->shared;
SVN_MUTEX__WITH_LOCK(ffsd->txn_list_lock,
body(fs, baton, pool));
return SVN_NO_ERROR;
}
/* A structure used by unlock_proto_rev() and unlock_proto_rev_body(),
which see. */
struct unlock_proto_rev_baton
{
svn_fs_fs__id_part_t txn_id;
void *lockcookie;
};
/* Callback used in the implementation of unlock_proto_rev(). */
static svn_error_t *
unlock_proto_rev_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
{
const struct unlock_proto_rev_baton *b = baton;
apr_file_t *lockfile = b->lockcookie;
fs_fs_shared_txn_data_t *txn = get_shared_txn(fs, &b->txn_id, FALSE);
apr_status_t apr_err;
if (!txn)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Can't unlock unknown transaction '%s'"),
svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
if (!txn->being_written)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Can't unlock nonlocked transaction '%s'"),
svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
apr_err = apr_file_unlock(lockfile);
if (apr_err)
return svn_error_wrap_apr
(apr_err,
_("Can't unlock prototype revision lockfile for transaction '%s'"),
svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
apr_err = apr_file_close(lockfile);
if (apr_err)
return svn_error_wrap_apr
(apr_err,
_("Can't close prototype revision lockfile for transaction '%s'"),
svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
txn->being_written = FALSE;
return SVN_NO_ERROR;
}
/* Unlock the prototype revision file for transaction TXN_ID in filesystem
FS using cookie LOCKCOOKIE. The original prototype revision file must
have been closed _before_ calling this function.
Perform temporary allocations in POOL. */
static svn_error_t *
unlock_proto_rev(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
void *lockcookie,
apr_pool_t *pool)
{
struct unlock_proto_rev_baton b;
b.txn_id = *txn_id;
b.lockcookie = lockcookie;
return with_txnlist_lock(fs, unlock_proto_rev_body, &b, pool);
}
/* A structure used by get_writable_proto_rev() and
get_writable_proto_rev_body(), which see. */
struct get_writable_proto_rev_baton
{
void **lockcookie;
svn_fs_fs__id_part_t txn_id;
};
/* Callback used in the implementation of get_writable_proto_rev(). */
static svn_error_t *
get_writable_proto_rev_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
{
const struct get_writable_proto_rev_baton *b = baton;
void **lockcookie = b->lockcookie;
fs_fs_shared_txn_data_t *txn = get_shared_txn(fs, &b->txn_id, TRUE);
/* First, ensure that no thread in this process (including this one)
is currently writing to this transaction's proto-rev file. */
if (txn->being_written)
return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
_("Cannot write to the prototype revision file "
"of transaction '%s' because a previous "
"representation is currently being written by "
"this process"),
svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
/* We know that no thread in this process is writing to the proto-rev
file, and by extension, that no thread in this process is holding a
lock on the prototype revision lock file. It is therefore safe
for us to attempt to lock this file, to see if any other process
is holding a lock. */
{
apr_file_t *lockfile;
apr_status_t apr_err;
const char *lockfile_path
= svn_fs_fs__path_txn_proto_rev_lock(fs, &b->txn_id, pool);
/* Open the proto-rev lockfile, creating it if necessary, as it may
not exist if the transaction dates from before the lockfiles were
introduced.
### We'd also like to use something like svn_io_file_lock2(), but
that forces us to create a subpool just to be able to unlock
the file, which seems a waste. */
SVN_ERR(svn_io_file_open(&lockfile, lockfile_path,
APR_WRITE | APR_CREATE, APR_OS_DEFAULT, pool));
apr_err = apr_file_lock(lockfile,
APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK);
if (apr_err)
{
svn_error_clear(svn_io_file_close(lockfile, pool));
if (APR_STATUS_IS_EAGAIN(apr_err))
return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
_("Cannot write to the prototype revision "
"file of transaction '%s' because a "
"previous representation is currently "
"being written by another process"),
svn_fs_fs__id_txn_unparse(&b->txn_id,
pool));
return svn_error_wrap_apr(apr_err,
_("Can't get exclusive lock on file '%s'"),
svn_dirent_local_style(lockfile_path, pool));
}
*lockcookie = lockfile;
}
/* We've successfully locked the transaction; mark it as such. */
txn->being_written = TRUE;
return SVN_NO_ERROR;
}
/* Make sure the length ACTUAL_LENGTH of the proto-revision file PROTO_REV
of transaction TXN_ID in filesystem FS matches the proto-index file.
Trim any crash / failure related extra data from the proto-rev file.
If the prototype revision file is too short, we can't do much but bail out.
Perform all allocations in POOL. */
static svn_error_t *
auto_truncate_proto_rev(svn_fs_t *fs,
apr_file_t *proto_rev,
apr_off_t actual_length,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
/* Only relevant for newer FSFS formats. */
if (svn_fs_fs__use_log_addressing(fs))
{
/* Determine file range covered by the proto-index so far. Note that
we always append to both file, i.e. the last index entry also
corresponds to the last addition in the rev file. */
const char *path = svn_fs_fs__path_p2l_proto_index(fs, txn_id, pool);
apr_file_t *file;
apr_off_t indexed_length;
SVN_ERR(svn_fs_fs__p2l_proto_index_open(&file, path, pool));
SVN_ERR(svn_fs_fs__p2l_proto_index_next_offset(&indexed_length, file,
pool));
SVN_ERR(svn_io_file_close(file, pool));
/* Handle mismatches. */
if (indexed_length < actual_length)
SVN_ERR(svn_io_file_trunc(proto_rev, indexed_length, pool));
else if (indexed_length > actual_length)
return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
NULL,
_("p2l proto index offset %s beyond proto"
"rev file size %s for TXN %s"),
apr_off_t_toa(pool, indexed_length),
apr_off_t_toa(pool, actual_length),
svn_fs_fs__id_txn_unparse(txn_id, pool));
}
return SVN_NO_ERROR;
}
/* Get a handle to the prototype revision file for transaction TXN_ID in
filesystem FS, and lock it for writing. Return FILE, a file handle
positioned at the end of the file, and LOCKCOOKIE, a cookie that
should be passed to unlock_proto_rev() to unlock the file once FILE
has been closed.
If the prototype revision file is already locked, return error
SVN_ERR_FS_REP_BEING_WRITTEN.
Perform all allocations in POOL. */
static svn_error_t *
get_writable_proto_rev(apr_file_t **file,
void **lockcookie,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
struct get_writable_proto_rev_baton b;
svn_error_t *err;
apr_off_t end_offset = 0;
b.lockcookie = lockcookie;
b.txn_id = *txn_id;
SVN_ERR(with_txnlist_lock(fs, get_writable_proto_rev_body, &b, pool));
/* Now open the prototype revision file and seek to the end. */
err = svn_io_file_open(file,
svn_fs_fs__path_txn_proto_rev(fs, txn_id, pool),
APR_READ | APR_WRITE | APR_BUFFERED, APR_OS_DEFAULT,
pool);
/* You might expect that we could dispense with the following seek
and achieve the same thing by opening the file using APR_APPEND.
Unfortunately, APR's buffered file implementation unconditionally
places its initial file pointer at the start of the file (even for
files opened with APR_APPEND), so we need this seek to reconcile
the APR file pointer to the OS file pointer (since we need to be
able to read the current file position later). */
if (!err)
err = svn_io_file_seek(*file, APR_END, &end_offset, pool);
/* We don't want unused sections (such as leftovers from failed delta
stream) in our file. If we use log addressing, we would need an
index entry for the unused section and that section would need to
be all NUL by convention. So, detect and fix those cases by truncating
the protorev file. */
if (!err)
err = auto_truncate_proto_rev(fs, *file, end_offset, txn_id, pool);
if (err)
{
err = svn_error_compose_create(
err,
unlock_proto_rev(fs, txn_id, *lockcookie, pool));
*lockcookie = NULL;
}
return svn_error_trace(err);
}
/* Callback used in the implementation of purge_shared_txn(). */
static svn_error_t *
purge_shared_txn_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
{
const svn_fs_fs__id_part_t *txn_id = baton;
free_shared_txn(fs, txn_id);
svn_fs_fs__reset_txn_caches(fs);
return SVN_NO_ERROR;
}
/* Purge the shared data for transaction TXN_ID in filesystem FS.
Perform all allocations in POOL. */
static svn_error_t *
purge_shared_txn(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
return with_txnlist_lock(fs, purge_shared_txn_body, txn_id, pool);
}
svn_error_t *
svn_fs_fs__put_node_revision(svn_fs_t *fs,
const svn_fs_id_t *id,
node_revision_t *noderev,
svn_boolean_t fresh_txn_root,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
apr_file_t *noderev_file;
noderev->is_fresh_txn_root = fresh_txn_root;
if (! svn_fs_fs__id_is_txn(id))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Attempted to write to non-transaction '%s'"),
svn_fs_fs__id_unparse(id, pool)->data);
SVN_ERR(svn_io_file_open(&noderev_file,
svn_fs_fs__path_txn_node_rev(fs, id, pool),
APR_WRITE | APR_CREATE | APR_TRUNCATE
| APR_BUFFERED, APR_OS_DEFAULT, pool));
SVN_ERR(svn_fs_fs__write_noderev(svn_stream_from_aprfile2(noderev_file, TRUE,
pool),
noderev, ffd->format,
svn_fs_fs__fs_supports_mergeinfo(fs),
pool));
SVN_ERR(svn_io_file_close(noderev_file, pool));
return SVN_NO_ERROR;
}
/* For the in-transaction NODEREV within FS, write the sha1->rep mapping
* file in the respective transaction, if rep sharing has been enabled etc.
* Use SCATCH_POOL for temporary allocations.
*/
static svn_error_t *
store_sha1_rep_mapping(svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
/* if rep sharing has been enabled and the noderev has a data rep and
* its SHA-1 is known, store the rep struct under its SHA1. */
if ( ffd->rep_sharing_allowed
&& noderev->data_rep
&& noderev->data_rep->has_sha1)
{
apr_file_t *rep_file;
const char *file_name = path_txn_sha1(fs,
&noderev->data_rep->txn_id,
noderev->data_rep->sha1_digest,
scratch_pool);
svn_stringbuf_t *rep_string
= svn_fs_fs__unparse_representation(noderev->data_rep,
ffd->format,
(noderev->kind == svn_node_dir),
scratch_pool, scratch_pool);
SVN_ERR(svn_io_file_open(&rep_file, file_name,
APR_WRITE | APR_CREATE | APR_TRUNCATE
| APR_BUFFERED, APR_OS_DEFAULT, scratch_pool));
SVN_ERR(svn_io_file_write_full(rep_file, rep_string->data,
rep_string->len, NULL, scratch_pool));
SVN_ERR(svn_io_file_close(rep_file, scratch_pool));
}
return SVN_NO_ERROR;
}
static svn_error_t *
unparse_dir_entry(svn_fs_dirent_t *dirent,
svn_stream_t *stream,
apr_pool_t *pool)
{
const char *val
= apr_psprintf(pool, "%s %s",
(dirent->kind == svn_node_file) ? SVN_FS_FS__KIND_FILE
: SVN_FS_FS__KIND_DIR,
svn_fs_fs__id_unparse(dirent->id, pool)->data);
SVN_ERR(svn_stream_printf(stream, pool, "K %" APR_SIZE_T_FMT "\n%s\n"
"V %" APR_SIZE_T_FMT "\n%s\n",
strlen(dirent->name), dirent->name,
strlen(val), val));
return SVN_NO_ERROR;
}
/* Write the directory given as array of dirent structs in ENTRIES to STREAM.
Perform temporary allocations in POOL. */
static svn_error_t *
unparse_dir_entries(apr_array_header_t *entries,
svn_stream_t *stream,
apr_pool_t *pool)
{
apr_pool_t *iterpool = svn_pool_create(pool);
int i;
for (i = 0; i < entries->nelts; ++i)
{
svn_fs_dirent_t *dirent;
svn_pool_clear(iterpool);
dirent = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
SVN_ERR(unparse_dir_entry(dirent, stream, iterpool));
}
SVN_ERR(svn_stream_printf(stream, pool, "%s\n", SVN_HASH_TERMINATOR));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Return a deep copy of SOURCE and allocate it in RESULT_POOL.
*/
static svn_fs_path_change2_t *
path_change_dup(const svn_fs_path_change2_t *source,
apr_pool_t *result_pool)
{
svn_fs_path_change2_t *result = apr_pmemdup(result_pool, source,
sizeof(*source));
result->node_rev_id = svn_fs_fs__id_copy(source->node_rev_id, result_pool);
if (source->copyfrom_path)
result->copyfrom_path = apr_pstrdup(result_pool, source->copyfrom_path);
return result;
}
/* Merge the internal-use-only CHANGE into a hash of public-FS
svn_fs_path_change2_t CHANGED_PATHS, collapsing multiple changes into a
single summarical (is that real word?) change per path. DELETIONS is
also a path->svn_fs_path_change2_t hash and contains all the deletions
that got turned into a replacement. */
static svn_error_t *
fold_change(apr_hash_t *changed_paths,
apr_hash_t *deletions,
const change_t *change)
{
apr_pool_t *pool = apr_hash_pool_get(changed_paths);
svn_fs_path_change2_t *old_change, *new_change;
const svn_string_t *path = &change->path;
const svn_fs_path_change2_t *info = &change->info;
if ((old_change = apr_hash_get(changed_paths, path->data, path->len)))
{
/* This path already exists in the hash, so we have to merge
this change into the already existing one. */
/* Sanity check: only allow NULL node revision ID in the
`reset' case. */
if ((! info->node_rev_id)
&& (info->change_kind != svn_fs_path_change_reset))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Missing required node revision ID"));
/* Sanity check: we should be talking about the same node
revision ID as our last change except where the last change
was a deletion. */
if (info->node_rev_id
&& (! svn_fs_fs__id_eq(old_change->node_rev_id, info->node_rev_id))
&& (old_change->change_kind != svn_fs_path_change_delete))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid change ordering: new node revision ID "
"without delete"));
/* Sanity check: an add, replacement, or reset must be the first
thing to follow a deletion. */
if ((old_change->change_kind == svn_fs_path_change_delete)
&& (! ((info->change_kind == svn_fs_path_change_replace)
|| (info->change_kind == svn_fs_path_change_reset)
|| (info->change_kind == svn_fs_path_change_add))))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid change ordering: non-add change on deleted path"));
/* Sanity check: an add can't follow anything except
a delete or reset. */
if ((info->change_kind == svn_fs_path_change_add)
&& (old_change->change_kind != svn_fs_path_change_delete)
&& (old_change->change_kind != svn_fs_path_change_reset))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid change ordering: add change on preexisting path"));
/* Now, merge that change in. */
switch (info->change_kind)
{
case svn_fs_path_change_reset:
/* A reset here will simply remove the path change from the
hash. */
apr_hash_set(changed_paths, path->data, path->len, NULL);
break;
case svn_fs_path_change_delete:
if (old_change->change_kind == svn_fs_path_change_add)
{
/* If the path was introduced in this transaction via an
add, and we are deleting it, just remove the path
altogether. (The caller will delete any child paths.) */
apr_hash_set(changed_paths, path->data, path->len, NULL);
}
else if (old_change->change_kind == svn_fs_path_change_replace)
{
/* A deleting a 'replace' restore the original deletion. */
new_change = apr_hash_get(deletions, path->data, path->len);
SVN_ERR_ASSERT(new_change);
apr_hash_set(changed_paths, path->data, path->len, new_change);
}
else
{
/* A deletion overrules a previous change (modify). */
new_change = path_change_dup(info, pool);
apr_hash_set(changed_paths, path->data, path->len, new_change);
}
break;
case svn_fs_path_change_add:
case svn_fs_path_change_replace:
/* An add at this point must be following a previous delete,
so treat it just like a replace. Remember the original
deletion such that we are able to delete this path again
(the replacement may have changed node kind and id). */
new_change = path_change_dup(info, pool);
new_change->change_kind = svn_fs_path_change_replace;
apr_hash_set(changed_paths, path->data, path->len, new_change);
/* Remember the original change.
* Make sure to allocate the hash key in a durable pool. */
apr_hash_set(deletions,
apr_pstrmemdup(apr_hash_pool_get(deletions),
path->data, path->len),
path->len, old_change);
break;
case svn_fs_path_change_modify:
default:
/* If the new change modifies some attribute of the node, set
the corresponding flag, whether it already was set or not.
Note: We do not reset a flag to FALSE if a change is undone. */
if (info->text_mod)
old_change->text_mod = TRUE;
if (info->prop_mod)
old_change->prop_mod = TRUE;
if (info->mergeinfo_mod == svn_tristate_true)
old_change->mergeinfo_mod = svn_tristate_true;
break;
}
}
else
{
/* Add this path. The API makes no guarantees that this (new) key
will not be retained. Thus, we copy the key into the target pool
to ensure a proper lifetime. */
apr_hash_set(changed_paths,
apr_pstrmemdup(pool, path->data, path->len), path->len,
path_change_dup(info, pool));
}
return SVN_NO_ERROR;
}
/* Baton type to be used with process_changes(). */
typedef struct process_changes_baton_t
{
/* Folded list of path changes. */
apr_hash_t *changed_paths;
/* Path changes that are deletions and have been turned into
replacements. If those replacements get deleted again, this
container contains the record that we have to revert to. */
apr_hash_t *deletions;
} process_changes_baton_t;
/* An implementation of svn_fs_fs__change_receiver_t.
Examine all the changed path entries in CHANGES and store them in
*CHANGED_PATHS. Folding is done to remove redundant or unnecessary
data. Do all allocations in POOL. */
static svn_error_t *
process_changes(void *baton_p,
change_t *change,
apr_pool_t *scratch_pool)
{
process_changes_baton_t *baton = baton_p;
SVN_ERR(fold_change(baton->changed_paths, baton->deletions, change));
/* Now, if our change was a deletion or replacement, we have to
blow away any changes thus far on paths that are (or, were)
children of this path.
### i won't bother with another iteration pool here -- at
most we talking about a few extra dups of paths into what
is already a temporary subpool.
*/
if ((change->info.change_kind == svn_fs_path_change_delete)
|| (change->info.change_kind == svn_fs_path_change_replace))
{
apr_hash_index_t *hi;
/* a potential child path must contain at least 2 more chars
(the path separator plus at least one char for the name).
Also, we should not assume that all paths have been normalized
i.e. some might have trailing path separators.
*/
apr_ssize_t path_len = change->path.len;
apr_ssize_t min_child_len = path_len == 0
? 1
: change->path.data[path_len-1] == '/'
? path_len + 1
: path_len + 2;
/* CAUTION: This is the inner loop of an O(n^2) algorithm.
The number of changes to process may be >> 1000.
Therefore, keep the inner loop as tight as possible.
*/
for (hi = apr_hash_first(scratch_pool, baton->changed_paths);
hi;
hi = apr_hash_next(hi))
{
/* KEY is the path. */
const void *path;
apr_ssize_t klen;
svn_fs_path_change2_t *old_change;
apr_hash_this(hi, &path, &klen, (void**)&old_change);
/* If we come across a child of our path, remove it.
Call svn_fspath__skip_ancestor only if there is a chance that
this is actually a sub-path.
*/
if (klen >= min_child_len)
{
const char *child;
child = svn_fspath__skip_ancestor(change->path.data, path);
if (child && child[0] != '\0')
{
apr_hash_set(baton->changed_paths, path, klen, NULL);
}
}
}
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__txn_changes_fetch(apr_hash_t **changed_paths_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
apr_file_t *file;
apr_hash_t *changed_paths = apr_hash_make(pool);
apr_pool_t *scratch_pool = svn_pool_create(pool);
process_changes_baton_t baton;
baton.changed_paths = changed_paths;
baton.deletions = apr_hash_make(scratch_pool);
SVN_ERR(svn_io_file_open(&file,
path_txn_changes(fs, txn_id, scratch_pool),
APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
scratch_pool));
SVN_ERR(svn_fs_fs__read_changes_incrementally(
svn_stream_from_aprfile2(file, TRUE,
scratch_pool),
process_changes, &baton,
scratch_pool));
svn_pool_destroy(scratch_pool);
*changed_paths_p = changed_paths;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__paths_changed(apr_hash_t **changed_paths_p,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
apr_hash_t *changed_paths;
apr_array_header_t *changes;
int i;
SVN_ERR(svn_fs_fs__get_changes(&changes, fs, rev, pool));
changed_paths = svn_hash__make(pool);
for (i = 0; i < changes->nelts; ++i)
{
change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
apr_hash_set(changed_paths, change->path.data, change->path.len,
&change->info);
}
*changed_paths_p = changed_paths;
return SVN_NO_ERROR;
}
/* Copy a revision node-rev SRC into the current transaction TXN_ID in
the filesystem FS. This is only used to create the root of a transaction.
Allocations are from POOL. */
static svn_error_t *
create_new_txn_noderev_from_rev(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
svn_fs_id_t *src,
apr_pool_t *pool)
{
node_revision_t *noderev;
const svn_fs_fs__id_part_t *node_id, *copy_id;
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, src, pool, pool));
if (svn_fs_fs__id_is_txn(noderev->id))
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Copying from transactions not allowed"));
noderev->predecessor_id = noderev->id;
noderev->predecessor_count++;
noderev->copyfrom_path = NULL;
noderev->copyfrom_rev = SVN_INVALID_REVNUM;
/* For the transaction root, the copyroot never changes. */
node_id = svn_fs_fs__id_node_id(noderev->id);
copy_id = svn_fs_fs__id_copy_id(noderev->id);
noderev->id = svn_fs_fs__id_txn_create(node_id, copy_id, txn_id, pool);
return svn_fs_fs__put_node_revision(fs, noderev->id, noderev, TRUE, pool);
}
/* A structure used by get_and_increment_txn_key_body(). */
struct get_and_increment_txn_key_baton {
svn_fs_t *fs;
apr_uint64_t txn_number;
apr_pool_t *pool;
};
/* Callback used in the implementation of create_txn_dir(). This gets
the current base 36 value in PATH_TXN_CURRENT and increments it.
It returns the original value by the baton. */
static svn_error_t *
get_and_increment_txn_key_body(void *baton, apr_pool_t *pool)
{
struct get_and_increment_txn_key_baton *cb = baton;
const char *txn_current_filename
= svn_fs_fs__path_txn_current(cb->fs, pool);
char new_id_str[SVN_INT64_BUFFER_SIZE + 1]; /* add space for a newline */
apr_size_t line_length;
svn_stringbuf_t *buf;
SVN_ERR(svn_fs_fs__read_content(&buf, txn_current_filename, cb->pool));
/* assign the current txn counter value to our result */
cb->txn_number = svn__base36toui64(NULL, buf->data);
/* remove trailing newlines */
line_length = svn__ui64tobase36(new_id_str, cb->txn_number+1);
new_id_str[line_length] = '\n';
/* Increment the key and add a trailing \n to the string so the
txn-current file has a newline in it. */
SVN_ERR(svn_io_write_atomic(txn_current_filename, new_id_str,
line_length + 1,
txn_current_filename /* copy_perms path */,
pool));
return SVN_NO_ERROR;
}
/* Create a unique directory for a transaction in FS based on revision REV.
Return the ID for this transaction in *ID_P and *TXN_ID. Use a sequence
value in the transaction ID to prevent reuse of transaction IDs. */
static svn_error_t *
create_txn_dir(const char **id_p,
svn_fs_fs__id_part_t *txn_id,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
struct get_and_increment_txn_key_baton cb;
const char *txn_dir;
/* Get the current transaction sequence value, which is a base-36
number, from the txn-current file, and write an
incremented value back out to the file. Place the revision
number the transaction is based off into the transaction id. */
cb.pool = pool;
cb.fs = fs;
SVN_ERR(svn_fs_fs__with_txn_current_lock(fs,
get_and_increment_txn_key_body,
&cb,
pool));
txn_id->revision = rev;
txn_id->number = cb.txn_number;
*id_p = svn_fs_fs__id_txn_unparse(txn_id, pool);
txn_dir = svn_fs_fs__path_txn_dir(fs, txn_id, pool);
return svn_io_dir_make(txn_dir, APR_OS_DEFAULT, pool);
}
/* Create a unique directory for a transaction in FS based on revision
REV. Return the ID for this transaction in *ID_P and *TXN_ID. This
implementation is used in svn 1.4 and earlier repositories and is
kept in 1.5 and greater to support the --pre-1.4-compatible and
--pre-1.5-compatible repository creation options. Reused
transaction IDs are possible with this implementation. */
static svn_error_t *
create_txn_dir_pre_1_5(const char **id_p,
svn_fs_fs__id_part_t *txn_id,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
unsigned int i;
apr_pool_t *subpool;
const char *unique_path, *prefix;
/* Try to create directories named "<txndir>/<rev>-<uniqueifier>.txn". */
prefix = svn_dirent_join(svn_fs_fs__path_txns_dir(fs, pool),
apr_psprintf(pool, "%ld", rev), pool);
subpool = svn_pool_create(pool);
for (i = 1; i <= 99999; i++)
{
svn_error_t *err;
svn_pool_clear(subpool);
unique_path = apr_psprintf(subpool, "%s-%u" PATH_EXT_TXN, prefix, i);
err = svn_io_dir_make(unique_path, APR_OS_DEFAULT, subpool);
if (! err)
{
/* We succeeded. Return the basename minus the ".txn" extension. */
const char *name = svn_dirent_basename(unique_path, subpool);
*id_p = apr_pstrndup(pool, name,
strlen(name) - strlen(PATH_EXT_TXN));
SVN_ERR(svn_fs_fs__id_txn_parse(txn_id, *id_p));
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
if (! APR_STATUS_IS_EEXIST(err->apr_err))
return svn_error_trace(err);
svn_error_clear(err);
}
return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED,
NULL,
_("Unable to create transaction directory "
"in '%s' for revision %ld"),
svn_dirent_local_style(fs->path, pool),
rev);
}
svn_error_t *
svn_fs_fs__create_txn(svn_fs_txn_t **txn_p,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_fs_txn_t *txn;
fs_txn_data_t *ftd;
svn_fs_id_t *root_id;
txn = apr_pcalloc(pool, sizeof(*txn));
ftd = apr_pcalloc(pool, sizeof(*ftd));
/* Get the txn_id. */
if (ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
SVN_ERR(create_txn_dir(&txn->id, &ftd->txn_id, fs, rev, pool));
else
SVN_ERR(create_txn_dir_pre_1_5(&txn->id, &ftd->txn_id, fs, rev, pool));
txn->fs = fs;
txn->base_rev = rev;
txn->vtable = &txn_vtable;
txn->fsap_data = ftd;
*txn_p = txn;
/* Create a new root node for this transaction. */
SVN_ERR(svn_fs_fs__rev_get_root(&root_id, fs, rev, pool, pool));
SVN_ERR(create_new_txn_noderev_from_rev(fs, &ftd->txn_id, root_id, pool));
/* Create an empty rev file. */
SVN_ERR(svn_io_file_create_empty(
svn_fs_fs__path_txn_proto_rev(fs, &ftd->txn_id, pool),
pool));
/* Create an empty rev-lock file. */
SVN_ERR(svn_io_file_create_empty(
svn_fs_fs__path_txn_proto_rev_lock(fs, &ftd->txn_id, pool),
pool));
/* Create an empty changes file. */
SVN_ERR(svn_io_file_create_empty(path_txn_changes(fs, &ftd->txn_id, pool),
pool));
/* Create the next-ids file. */
return svn_io_file_create(path_txn_next_ids(fs, &ftd->txn_id, pool),
"0 0\n", pool);
}
/* Store the property list for transaction TXN_ID in PROPLIST.
Perform temporary allocations in POOL. */
static svn_error_t *
get_txn_proplist(apr_hash_t *proplist,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
svn_stream_t *stream;
svn_error_t *err;
/* Check for issue #3696. (When we find and fix the cause, we can change
* this to an assertion.) */
if (!txn_id || !svn_fs_fs__id_txn_used(txn_id))
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Internal error: a null transaction id was "
"passed to get_txn_proplist()"));
/* Open the transaction properties file. */
SVN_ERR(svn_stream_open_readonly(&stream, path_txn_props(fs, txn_id, pool),
pool, pool));
/* Read in the property list. */
err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
if (err)
{
svn_error_clear(svn_stream_close(stream));
return svn_error_quick_wrapf(err,
_("malformed property list in transaction '%s'"),
path_txn_props(fs, txn_id, pool));
}
return svn_stream_close(stream);
}
/* Save the property list PROPS as the revprops for transaction TXN_ID
in FS. Perform temporary allocations in POOL. */
static svn_error_t *
set_txn_proplist(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_hash_t *props,
svn_boolean_t final,
apr_pool_t *pool)
{
svn_stringbuf_t *buf;
svn_stream_t *stream;
/* Write out the new file contents to BUF. */
buf = svn_stringbuf_create_ensure(1024, pool);
stream = svn_stream_from_stringbuf(buf, pool);
SVN_ERR(svn_hash_write2(props, stream, SVN_HASH_TERMINATOR, pool));
SVN_ERR(svn_stream_close(stream));
/* Open the transaction properties file and write new contents to it. */
SVN_ERR(svn_io_write_atomic((final
? path_txn_props_final(fs, txn_id, pool)
: path_txn_props(fs, txn_id, pool)),
buf->data, buf->len,
NULL /* copy_perms_path */, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__change_txn_prop(svn_fs_txn_t *txn,
const char *name,
const svn_string_t *value,
apr_pool_t *pool)
{
apr_array_header_t *props = apr_array_make(pool, 1, sizeof(svn_prop_t));
svn_prop_t prop;
prop.name = name;
prop.value = value;
APR_ARRAY_PUSH(props, svn_prop_t) = prop;
return svn_fs_fs__change_txn_props(txn, props, pool);
}
svn_error_t *
svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
const apr_array_header_t *props,
apr_pool_t *pool)
{
fs_txn_data_t *ftd = txn->fsap_data;
apr_hash_t *txn_prop = apr_hash_make(pool);
int i;
svn_error_t *err;
err = get_txn_proplist(txn_prop, txn->fs, &ftd->txn_id, pool);
/* Here - and here only - we need to deal with the possibility that the
transaction property file doesn't yet exist. The rest of the
implementation assumes that the file exists, but we're called to set the
initial transaction properties as the transaction is being created. */
if (err && (APR_STATUS_IS_ENOENT(err->apr_err)))
svn_error_clear(err);
else if (err)
return svn_error_trace(err);
for (i = 0; i < props->nelts; i++)
{
svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
if (svn_hash_gets(txn_prop, SVN_FS__PROP_TXN_CLIENT_DATE)
&& !strcmp(prop->name, SVN_PROP_REVISION_DATE))
svn_hash_sets(txn_prop, SVN_FS__PROP_TXN_CLIENT_DATE,
svn_string_create("1", pool));
svn_hash_sets(txn_prop, prop->name, prop->value);
}
/* Create a new version of the file and write out the new props. */
/* Open the transaction properties file. */
SVN_ERR(set_txn_proplist(txn->fs, &ftd->txn_id, txn_prop, FALSE, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__get_txn(transaction_t **txn_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
transaction_t *txn;
node_revision_t *noderev;
svn_fs_id_t *root_id;
txn = apr_pcalloc(pool, sizeof(*txn));
root_id = svn_fs_fs__id_txn_create_root(txn_id, pool);
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, root_id, pool, pool));
txn->root_id = svn_fs_fs__id_copy(noderev->id, pool);
txn->base_id = svn_fs_fs__id_copy(noderev->predecessor_id, pool);
txn->copies = NULL;
*txn_p = txn;
return SVN_NO_ERROR;
}
/* Write out the currently available next node_id NODE_ID and copy_id
COPY_ID for transaction TXN_ID in filesystem FS. The next node-id is
used both for creating new unique nodes for the given transaction, as
well as uniquifying representations. Perform temporary allocations in
POOL. */
static svn_error_t *
write_next_ids(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_uint64_t node_id,
apr_uint64_t copy_id,
apr_pool_t *pool)
{
apr_file_t *file;
char buffer[2 * SVN_INT64_BUFFER_SIZE + 2];
char *p = buffer;
p += svn__ui64tobase36(p, node_id);
*(p++) = ' ';
p += svn__ui64tobase36(p, copy_id);
*(p++) = '\n';
*(p++) = '\0';
SVN_ERR(svn_io_file_open(&file,
path_txn_next_ids(fs, txn_id, pool),
APR_WRITE | APR_TRUNCATE,
APR_OS_DEFAULT, pool));
SVN_ERR(svn_io_file_write_full(file, buffer, p - buffer, NULL, pool));
return svn_io_file_close(file, pool);
}
/* Find out what the next unique node-id and copy-id are for
transaction TXN_ID in filesystem FS. Store the results in *NODE_ID
and *COPY_ID. The next node-id is used both for creating new unique
nodes for the given transaction, as well as uniquifying representations.
Perform all allocations in POOL. */
static svn_error_t *
read_next_ids(apr_uint64_t *node_id,
apr_uint64_t *copy_id,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
svn_stringbuf_t *buf;
const char *str;
SVN_ERR(svn_fs_fs__read_content(&buf,
path_txn_next_ids(fs, txn_id, pool),
pool));
/* Parse this into two separate strings. */
str = buf->data;
*node_id = svn__base36toui64(&str, str);
if (*str != ' ')
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("next-id file corrupt"));
++str;
*copy_id = svn__base36toui64(&str, str);
if (*str != '\n')
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("next-id file corrupt"));
return SVN_NO_ERROR;
}
/* Get a new and unique to this transaction node-id for transaction
TXN_ID in filesystem FS. Store the new node-id in *NODE_ID_P.
Node-ids are guaranteed to be unique to this transction, but may
not necessarily be sequential. Perform all allocations in POOL. */
static svn_error_t *
get_new_txn_node_id(svn_fs_fs__id_part_t *node_id_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
apr_uint64_t node_id, copy_id;
/* First read in the current next-ids file. */
SVN_ERR(read_next_ids(&node_id, &copy_id, fs, txn_id, pool));
node_id_p->revision = SVN_INVALID_REVNUM;
node_id_p->number = node_id;
SVN_ERR(write_next_ids(fs, txn_id, ++node_id, copy_id, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__reserve_copy_id(svn_fs_fs__id_part_t *copy_id_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
apr_uint64_t node_id, copy_id;
/* First read in the current next-ids file. */
SVN_ERR(read_next_ids(&node_id, &copy_id, fs, txn_id, pool));
/* this is an in-txn ID now */
copy_id_p->revision = SVN_INVALID_REVNUM;
copy_id_p->number = copy_id;
/* Update the ID counter file */
SVN_ERR(write_next_ids(fs, txn_id, node_id, ++copy_id, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__create_node(const svn_fs_id_t **id_p,
svn_fs_t *fs,
node_revision_t *noderev,
const svn_fs_fs__id_part_t *copy_id,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
svn_fs_fs__id_part_t node_id;
const svn_fs_id_t *id;
/* Get a new node-id for this node. */
SVN_ERR(get_new_txn_node_id(&node_id, fs, txn_id, pool));
id = svn_fs_fs__id_txn_create(&node_id, copy_id, txn_id, pool);
noderev->id = id;
SVN_ERR(svn_fs_fs__put_node_revision(fs, noderev->id, noderev, FALSE, pool));
*id_p = id;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__purge_txn(svn_fs_t *fs,
const char *txn_id_str,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_fs_fs__id_part_t txn_id;
SVN_ERR(svn_fs_fs__id_txn_parse(&txn_id, txn_id_str));
/* Remove the shared transaction object associated with this transaction. */
SVN_ERR(purge_shared_txn(fs, &txn_id, pool));
/* Remove the directory associated with this transaction. */
SVN_ERR(svn_io_remove_dir2(svn_fs_fs__path_txn_dir(fs, &txn_id, pool),
FALSE, NULL, NULL, pool));
if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
{
/* Delete protorev and its lock, which aren't in the txn
directory. It's OK if they don't exist (for example, if this
is post-commit and the proto-rev has been moved into
place). */
SVN_ERR(svn_io_remove_file2(
svn_fs_fs__path_txn_proto_rev(fs, &txn_id, pool),
TRUE, pool));
SVN_ERR(svn_io_remove_file2(
svn_fs_fs__path_txn_proto_rev_lock(fs, &txn_id, pool),
TRUE, pool));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__abort_txn(svn_fs_txn_t *txn,
apr_pool_t *pool)
{
SVN_ERR(svn_fs__check_fs(txn->fs, TRUE));
/* Now, purge the transaction. */
SVN_ERR_W(svn_fs_fs__purge_txn(txn->fs, txn->id, pool),
apr_psprintf(pool, _("Transaction '%s' cleanup failed"),
txn->id));
return SVN_NO_ERROR;
}
/* Assign the UNIQUIFIER member of REP based on the current state of TXN_ID
* in FS. Allocate the uniquifier in POOL.
*/
static svn_error_t *
set_uniquifier(svn_fs_t *fs,
representation_t *rep,
apr_pool_t *pool)
{
svn_fs_fs__id_part_t temp;
fs_fs_data_t *ffd = fs->fsap_data;
if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
{
SVN_ERR(get_new_txn_node_id(&temp, fs, &rep->txn_id, pool));
rep->uniquifier.noderev_txn_id = rep->txn_id;
rep->uniquifier.number = temp.number;
}
return SVN_NO_ERROR;
}
/* Return TRUE if the TXN_ID member of REP is in use.
*/
static svn_boolean_t
is_txn_rep(const representation_t *rep)
{
return svn_fs_fs__id_txn_used(&rep->txn_id);
}
/* Mark the TXN_ID member of REP as "unused".
*/
static void
reset_txn_in_rep(representation_t *rep)
{
svn_fs_fs__id_txn_reset(&rep->txn_id);
}
svn_error_t *
svn_fs_fs__set_entry(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
node_revision_t *parent_noderev,
const char *name,
const svn_fs_id_t *id,
svn_node_kind_t kind,
apr_pool_t *pool)
{
representation_t *rep = parent_noderev->data_rep;
const char *filename
= svn_fs_fs__path_txn_node_children(fs, parent_noderev->id, pool);
apr_file_t *file;
svn_stream_t *out;
fs_fs_data_t *ffd = fs->fsap_data;
apr_pool_t *subpool = svn_pool_create(pool);
if (!rep || !is_txn_rep(rep))
{
apr_array_header_t *entries;
/* Before we can modify the directory, we need to dump its old
contents into a mutable representation file. */
SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, parent_noderev,
subpool, subpool));
SVN_ERR(svn_io_file_open(&file, filename,
APR_WRITE | APR_CREATE | APR_BUFFERED,
APR_OS_DEFAULT, pool));
out = svn_stream_from_aprfile2(file, TRUE, pool);
SVN_ERR(unparse_dir_entries(entries, out, subpool));
svn_pool_clear(subpool);
/* Mark the node-rev's data rep as mutable. */
rep = apr_pcalloc(pool, sizeof(*rep));
rep->revision = SVN_INVALID_REVNUM;
rep->txn_id = *txn_id;
SVN_ERR(set_uniquifier(fs, rep, pool));
parent_noderev->data_rep = rep;
SVN_ERR(svn_fs_fs__put_node_revision(fs, parent_noderev->id,
parent_noderev, FALSE, pool));
}
else
{
/* The directory rep is already mutable, so just open it for append. */
SVN_ERR(svn_io_file_open(&file, filename, APR_WRITE | APR_APPEND,
APR_OS_DEFAULT, pool));
out = svn_stream_from_aprfile2(file, TRUE, pool);
}
/* if we have a directory cache for this transaction, update it */
if (ffd->txn_dir_cache)
{
/* build parameters: (name, new entry) pair */
const char *key =
svn_fs_fs__id_unparse(parent_noderev->id, subpool)->data;
replace_baton_t baton;
baton.name = name;
baton.new_entry = NULL;
if (id)
{
baton.new_entry = apr_pcalloc(subpool, sizeof(*baton.new_entry));
baton.new_entry->name = name;
baton.new_entry->kind = kind;
baton.new_entry->id = id;
}
/* actually update the cached directory (if cached) */
SVN_ERR(svn_cache__set_partial(ffd->txn_dir_cache, key,
svn_fs_fs__replace_dir_entry, &baton,
subpool));
}
svn_pool_clear(subpool);
/* Append an incremental hash entry for the entry change. */
if (id)
{
svn_fs_dirent_t entry;
entry.name = name;
entry.id = id;
entry.kind = kind;
SVN_ERR(unparse_dir_entry(&entry, out, subpool));
}
else
{
SVN_ERR(svn_stream_printf(out, subpool, "D %" APR_SIZE_T_FMT "\n%s\n",
strlen(name), name));
}
SVN_ERR(svn_io_file_close(file, subpool));
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__add_change(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
const char *path,
const svn_fs_id_t *id,
svn_fs_path_change_kind_t change_kind,
svn_boolean_t text_mod,
svn_boolean_t prop_mod,
svn_boolean_t mergeinfo_mod,
svn_node_kind_t node_kind,
svn_revnum_t copyfrom_rev,
const char *copyfrom_path,
apr_pool_t *pool)
{
apr_file_t *file;
svn_fs_path_change2_t *change;
apr_hash_t *changes = apr_hash_make(pool);
/* Not using APR_BUFFERED to append change in one atomic write operation. */
SVN_ERR(svn_io_file_open(&file, path_txn_changes(fs, txn_id, pool),
APR_APPEND | APR_WRITE | APR_CREATE,
APR_OS_DEFAULT, pool));
change = svn_fs__path_change_create_internal(id, change_kind, pool);
change->text_mod = text_mod;
change->prop_mod = prop_mod;
change->mergeinfo_mod = mergeinfo_mod
? svn_tristate_true
: svn_tristate_false;
change->node_kind = node_kind;
change->copyfrom_known = TRUE;
change->copyfrom_rev = copyfrom_rev;
if (copyfrom_path)
change->copyfrom_path = apr_pstrdup(pool, copyfrom_path);
svn_hash_sets(changes, path, change);
SVN_ERR(svn_fs_fs__write_changes(svn_stream_from_aprfile2(file, TRUE, pool),
fs, changes, FALSE, pool));
return svn_io_file_close(file, pool);
}
/* If the transaction TXN_ID in FS uses logical addressing, store the
* (ITEM_INDEX, OFFSET) pair in the txn's log-to-phys proto index file.
* Use POOL for allocations.
*/
static svn_error_t *
store_l2p_index_entry(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_off_t offset,
apr_uint64_t item_index,
apr_pool_t *pool)
{
if (svn_fs_fs__use_log_addressing(fs))
{
const char *path = svn_fs_fs__path_l2p_proto_index(fs, txn_id, pool);
apr_file_t *file;
SVN_ERR(svn_fs_fs__l2p_proto_index_open(&file, path, pool));
SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(file, offset,
item_index, pool));
SVN_ERR(svn_io_file_close(file, pool));
}
return SVN_NO_ERROR;
}
/* If the transaction TXN_ID in FS uses logical addressing, store ENTRY
* in the phys-to-log proto index file of transaction TXN_ID.
* Use POOL for allocations.
*/
static svn_error_t *
store_p2l_index_entry(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
svn_fs_fs__p2l_entry_t *entry,
apr_pool_t *pool)
{
if (svn_fs_fs__use_log_addressing(fs))
{
const char *path = svn_fs_fs__path_p2l_proto_index(fs, txn_id, pool);
apr_file_t *file;
SVN_ERR(svn_fs_fs__p2l_proto_index_open(&file, path, pool));
SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(file, entry, pool));
SVN_ERR(svn_io_file_close(file, pool));
}
return SVN_NO_ERROR;
}
/* Allocate an item index for the given MY_OFFSET in the transaction TXN_ID
* of file system FS and return it in *ITEM_INDEX. For old formats, it
* will simply return the offset as item index; in new formats, it will
* increment the txn's item index counter file and store the mapping in
* the proto index file. Use POOL for allocations.
*/
static svn_error_t *
allocate_item_index(apr_uint64_t *item_index,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_off_t my_offset,
apr_pool_t *pool)
{
if (svn_fs_fs__use_log_addressing(fs))
{
apr_file_t *file;
char buffer[SVN_INT64_BUFFER_SIZE] = { 0 };
svn_boolean_t eof = FALSE;
apr_size_t to_write;
apr_size_t read;
apr_off_t offset = 0;
/* read number, increment it and write it back to disk */
SVN_ERR(svn_io_file_open(&file,
svn_fs_fs__path_txn_item_index(fs, txn_id, pool),
APR_READ | APR_WRITE | APR_CREATE | APR_BUFFERED,
APR_OS_DEFAULT, pool));
SVN_ERR(svn_io_file_read_full2(file, buffer, sizeof(buffer)-1,
&read, &eof, pool));
if (read)
SVN_ERR(svn_cstring_atoui64(item_index, buffer));
else
*item_index = SVN_FS_FS__ITEM_INDEX_FIRST_USER;
to_write = svn__ui64toa(buffer, *item_index + 1);
SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, pool));
SVN_ERR(svn_io_file_write_full(file, buffer, to_write, NULL, pool));
SVN_ERR(svn_io_file_close(file, pool));
/* write log-to-phys index */
SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset, *item_index, pool));
}
else
{
*item_index = (apr_uint64_t)my_offset;
}
return SVN_NO_ERROR;
}
/* Baton used by fnv1a_write_handler to calculate the FNV checksum
* before passing the data on to the INNER_STREAM.
*/
typedef struct fnv1a_stream_baton_t
{
svn_stream_t *inner_stream;
svn_checksum_ctx_t *context;
} fnv1a_stream_baton_t;
/* Implement svn_write_fn_t.
* Update checksum and pass data on to inner stream.
*/
static svn_error_t *
fnv1a_write_handler(void *baton,
const char *data,
apr_size_t *len)
{
fnv1a_stream_baton_t *b = baton;
SVN_ERR(svn_checksum_update(b->context, data, *len));
SVN_ERR(svn_stream_write(b->inner_stream, data, len));
return SVN_NO_ERROR;
}
/* Return a stream that calculates a FNV checksum in *CONTEXT
* over all data written to the stream and passes that data on
* to INNER_STREAM. Allocate objects in POOL.
*/
static svn_stream_t *
fnv1a_wrap_stream(svn_checksum_ctx_t **context,
svn_stream_t *inner_stream,
apr_pool_t *pool)
{
svn_stream_t *outer_stream;
fnv1a_stream_baton_t *baton = apr_pcalloc(pool, sizeof(*baton));
baton->inner_stream = inner_stream;
baton->context = svn_checksum_ctx_create(svn_checksum_fnv1a_32x4, pool);
*context = baton->context;
outer_stream = svn_stream_create(baton, pool);
svn_stream_set_write(outer_stream, fnv1a_write_handler);
return outer_stream;
}
/* Set *DIGEST to the FNV checksum calculated in CONTEXT.
* Use SCRATCH_POOL for temporary allocations.
*/
static svn_error_t *
fnv1a_checksum_finalize(apr_uint32_t *digest,
svn_checksum_ctx_t *context,
apr_pool_t *scratch_pool)
{
svn_checksum_t *checksum;
SVN_ERR(svn_checksum_final(&checksum, context, scratch_pool));
SVN_ERR_ASSERT(checksum->kind == svn_checksum_fnv1a_32x4);
*digest = ntohl(*(const apr_uint32_t *)(checksum->digest));
return SVN_NO_ERROR;
}
/* This baton is used by the representation writing streams. It keeps
track of the checksum information as well as the total size of the
representation so far. */
struct rep_write_baton
{
/* The FS we are writing to. */
svn_fs_t *fs;
/* Actual file to which we are writing. */
svn_stream_t *rep_stream;
/* A stream from the delta combiner. Data written here gets
deltified, then eventually written to rep_stream. */
svn_stream_t *delta_stream;
/* Where is this representation header stored. */
apr_off_t rep_offset;
/* Start of the actual data. */
apr_off_t delta_start;
/* How many bytes have been written to this rep already. */
svn_filesize_t rep_size;
/* The node revision for which we're writing out info. */
node_revision_t *noderev;
/* Actual output file. */
apr_file_t *file;
/* Lock 'cookie' used to unlock the output file once we've finished
writing to it. */
void *lockcookie;
svn_checksum_ctx_t *md5_checksum_ctx;
svn_checksum_ctx_t *sha1_checksum_ctx;
/* calculate a modified FNV-1a checksum of the on-disk representation */
svn_checksum_ctx_t *fnv1a_checksum_ctx;
/* Local / scratch pool, available for temporary allocations. */
apr_pool_t *scratch_pool;
/* Outer / result pool. */
apr_pool_t *result_pool;
};
/* Handler for the write method of the representation writable stream.
BATON is a rep_write_baton, DATA is the data to write, and *LEN is
the length of this data. */
static svn_error_t *
rep_write_contents(void *baton,
const char *data,
apr_size_t *len)
{
struct rep_write_baton *b = baton;
SVN_ERR(svn_checksum_update(b->md5_checksum_ctx, data, *len));
SVN_ERR(svn_checksum_update(b->sha1_checksum_ctx, data, *len));
b->rep_size += *len;
/* If we are writing a delta, use that stream. */
if (b->delta_stream)
return svn_stream_write(b->delta_stream, data, len);
else
return svn_stream_write(b->rep_stream, data, len);
}
/* Set *SPANNED to the number of shards touched when walking WALK steps on
* NODEREV's predecessor chain in FS. Use POOL for temporary allocations.
*/
static svn_error_t *
shards_spanned(int *spanned,
svn_fs_t *fs,
node_revision_t *noderev,
int walk,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
int shard_size = ffd->max_files_per_dir ? ffd->max_files_per_dir : 1;
apr_pool_t *iterpool;
int count = walk ? 1 : 0; /* The start of a walk already touches a shard. */
svn_revnum_t shard, last_shard = ffd->youngest_rev_cache / shard_size;
iterpool = svn_pool_create(pool);
while (walk-- && noderev->predecessor_count)
{
svn_pool_clear(iterpool);
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs,
noderev->predecessor_id, pool,
iterpool));
shard = svn_fs_fs__id_rev(noderev->id) / shard_size;
if (shard != last_shard)
{
++count;
last_shard = shard;
}
}
svn_pool_destroy(iterpool);
*spanned = count;
return SVN_NO_ERROR;
}
/* Given a node-revision NODEREV in filesystem FS, return the
representation in *REP to use as the base for a text representation
delta if PROPS is FALSE. If PROPS has been set, a suitable props
base representation will be returned. Perform temporary allocations
in *POOL. */
static svn_error_t *
choose_delta_base(representation_t **rep,
svn_fs_t *fs,
node_revision_t *noderev,
svn_boolean_t props,
apr_pool_t *pool)
{
/* The zero-based index (counting from the "oldest" end), along NODEREVs line
* predecessors, of the node-rev we will use as delta base. */
int count;
/* The length of the linear part of a delta chain. (Delta chains use
* skip-delta bits for the high-order bits and are linear in the low-order
* bits.) */
int walk;
node_revision_t *base;
fs_fs_data_t *ffd = fs->fsap_data;
apr_pool_t *iterpool;
/* If we have no predecessors, or that one is empty, then use the empty
* stream as a base. */
if (! noderev->predecessor_count)
{
*rep = NULL;
return SVN_NO_ERROR;
}
/* Flip the rightmost '1' bit of the predecessor count to determine
which file rev (counting from 0) we want to use. (To see why
count & (count - 1) unsets the rightmost set bit, think about how
you decrement a binary number.) */
count = noderev->predecessor_count;
count = count & (count - 1);
/* Finding the delta base over a very long distance can become extremely
expensive for very deep histories, possibly causing client timeouts etc.
OTOH, this is a rare operation and its gains are minimal. Lets simply
start deltification anew close every other 1000 changes or so. */
walk = noderev->predecessor_count - count;
if (walk > (int)ffd->max_deltification_walk)
{
*rep = NULL;
return SVN_NO_ERROR;
}
/* We use skip delta for limiting the number of delta operations
along very long node histories. Close to HEAD however, we create
a linear history to minimize delta size. */
if (walk < (int)ffd->max_linear_deltification)
{
int shards;
SVN_ERR(shards_spanned(&shards, fs, noderev, walk, pool));
/* We also don't want the linear deltification to span more shards
than if deltas we used in a simple skip-delta scheme. */
if ((1 << (--shards)) <= walk)
count = noderev->predecessor_count - 1;
}
/* Walk back a number of predecessors equal to the difference
between count and the original predecessor count. (For example,
if noderev has ten predecessors and we want the eighth file rev,
walk back two predecessors.) */
base = noderev;
iterpool = svn_pool_create(pool);
while ((count++) < noderev->predecessor_count)
{
svn_pool_clear(iterpool);
SVN_ERR(svn_fs_fs__get_node_revision(&base, fs,
base->predecessor_id, pool,
iterpool));
}
svn_pool_destroy(iterpool);
/* return a suitable base representation */
*rep = props ? base->prop_rep : base->data_rep;
/* if we encountered a shared rep, its parent chain may be different
* from the node-rev parent chain. */
if (*rep)
{
int chain_length = 0;
int shard_count = 0;
/* Very short rep bases are simply not worth it as we are unlikely
* to re-coup the deltification space overhead of 20+ bytes. */
svn_filesize_t rep_size = (*rep)->expanded_size
? (*rep)->expanded_size
: (*rep)->size;
if (rep_size < 64)
{
*rep = NULL;
return SVN_NO_ERROR;
}
/* Check whether the length of the deltification chain is acceptable.
* Otherwise, shared reps may form a non-skipping delta chain in
* extreme cases. */
SVN_ERR(svn_fs_fs__rep_chain_length(&chain_length, &shard_count,
*rep, fs, pool));
/* Some reasonable limit, depending on how acceptable longer linear
* chains are in this repo. Also, allow for some minimal chain. */
if (chain_length >= 2 * (int)ffd->max_linear_deltification + 2)
*rep = NULL;
else
/* To make it worth opening additional shards / pack files, we
* require that the reps have a certain minimal size. To deltify
* against a rep in different shard, the lower limit is 512 bytes
* and doubles with every extra shard to visit along the delta
* chain. */
if ( shard_count > 1
&& ((svn_filesize_t)128 << shard_count) >= rep_size)
*rep = NULL;
}
return SVN_NO_ERROR;
}
/* Something went wrong and the pool for the rep write is being
cleared before we've finished writing the rep. So we need
to remove the rep from the protorevfile and we need to unlock
the protorevfile. */
static apr_status_t
rep_write_cleanup(void *data)
{
struct rep_write_baton *b = data;
svn_error_t *err;
/* Truncate and close the protorevfile. */
err = svn_io_file_trunc(b->file, b->rep_offset, b->scratch_pool);
err = svn_error_compose_create(err, svn_io_file_close(b->file,
b->scratch_pool));
/* Remove our lock regardless of any preceding errors so that the
being_written flag is always removed and stays consistent with the
file lock which will be removed no matter what since the pool is
going away. */
err = svn_error_compose_create(err,
unlock_proto_rev(b->fs,
svn_fs_fs__id_txn_id(b->noderev->id),
b->lockcookie, b->scratch_pool));
if (err)
{
apr_status_t rc = err->apr_err;
svn_error_clear(err);
return rc;
}
return APR_SUCCESS;
}
/* Get a rep_write_baton and store it in *WB_P for the representation
indicated by NODEREV in filesystem FS. Perform allocations in
POOL. Only appropriate for file contents, not for props or
directory contents. */
static svn_error_t *
rep_write_get_baton(struct rep_write_baton **wb_p,
svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *pool)
{
struct rep_write_baton *b;
apr_file_t *file;
representation_t *base_rep;
svn_stream_t *source;
svn_txdelta_window_handler_t wh;
void *whb;
fs_fs_data_t *ffd = fs->fsap_data;
int diff_version = ffd->format >= SVN_FS_FS__MIN_SVNDIFF1_FORMAT ? 1 : 0;
svn_fs_fs__rep_header_t header = { 0 };
b = apr_pcalloc(pool, sizeof(*b));
b->sha1_checksum_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
b->fs = fs;
b->result_pool = pool;
b->scratch_pool = svn_pool_create(pool);
b->rep_size = 0;
b->noderev = noderev;
/* Open the prototype rev file and seek to its end. */
SVN_ERR(get_writable_proto_rev(&file, &b->lockcookie,
fs, svn_fs_fs__id_txn_id(noderev->id),
b->scratch_pool));
b->file = file;
b->rep_stream = fnv1a_wrap_stream(&b->fnv1a_checksum_ctx,
svn_stream_from_aprfile2(file, TRUE,
b->scratch_pool),
b->scratch_pool);
SVN_ERR(svn_fs_fs__get_file_offset(&b->rep_offset, file, b->scratch_pool));
/* Get the base for this delta. */
SVN_ERR(choose_delta_base(&base_rep, fs, noderev, FALSE, b->scratch_pool));
SVN_ERR(svn_fs_fs__get_contents(&source, fs, base_rep, TRUE,
b->scratch_pool));
/* Write out the rep header. */
if (base_rep)
{
header.base_revision = base_rep->revision;
header.base_item_index = base_rep->item_index;
header.base_length = base_rep->size;
header.type = svn_fs_fs__rep_delta;
}
else
{
header.type = svn_fs_fs__rep_self_delta;
}
SVN_ERR(svn_fs_fs__write_rep_header(&header, b->rep_stream,
b->scratch_pool));
/* Now determine the offset of the actual svndiff data. */
SVN_ERR(svn_fs_fs__get_file_offset(&b->delta_start, file,
b->scratch_pool));
/* Cleanup in case something goes wrong. */
apr_pool_cleanup_register(b->scratch_pool, b, rep_write_cleanup,
apr_pool_cleanup_null);
/* Prepare to write the svndiff data. */
svn_txdelta_to_svndiff3(&wh,
&whb,
b->rep_stream,
diff_version,
ffd->delta_compression_level,
pool);
b->delta_stream = svn_txdelta_target_push(wh, whb, source,
b->scratch_pool);
*wb_p = b;
return SVN_NO_ERROR;
}
/* For REP->SHA1_CHECKSUM, try to find an already existing representation
in FS and return it in *OUT_REP. If no such representation exists or
if rep sharing has been disabled for FS, NULL will be returned. Since
there may be new duplicate representations within the same uncommitted
revision, those can be passed in REPS_HASH (maps a sha1 digest onto
representation_t*), otherwise pass in NULL for REPS_HASH.
Use RESULT_POOL for *OLD_REP allocations and SCRATCH_POOL for temporaries.
The lifetime of *OLD_REP is limited by both, RESULT_POOL and REP lifetime.
*/
static svn_error_t *
get_shared_rep(representation_t **old_rep,
svn_fs_t *fs,
representation_t *rep,
apr_hash_t *reps_hash,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_error_t *err;
fs_fs_data_t *ffd = fs->fsap_data;
/* Return NULL, if rep sharing has been disabled. */
*old_rep = NULL;
if (!ffd->rep_sharing_allowed)
return SVN_NO_ERROR;
/* Check and see if we already have a representation somewhere that's
identical to the one we just wrote out. Start with the hash lookup
because it is cheepest. */
if (reps_hash)
*old_rep = apr_hash_get(reps_hash,
rep->sha1_digest,
APR_SHA1_DIGESTSIZE);
/* If we haven't found anything yet, try harder and consult our DB. */
if (*old_rep == NULL)
{
svn_checksum_t checksum;
checksum.digest = rep->sha1_digest;
checksum.kind = svn_checksum_sha1;
err = svn_fs_fs__get_rep_reference(old_rep, fs, &checksum, result_pool);
/* ### Other error codes that we shouldn't mask out? */
if (err == SVN_NO_ERROR)
{
if (*old_rep)
SVN_ERR(svn_fs_fs__check_rep(*old_rep, fs, NULL, scratch_pool));
}
else if (err->apr_err == SVN_ERR_FS_CORRUPT
|| SVN_ERROR_IN_CATEGORY(err->apr_err,
SVN_ERR_MALFUNC_CATEGORY_START))
{
/* Fatal error; don't mask it.
In particular, this block is triggered when the rep-cache refers
to revisions in the future. We signal that as a corruption situation
since, once those revisions are less than youngest (because of more
commits), the rep-cache would be invalid.
*/
SVN_ERR(err);
}
else
{
/* Something's wrong with the rep-sharing index. We can continue
without rep-sharing, but warn.
*/
(fs->warning)(fs->warning_baton, err);
svn_error_clear(err);
*old_rep = NULL;
}
}
/* look for intra-revision matches (usually data reps but not limited
to them in case props happen to look like some data rep)
*/
if (*old_rep == NULL && is_txn_rep(rep))
{
svn_node_kind_t kind;
const char *file_name
= path_txn_sha1(fs, &rep->txn_id, rep->sha1_digest, scratch_pool);
/* in our txn, is there a rep file named with the wanted SHA1?
If so, read it and use that rep.
*/
SVN_ERR(svn_io_check_path(file_name, &kind, scratch_pool));
if (kind == svn_node_file)
{
svn_stringbuf_t *rep_string;
SVN_ERR(svn_stringbuf_from_file2(&rep_string, file_name,
scratch_pool));
SVN_ERR(svn_fs_fs__parse_representation(old_rep, rep_string,
result_pool, scratch_pool));
}
}
if (!*old_rep)
return SVN_NO_ERROR;
/* We don't want 0-length PLAIN representations to replace non-0-length
ones (see issue #4554). Take into account that EXPANDED_SIZE may be
0 in which case we have to check the on-disk SIZE. Also, this doubles
as a simple guard against general rep-cache induced corruption. */
if ( ((*old_rep)->expanded_size != rep->expanded_size)
|| ((rep->expanded_size == 0) && ((*old_rep)->size != rep->size)))
{
*old_rep = NULL;
}
else
{
/* Add information that is missing in the cached data.
Use the old rep for this content. */
memcpy((*old_rep)->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
(*old_rep)->uniquifier = rep->uniquifier;
}
return SVN_NO_ERROR;
}
/* Copy the hash sum calculation results from MD5_CTX, SHA1_CTX into REP.
* Use POOL for allocations.
*/
static svn_error_t *
digests_final(representation_t *rep,
const svn_checksum_ctx_t *md5_ctx,
const svn_checksum_ctx_t *sha1_ctx,
apr_pool_t *pool)
{
svn_checksum_t *checksum;
SVN_ERR(svn_checksum_final(&checksum, md5_ctx, pool));
memcpy(rep->md5_digest, checksum->digest, svn_checksum_size(checksum));
SVN_ERR(svn_checksum_final(&checksum, sha1_ctx, pool));
rep->has_sha1 = checksum != NULL;
if (rep->has_sha1)
memcpy(rep->sha1_digest, checksum->digest, svn_checksum_size(checksum));
return SVN_NO_ERROR;
}
/* Close handler for the representation write stream. BATON is a
rep_write_baton. Writes out a new node-rev that correctly
references the representation we just finished writing. */
static svn_error_t *
rep_write_contents_close(void *baton)
{
struct rep_write_baton *b = baton;
representation_t *rep;
representation_t *old_rep;
apr_off_t offset;
rep = apr_pcalloc(b->result_pool, sizeof(*rep));
/* Close our delta stream so the last bits of svndiff are written
out. */
if (b->delta_stream)
SVN_ERR(svn_stream_close(b->delta_stream));
/* Determine the length of the svndiff data. */
SVN_ERR(svn_fs_fs__get_file_offset(&offset, b->file, b->scratch_pool));
rep->size = offset - b->delta_start;
/* Fill in the rest of the representation field. */
rep->expanded_size = b->rep_size;
rep->txn_id = *svn_fs_fs__id_txn_id(b->noderev->id);
SVN_ERR(set_uniquifier(b->fs, rep, b->scratch_pool));
rep->revision = SVN_INVALID_REVNUM;
/* Finalize the checksum. */
SVN_ERR(digests_final(rep, b->md5_checksum_ctx, b->sha1_checksum_ctx,
b->result_pool));
/* Check and see if we already have a representation somewhere that's
identical to the one we just wrote out. */
SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, NULL, b->result_pool,
b->scratch_pool));
if (old_rep)
{
/* We need to erase from the protorev the data we just wrote. */
SVN_ERR(svn_io_file_trunc(b->file, b->rep_offset, b->scratch_pool));
/* Use the old rep for this content. */
b->noderev->data_rep = old_rep;
}
else
{
/* Write out our cosmetic end marker. */
SVN_ERR(svn_stream_puts(b->rep_stream, "ENDREP\n"));
SVN_ERR(allocate_item_index(&rep->item_index, b->fs, &rep->txn_id,
b->rep_offset, b->scratch_pool));
b->noderev->data_rep = rep;
}
/* Remove cleanup callback. */
apr_pool_cleanup_kill(b->scratch_pool, b, rep_write_cleanup);
/* Write out the new node-rev information. */
SVN_ERR(svn_fs_fs__put_node_revision(b->fs, b->noderev->id, b->noderev,
FALSE, b->scratch_pool));
if (!old_rep)
{
svn_fs_fs__p2l_entry_t entry;
entry.offset = b->rep_offset;
SVN_ERR(svn_fs_fs__get_file_offset(&offset, b->file, b->scratch_pool));
entry.size = offset - b->rep_offset;
entry.type = SVN_FS_FS__ITEM_TYPE_FILE_REP;
entry.item.revision = SVN_INVALID_REVNUM;
entry.item.number = rep->item_index;
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
b->fnv1a_checksum_ctx,
b->scratch_pool));
- SVN_ERR(store_sha1_rep_mapping(b->fs, b->noderev, b->scratch_pool));
SVN_ERR(store_p2l_index_entry(b->fs, &rep->txn_id, &entry,
b->scratch_pool));
}
SVN_ERR(svn_io_file_close(b->file, b->scratch_pool));
+
+ /* Write the sha1->rep mapping *after* we successfully written node
+ * revision to disk. */
+ if (!old_rep)
+ SVN_ERR(store_sha1_rep_mapping(b->fs, b->noderev, b->scratch_pool));
+
SVN_ERR(unlock_proto_rev(b->fs, &rep->txn_id, b->lockcookie,
b->scratch_pool));
svn_pool_destroy(b->scratch_pool);
return SVN_NO_ERROR;
}
/* Store a writable stream in *CONTENTS_P that will receive all data
written and store it as the file data representation referenced by
NODEREV in filesystem FS. Perform temporary allocations in
POOL. Only appropriate for file data, not props or directory
contents. */
static svn_error_t *
set_representation(svn_stream_t **contents_p,
svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *pool)
{
struct rep_write_baton *wb;
if (! svn_fs_fs__id_is_txn(noderev->id))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Attempted to write to non-transaction '%s'"),
svn_fs_fs__id_unparse(noderev->id, pool)->data);
SVN_ERR(rep_write_get_baton(&wb, fs, noderev, pool));
*contents_p = svn_stream_create(wb, pool);
svn_stream_set_write(*contents_p, rep_write_contents);
svn_stream_set_close(*contents_p, rep_write_contents_close);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__set_contents(svn_stream_t **stream,
svn_fs_t *fs,
node_revision_t *noderev,
apr_pool_t *pool)
{
if (noderev->kind != svn_node_file)
return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
_("Can't set text contents of a directory"));
return set_representation(stream, fs, noderev, pool);
}
svn_error_t *
svn_fs_fs__create_successor(const svn_fs_id_t **new_id_p,
svn_fs_t *fs,
const svn_fs_id_t *old_idp,
node_revision_t *new_noderev,
const svn_fs_fs__id_part_t *copy_id,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *id;
if (! copy_id)
copy_id = svn_fs_fs__id_copy_id(old_idp);
id = svn_fs_fs__id_txn_create(svn_fs_fs__id_node_id(old_idp), copy_id,
txn_id, pool);
new_noderev->id = id;
if (! new_noderev->copyroot_path)
{
new_noderev->copyroot_path = apr_pstrdup(pool,
new_noderev->created_path);
new_noderev->copyroot_rev = svn_fs_fs__id_rev(new_noderev->id);
}
SVN_ERR(svn_fs_fs__put_node_revision(fs, new_noderev->id, new_noderev, FALSE,
pool));
*new_id_p = id;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__set_proplist(svn_fs_t *fs,
node_revision_t *noderev,
apr_hash_t *proplist,
apr_pool_t *pool)
{
const char *filename
= svn_fs_fs__path_txn_node_props(fs, noderev->id, pool);
apr_file_t *file;
svn_stream_t *out;
/* Dump the property list to the mutable property file. */
SVN_ERR(svn_io_file_open(&file, filename,
APR_WRITE | APR_CREATE | APR_TRUNCATE
| APR_BUFFERED, APR_OS_DEFAULT, pool));
out = svn_stream_from_aprfile2(file, TRUE, pool);
SVN_ERR(svn_hash_write2(proplist, out, SVN_HASH_TERMINATOR, pool));
SVN_ERR(svn_io_file_close(file, pool));
/* Mark the node-rev's prop rep as mutable, if not already done. */
if (!noderev->prop_rep || !is_txn_rep(noderev->prop_rep))
{
noderev->prop_rep = apr_pcalloc(pool, sizeof(*noderev->prop_rep));
noderev->prop_rep->txn_id = *svn_fs_fs__id_txn_id(noderev->id);
SVN_ERR(svn_fs_fs__put_node_revision(fs, noderev->id, noderev, FALSE,
pool));
}
return SVN_NO_ERROR;
}
/* This baton is used by the stream created for write_container_rep. */
struct write_container_baton
{
svn_stream_t *stream;
apr_size_t size;
svn_checksum_ctx_t *md5_ctx;
svn_checksum_ctx_t *sha1_ctx;
};
/* The handler for the write_container_rep stream. BATON is a
write_container_baton, DATA has the data to write and *LEN is the number
of bytes to write. */
static svn_error_t *
write_container_handler(void *baton,
const char *data,
apr_size_t *len)
{
struct write_container_baton *whb = baton;
SVN_ERR(svn_checksum_update(whb->md5_ctx, data, *len));
SVN_ERR(svn_checksum_update(whb->sha1_ctx, data, *len));
SVN_ERR(svn_stream_write(whb->stream, data, len));
whb->size += *len;
return SVN_NO_ERROR;
}
/* Callback function type. Write the data provided by BATON into STREAM. */
typedef svn_error_t *
(* collection_writer_t)(svn_stream_t *stream, void *baton, apr_pool_t *pool);
/* Implement collection_writer_t writing the C string->svn_string_t hash
given as BATON. */
static svn_error_t *
write_hash_to_stream(svn_stream_t *stream,
void *baton,
apr_pool_t *pool)
{
apr_hash_t *hash = baton;
SVN_ERR(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, pool));
return SVN_NO_ERROR;
}
/* Implement collection_writer_t writing the svn_fs_dirent_t* array given
as BATON. */
static svn_error_t *
write_directory_to_stream(svn_stream_t *stream,
void *baton,
apr_pool_t *pool)
{
apr_array_header_t *dir = baton;
SVN_ERR(unparse_dir_entries(dir, stream, pool));
return SVN_NO_ERROR;
}
/* Write out the COLLECTION as a text representation to file FILE using
WRITER. In the process, record position, the total size of the dump and
MD5 as well as SHA1 in REP. Add the representation of type ITEM_TYPE to
the indexes if necessary. If rep sharing has been enabled and REPS_HASH
is not NULL, it will be used in addition to the on-disk cache to find
earlier reps with the same content. When such existing reps can be
found, we will truncate the one just written from the file and return
the existing rep. Perform temporary allocations in SCRATCH_POOL. */
static svn_error_t *
write_container_rep(representation_t *rep,
apr_file_t *file,
void *collection,
collection_writer_t writer,
svn_fs_t *fs,
apr_hash_t *reps_hash,
apr_uint32_t item_type,
apr_pool_t *scratch_pool)
{
svn_stream_t *stream;
struct write_container_baton *whb;
svn_checksum_ctx_t *fnv1a_checksum_ctx;
representation_t *old_rep;
apr_off_t offset = 0;
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
whb = apr_pcalloc(scratch_pool, sizeof(*whb));
whb->stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
svn_stream_from_aprfile2(file, TRUE,
scratch_pool),
scratch_pool);
whb->size = 0;
whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, scratch_pool);
stream = svn_stream_create(whb, scratch_pool);
svn_stream_set_write(stream, write_container_handler);
SVN_ERR(svn_stream_puts(whb->stream, "PLAIN\n"));
SVN_ERR(writer(stream, collection, scratch_pool));
/* Store the results. */
SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
/* Check and see if we already have a representation somewhere that's
identical to the one we just wrote out. */
SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, scratch_pool,
scratch_pool));
if (old_rep)
{
/* We need to erase from the protorev the data we just wrote. */
SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
/* Use the old rep for this content. */
memcpy(rep, old_rep, sizeof (*rep));
}
else
{
svn_fs_fs__p2l_entry_t entry;
/* Write out our cosmetic end marker. */
SVN_ERR(svn_stream_puts(whb->stream, "ENDREP\n"));
SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
offset, scratch_pool));
entry.offset = offset;
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
entry.size = offset - entry.offset;
entry.type = item_type;
entry.item.revision = SVN_INVALID_REVNUM;
entry.item.number = rep->item_index;
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
fnv1a_checksum_ctx,
scratch_pool));
SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
/* update the representation */
rep->size = whb->size;
rep->expanded_size = whb->size;
}
return SVN_NO_ERROR;
}
/* Write out the COLLECTION pertaining to the NODEREV in FS as a deltified
text representation to file FILE using WRITER. In the process, record the
total size and the md5 digest in REP and add the representation of type
ITEM_TYPE to the indexes if necessary. If rep sharing has been enabled and
REPS_HASH is not NULL, it will be used in addition to the on-disk cache to
find earlier reps with the same content. When such existing reps can be
found, we will truncate the one just written from the file and return the
existing rep.
If ITEM_TYPE is IS_PROPS equals SVN_FS_FS__ITEM_TYPE_*_PROPS, assume
that we want to a props representation as the base for our delta.
Perform temporary allocations in SCRATCH_POOL.
*/
static svn_error_t *
write_container_delta_rep(representation_t *rep,
apr_file_t *file,
void *collection,
collection_writer_t writer,
svn_fs_t *fs,
node_revision_t *noderev,
apr_hash_t *reps_hash,
apr_uint32_t item_type,
apr_pool_t *scratch_pool)
{
svn_txdelta_window_handler_t diff_wh;
void *diff_whb;
svn_stream_t *file_stream;
svn_stream_t *stream;
representation_t *base_rep;
representation_t *old_rep;
svn_checksum_ctx_t *fnv1a_checksum_ctx;
svn_stream_t *source;
svn_fs_fs__rep_header_t header = { 0 };
apr_off_t rep_end = 0;
apr_off_t delta_start = 0;
apr_off_t offset = 0;
struct write_container_baton *whb;
fs_fs_data_t *ffd = fs->fsap_data;
int diff_version = ffd->format >= SVN_FS_FS__MIN_SVNDIFF1_FORMAT ? 1 : 0;
svn_boolean_t is_props = (item_type == SVN_FS_FS__ITEM_TYPE_FILE_PROPS)
|| (item_type == SVN_FS_FS__ITEM_TYPE_DIR_PROPS);
/* Get the base for this delta. */
SVN_ERR(choose_delta_base(&base_rep, fs, noderev, is_props, scratch_pool));
SVN_ERR(svn_fs_fs__get_contents(&source, fs, base_rep, FALSE, scratch_pool));
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
/* Write out the rep header. */
if (base_rep)
{
header.base_revision = base_rep->revision;
header.base_item_index = base_rep->item_index;
header.base_length = base_rep->size;
header.type = svn_fs_fs__rep_delta;
}
else
{
header.type = svn_fs_fs__rep_self_delta;
}
file_stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
svn_stream_from_aprfile2(file, TRUE,
scratch_pool),
scratch_pool);
SVN_ERR(svn_fs_fs__write_rep_header(&header, file_stream, scratch_pool));
SVN_ERR(svn_fs_fs__get_file_offset(&delta_start, file, scratch_pool));
/* Prepare to write the svndiff data. */
svn_txdelta_to_svndiff3(&diff_wh,
&diff_whb,
file_stream,
diff_version,
ffd->delta_compression_level,
scratch_pool);
whb = apr_pcalloc(scratch_pool, sizeof(*whb));
whb->stream = svn_txdelta_target_push(diff_wh, diff_whb, source,
scratch_pool);
whb->size = 0;
whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, scratch_pool);
/* serialize the hash */
stream = svn_stream_create(whb, scratch_pool);
svn_stream_set_write(stream, write_container_handler);
SVN_ERR(writer(stream, collection, scratch_pool));
SVN_ERR(svn_stream_close(whb->stream));
/* Store the results. */
SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
/* Check and see if we already have a representation somewhere that's
identical to the one we just wrote out. */
SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, scratch_pool,
scratch_pool));
if (old_rep)
{
/* We need to erase from the protorev the data we just wrote. */
SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
/* Use the old rep for this content. */
memcpy(rep, old_rep, sizeof (*rep));
}
else
{
svn_fs_fs__p2l_entry_t entry;
/* Write out our cosmetic end marker. */
SVN_ERR(svn_fs_fs__get_file_offset(&rep_end, file, scratch_pool));
SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n"));
SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
offset, scratch_pool));
entry.offset = offset;
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
entry.size = offset - entry.offset;
entry.type = item_type;
entry.item.revision = SVN_INVALID_REVNUM;
entry.item.number = rep->item_index;
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
fnv1a_checksum_ctx,
scratch_pool));
SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
/* update the representation */
rep->expanded_size = whb->size;
rep->size = rep_end - delta_start;
}
return SVN_NO_ERROR;
}
/* Sanity check ROOT_NODEREV, a candidate for being the root node-revision
of (not yet committed) revision REV in FS. Use POOL for temporary
allocations.
If you change this function, consider updating svn_fs_fs__verify() too.
*/
static svn_error_t *
validate_root_noderev(svn_fs_t *fs,
node_revision_t *root_noderev,
svn_revnum_t rev,
apr_pool_t *pool)
{
svn_revnum_t head_revnum = rev-1;
int head_predecessor_count;
SVN_ERR_ASSERT(rev > 0);
/* Compute HEAD_PREDECESSOR_COUNT. */
{
svn_fs_root_t *head_revision;
const svn_fs_id_t *head_root_id;
node_revision_t *head_root_noderev;
/* Get /@HEAD's noderev. */
SVN_ERR(svn_fs_fs__revision_root(&head_revision, fs, head_revnum, pool));
SVN_ERR(svn_fs_fs__node_id(&head_root_id, head_revision, "/", pool));
SVN_ERR(svn_fs_fs__get_node_revision(&head_root_noderev, fs, head_root_id,
pool, pool));
head_predecessor_count = head_root_noderev->predecessor_count;
}
/* Check that the root noderev's predecessor count equals REV.
This kind of corruption was seen on svn.apache.org (both on
the root noderev and on other fspaths' noderevs); see
issue #4129.
Normally (rev == root_noderev->predecessor_count), but here we
use a more roundabout check that should only trigger on new instances
of the corruption, rather then trigger on each and every new commit
to a repository that has triggered the bug somewhere in its root
noderev's history.
*/
if (root_noderev->predecessor_count != -1
&& (root_noderev->predecessor_count - head_predecessor_count)
!= (rev - head_revnum))
{
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("predecessor count for "
"the root node-revision is wrong: "
"found (%d+%ld != %d), committing r%ld"),
head_predecessor_count,
rev - head_revnum, /* This is equal to 1. */
root_noderev->predecessor_count,
rev);
}
return SVN_NO_ERROR;
}
/* Given the potentially txn-local id PART, update that to a permanent ID
* based on the REVISION currently being written and the START_ID for that
* revision. Use the repo FORMAT to decide which implementation to use.
*/
static void
get_final_id(svn_fs_fs__id_part_t *part,
svn_revnum_t revision,
apr_uint64_t start_id,
int format)
{
if (part->revision == SVN_INVALID_REVNUM)
{
if (format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
{
part->revision = revision;
}
else
{
part->revision = 0;
part->number += start_id;
}
}
}
/* Copy a node-revision specified by id ID in fileystem FS from a
transaction into the proto-rev-file FILE. Set *NEW_ID_P to a
pointer to the new node-id which will be allocated in POOL.
If this is a directory, copy all children as well.
START_NODE_ID and START_COPY_ID are
the first available node and copy ids for this filesystem, for older
FS formats.
REV is the revision number that this proto-rev-file will represent.
INITIAL_OFFSET is the offset of the proto-rev-file on entry to
commit_body.
If REPS_TO_CACHE is not NULL, append to it a copy (allocated in
REPS_POOL) of each data rep that is new in this revision.
If REPS_HASH is not NULL, append copies (allocated in REPS_POOL)
of the representations of each property rep that is new in this
revision.
AT_ROOT is true if the node revision being written is the root
node-revision. It is only controls additional sanity checking
logic.
Temporary allocations are also from POOL. */
static svn_error_t *
write_final_rev(const svn_fs_id_t **new_id_p,
apr_file_t *file,
svn_revnum_t rev,
svn_fs_t *fs,
const svn_fs_id_t *id,
apr_uint64_t start_node_id,
apr_uint64_t start_copy_id,
apr_off_t initial_offset,
apr_array_header_t *reps_to_cache,
apr_hash_t *reps_hash,
apr_pool_t *reps_pool,
svn_boolean_t at_root,
apr_pool_t *pool)
{
node_revision_t *noderev;
apr_off_t my_offset;
const svn_fs_id_t *new_id;
svn_fs_fs__id_part_t node_id, copy_id, rev_item;
fs_fs_data_t *ffd = fs->fsap_data;
const svn_fs_fs__id_part_t *txn_id = svn_fs_fs__id_txn_id(id);
svn_stream_t *file_stream;
svn_checksum_ctx_t *fnv1a_checksum_ctx;
apr_pool_t *subpool;
*new_id_p = NULL;
/* Check to see if this is a transaction node. */
if (! svn_fs_fs__id_is_txn(id))
return SVN_NO_ERROR;
subpool = svn_pool_create(pool);
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, pool, subpool));
if (noderev->kind == svn_node_dir)
{
apr_array_header_t *entries;
int i;
/* This is a directory. Write out all the children first. */
SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, noderev, pool,
subpool));
for (i = 0; i < entries->nelts; ++i)
{
svn_fs_dirent_t *dirent
= APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
svn_pool_clear(subpool);
SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
start_node_id, start_copy_id, initial_offset,
reps_to_cache, reps_hash, reps_pool, FALSE,
subpool));
if (new_id && (svn_fs_fs__id_rev(new_id) == rev))
dirent->id = svn_fs_fs__id_copy(new_id, pool);
}
if (noderev->data_rep && is_txn_rep(noderev->data_rep))
{
/* Write out the contents of this directory as a text rep. */
noderev->data_rep->revision = rev;
if (ffd->deltify_directories)
SVN_ERR(write_container_delta_rep(noderev->data_rep, file,
entries,
write_directory_to_stream,
fs, noderev, NULL,
SVN_FS_FS__ITEM_TYPE_DIR_REP,
pool));
else
SVN_ERR(write_container_rep(noderev->data_rep, file, entries,
write_directory_to_stream, fs, NULL,
SVN_FS_FS__ITEM_TYPE_DIR_REP, pool));
reset_txn_in_rep(noderev->data_rep);
}
}
else
{
/* This is a file. We should make sure the data rep, if it
exists in a "this" state, gets rewritten to our new revision
num. */
if (noderev->data_rep && is_txn_rep(noderev->data_rep))
{
reset_txn_in_rep(noderev->data_rep);
noderev->data_rep->revision = rev;
if (!svn_fs_fs__use_log_addressing(fs))
{
/* See issue 3845. Some unknown mechanism caused the
protorev file to get truncated, so check for that
here. */
if (noderev->data_rep->item_index + noderev->data_rep->size
> initial_offset)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Truncated protorev file detected"));
}
}
}
svn_pool_destroy(subpool);
/* Fix up the property reps. */
if (noderev->prop_rep && is_txn_rep(noderev->prop_rep))
{
apr_hash_t *proplist;
apr_uint32_t item_type = noderev->kind == svn_node_dir
? SVN_FS_FS__ITEM_TYPE_DIR_PROPS
: SVN_FS_FS__ITEM_TYPE_FILE_PROPS;
SVN_ERR(svn_fs_fs__get_proplist(&proplist, fs, noderev, pool));
noderev->prop_rep->revision = rev;
if (ffd->deltify_properties)
SVN_ERR(write_container_delta_rep(noderev->prop_rep, file, proplist,
write_hash_to_stream, fs, noderev,
reps_hash, item_type, pool));
else
SVN_ERR(write_container_rep(noderev->prop_rep, file, proplist,
write_hash_to_stream, fs, reps_hash,
item_type, pool));
reset_txn_in_rep(noderev->prop_rep);
}
/* Convert our temporary ID into a permanent revision one. */
node_id = *svn_fs_fs__id_node_id(noderev->id);
get_final_id(&node_id, rev, start_node_id, ffd->format);
copy_id = *svn_fs_fs__id_copy_id(noderev->id);
get_final_id(&copy_id, rev, start_copy_id, ffd->format);
if (noderev->copyroot_rev == SVN_INVALID_REVNUM)
noderev->copyroot_rev = rev;
/* root nodes have a fixed ID in log addressing mode */
SVN_ERR(svn_fs_fs__get_file_offset(&my_offset, file, pool));
if (svn_fs_fs__use_log_addressing(fs) && at_root)
{
/* reference the root noderev from the log-to-phys index */
rev_item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset,
rev_item.number, pool));
}
else
SVN_ERR(allocate_item_index(&rev_item.number, fs, txn_id,
my_offset, pool));
rev_item.revision = rev;
new_id = svn_fs_fs__id_rev_create(&node_id, &copy_id, &rev_item, pool);
noderev->id = new_id;
if (ffd->rep_sharing_allowed)
{
/* Save the data representation's hash in the rep cache. */
if ( noderev->data_rep && noderev->kind == svn_node_file
&& noderev->data_rep->revision == rev)
{
SVN_ERR_ASSERT(reps_to_cache && reps_pool);
APR_ARRAY_PUSH(reps_to_cache, representation_t *)
= svn_fs_fs__rep_copy(noderev->data_rep, reps_pool);
}
if (noderev->prop_rep && noderev->prop_rep->revision == rev)
{
/* Add new property reps to hash and on-disk cache. */
representation_t *copy
= svn_fs_fs__rep_copy(noderev->prop_rep, reps_pool);
SVN_ERR_ASSERT(reps_to_cache && reps_pool);
APR_ARRAY_PUSH(reps_to_cache, representation_t *) = copy;
apr_hash_set(reps_hash,
copy->sha1_digest,
APR_SHA1_DIGESTSIZE,
copy);
}
}
/* don't serialize SHA1 for dirs to disk (waste of space) */
if (noderev->data_rep && noderev->kind == svn_node_dir)
noderev->data_rep->has_sha1 = FALSE;
/* don't serialize SHA1 for props to disk (waste of space) */
if (noderev->prop_rep)
noderev->prop_rep->has_sha1 = FALSE;
/* Workaround issue #4031: is-fresh-txn-root in revision files. */
noderev->is_fresh_txn_root = FALSE;
/* Write out our new node-revision. */
if (at_root)
SVN_ERR(validate_root_noderev(fs, noderev, rev, pool));
file_stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
svn_stream_from_aprfile2(file, TRUE, pool),
pool);
SVN_ERR(svn_fs_fs__write_noderev(file_stream, noderev, ffd->format,
svn_fs_fs__fs_supports_mergeinfo(fs),
pool));
/* reference the root noderev from the log-to-phys index */
if (svn_fs_fs__use_log_addressing(fs))
{
svn_fs_fs__p2l_entry_t entry;
rev_item.revision = SVN_INVALID_REVNUM;
entry.offset = my_offset;
SVN_ERR(svn_fs_fs__get_file_offset(&my_offset, file, pool));
entry.size = my_offset - entry.offset;
entry.type = SVN_FS_FS__ITEM_TYPE_NODEREV;
entry.item = rev_item;
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
fnv1a_checksum_ctx,
pool));
SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, pool));
}
/* Return our ID that references the revision file. */
*new_id_p = noderev->id;
return SVN_NO_ERROR;
}
/* Write the changed path info CHANGED_PATHS from transaction TXN_ID to the
permanent rev-file FILE in filesystem FS. *OFFSET_P is set the to offset
in the file of the beginning of this information. Perform temporary
allocations in POOL. */
static svn_error_t *
write_final_changed_path_info(apr_off_t *offset_p,
apr_file_t *file,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_hash_t *changed_paths,
apr_pool_t *pool)
{
apr_off_t offset;
svn_stream_t *stream;
svn_checksum_ctx_t *fnv1a_checksum_ctx;
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, pool));
/* write to target file & calculate checksum */
stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
svn_stream_from_aprfile2(file, TRUE, pool),
pool);
SVN_ERR(svn_fs_fs__write_changes(stream, fs, changed_paths, TRUE, pool));
*offset_p = offset;
/* reference changes from the indexes */
if (svn_fs_fs__use_log_addressing(fs))
{
svn_fs_fs__p2l_entry_t entry;
entry.offset = offset;
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, pool));
entry.size = offset - entry.offset;
entry.type = SVN_FS_FS__ITEM_TYPE_CHANGES;
entry.item.revision = SVN_INVALID_REVNUM;
entry.item.number = SVN_FS_FS__ITEM_INDEX_CHANGES;
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
fnv1a_checksum_ctx,
pool));
SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, pool));
SVN_ERR(store_l2p_index_entry(fs, txn_id, entry.offset,
SVN_FS_FS__ITEM_INDEX_CHANGES, pool));
}
return SVN_NO_ERROR;
}
/* Open a new svn_fs_t handle to FS, set that handle's concept of "current
youngest revision" to NEW_REV, and call svn_fs_fs__verify_root() on
NEW_REV's revision root.
Intended to be called as the very last step in a commit before 'current'
is bumped. This implies that we are holding the write lock. */
static svn_error_t *
verify_as_revision_before_current_plus_plus(svn_fs_t *fs,
svn_revnum_t new_rev,
apr_pool_t *pool)
{
#ifdef SVN_DEBUG
fs_fs_data_t *ffd = fs->fsap_data;
svn_fs_t *ft; /* fs++ == ft */
svn_fs_root_t *root;
fs_fs_data_t *ft_ffd;
apr_hash_t *fs_config;
SVN_ERR_ASSERT(ffd->svn_fs_open_);
/* make sure FT does not simply return data cached by other instances
* but actually retrieves it from disk at least once.
*/
fs_config = apr_hash_make(pool);
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
svn_uuid_generate(pool));
SVN_ERR(ffd->svn_fs_open_(&ft, fs->path,
fs_config,
pool,
pool));
ft_ffd = ft->fsap_data;
/* Don't let FT consult rep-cache.db, either. */
ft_ffd->rep_sharing_allowed = FALSE;
/* Time travel! */
ft_ffd->youngest_rev_cache = new_rev;
SVN_ERR(svn_fs_fs__revision_root(&root, ft, new_rev, pool));
SVN_ERR_ASSERT(root->is_txn_root == FALSE && root->rev == new_rev);
SVN_ERR_ASSERT(ft_ffd->youngest_rev_cache == new_rev);
SVN_ERR(svn_fs_fs__verify_root(root, pool));
#endif /* SVN_DEBUG */
return SVN_NO_ERROR;
}
/* Update the 'current' file to hold the correct next node and copy_ids
from transaction TXN_ID in filesystem FS. The current revision is
set to REV. Perform temporary allocations in POOL. */
static svn_error_t *
write_final_current(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
svn_revnum_t rev,
apr_uint64_t start_node_id,
apr_uint64_t start_copy_id,
apr_pool_t *pool)
{
apr_uint64_t txn_node_id;
apr_uint64_t txn_copy_id;
fs_fs_data_t *ffd = fs->fsap_data;
if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
return svn_fs_fs__write_current(fs, rev, 0, 0, pool);
/* To find the next available ids, we add the id that used to be in
the 'current' file, to the next ids from the transaction file. */
SVN_ERR(read_next_ids(&txn_node_id, &txn_copy_id, fs, txn_id, pool));
start_node_id += txn_node_id;
start_copy_id += txn_copy_id;
return svn_fs_fs__write_current(fs, rev, start_node_id, start_copy_id,
pool);
}
/* Verify that the user registered with FS has all the locks necessary to
permit all the changes associated with TXN_NAME.
The FS write lock is assumed to be held by the caller. */
static svn_error_t *
verify_locks(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_hash_t *changed_paths,
apr_pool_t *pool)
{
apr_pool_t *iterpool;
apr_array_header_t *changed_paths_sorted;
svn_stringbuf_t *last_recursed = NULL;
int i;
/* Make an array of the changed paths, and sort them depth-first-ily. */
changed_paths_sorted = svn_sort__hash(changed_paths,
svn_sort_compare_items_as_paths,
pool);
/* Now, traverse the array of changed paths, verify locks. Note
that if we need to do a recursive verification a path, we'll skip
over children of that path when we get to them. */
iterpool = svn_pool_create(pool);
for (i = 0; i < changed_paths_sorted->nelts; i++)
{
const svn_sort__item_t *item;
const char *path;
svn_fs_path_change2_t *change;
svn_boolean_t recurse = TRUE;
svn_pool_clear(iterpool);
item = &APR_ARRAY_IDX(changed_paths_sorted, i, svn_sort__item_t);
/* Fetch the change associated with our path. */
path = item->key;
change = item->value;
/* If this path has already been verified as part of a recursive
check of one of its parents, no need to do it again. */
if (last_recursed
&& svn_fspath__skip_ancestor(last_recursed->data, path))
continue;
/* What does it mean to succeed at lock verification for a given
path? For an existing file or directory getting modified
(text, props), it means we hold the lock on the file or
directory. For paths being added or removed, we need to hold
the locks for that path and any children of that path.
WHEW! We have no reliable way to determine the node kind
of deleted items, but fortunately we are going to do a
recursive check on deleted paths regardless of their kind. */
if (change->change_kind == svn_fs_path_change_modify)
recurse = FALSE;
SVN_ERR(svn_fs_fs__allow_locked_operation(path, fs, recurse, TRUE,
iterpool));
/* If we just did a recursive check, remember the path we
checked (so children can be skipped). */
if (recurse)
{
if (! last_recursed)
last_recursed = svn_stringbuf_create(path, pool);
else
svn_stringbuf_set(last_recursed, path);
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Return in *PATH the path to a file containing the properties that
make up the final revision properties file. This involves setting
svn:date and removing any temporary properties associated with the
commit flags. */
static svn_error_t *
write_final_revprop(const char **path,
svn_fs_txn_t *txn,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
apr_hash_t *txnprops;
svn_boolean_t final_mods = FALSE;
svn_string_t date;
svn_string_t *client_date;
SVN_ERR(svn_fs_fs__txn_proplist(&txnprops, txn, pool));
/* Remove any temporary txn props representing 'flags'. */
if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
{
svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
final_mods = TRUE;
}
if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
{
svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
final_mods = TRUE;
}
client_date = svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE);
if (client_date)
{
svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE, NULL);
final_mods = TRUE;
}
/* Update commit time to ensure that svn:date revprops remain ordered if
requested. */
if (!client_date || strcmp(client_date->data, "1"))
{
date.data = svn_time_to_cstring(apr_time_now(), pool);
date.len = strlen(date.data);
svn_hash_sets(txnprops, SVN_PROP_REVISION_DATE, &date);
final_mods = TRUE;
}
if (final_mods)
{
SVN_ERR(set_txn_proplist(txn->fs, txn_id, txnprops, TRUE, pool));
*path = path_txn_props_final(txn->fs, txn_id, pool);
}
else
{
*path = path_txn_props(txn->fs, txn_id, pool);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__add_index_data(svn_fs_t *fs,
apr_file_t *file,
const char *l2p_proto_index,
const char *p2l_proto_index,
svn_revnum_t revision,
apr_pool_t *pool)
{
apr_off_t l2p_offset;
apr_off_t p2l_offset;
svn_stringbuf_t *footer;
unsigned char footer_length;
svn_checksum_t *l2p_checksum;
svn_checksum_t *p2l_checksum;
/* Append the actual index data to the pack file. */
l2p_offset = 0;
SVN_ERR(svn_io_file_seek(file, APR_END, &l2p_offset, pool));
SVN_ERR(svn_fs_fs__l2p_index_append(&l2p_checksum, fs, file,
l2p_proto_index, revision,
pool, pool));
p2l_offset = 0;
SVN_ERR(svn_io_file_seek(file, APR_END, &p2l_offset, pool));
SVN_ERR(svn_fs_fs__p2l_index_append(&p2l_checksum, fs, file,
p2l_proto_index, revision,
pool, pool));
/* Append footer. */
footer = svn_fs_fs__unparse_footer(l2p_offset, l2p_checksum,
p2l_offset, p2l_checksum, pool, pool);
SVN_ERR(svn_io_file_write_full(file, footer->data, footer->len, NULL,
pool));
footer_length = footer->len;
SVN_ERR_ASSERT(footer_length == footer->len);
SVN_ERR(svn_io_file_write_full(file, &footer_length, 1, NULL, pool));
return SVN_NO_ERROR;
}
/* Baton used for commit_body below. */
struct commit_baton {
svn_revnum_t *new_rev_p;
svn_fs_t *fs;
svn_fs_txn_t *txn;
apr_array_header_t *reps_to_cache;
apr_hash_t *reps_hash;
apr_pool_t *reps_pool;
};
/* The work-horse for svn_fs_fs__commit, called with the FS write lock.
This implements the svn_fs_fs__with_write_lock() 'body' callback
type. BATON is a 'struct commit_baton *'. */
static svn_error_t *
commit_body(void *baton, apr_pool_t *pool)
{
struct commit_baton *cb = baton;
fs_fs_data_t *ffd = cb->fs->fsap_data;
const char *old_rev_filename, *rev_filename, *proto_filename;
const char *revprop_filename, *final_revprop;
const svn_fs_id_t *root_id, *new_root_id;
apr_uint64_t start_node_id;
apr_uint64_t start_copy_id;
svn_revnum_t old_rev, new_rev;
apr_file_t *proto_file;
void *proto_file_lockcookie;
apr_off_t initial_offset, changed_path_offset;
const svn_fs_fs__id_part_t *txn_id = svn_fs_fs__txn_get_id(cb->txn);
apr_hash_t *changed_paths;
/* Re-Read the current repository format. All our repo upgrade and
config evaluation strategies are such that existing information in
FS and FFD remains valid.
Although we don't recommend upgrading hot repositories, people may
still do it and we must make sure to either handle them gracefully
or to error out.
Committing pre-format 3 txns will fail after upgrade to format 3+
because the proto-rev cannot be found; no further action needed.
Upgrades from pre-f7 to f7+ means a potential change in addressing
mode for the final rev. We must be sure to detect that cause because
the failure would only manifest once the new revision got committed.
*/
SVN_ERR(svn_fs_fs__read_format_file(cb->fs, pool));
/* Read the current youngest revision and, possibly, the next available
node id and copy id (for old format filesystems). Update the cached
value for the youngest revision, because we have just checked it. */
SVN_ERR(svn_fs_fs__read_current(&old_rev, &start_node_id, &start_copy_id,
cb->fs, pool));
ffd->youngest_rev_cache = old_rev;
/* Check to make sure this transaction is based off the most recent
revision. */
if (cb->txn->base_rev != old_rev)
return svn_error_create(SVN_ERR_FS_TXN_OUT_OF_DATE, NULL,
_("Transaction out of date"));
/* We need the changes list for verification as well as for writing it
to the final rev file. */
SVN_ERR(svn_fs_fs__txn_changes_fetch(&changed_paths, cb->fs, txn_id,
pool));
/* Locks may have been added (or stolen) between the calling of
previous svn_fs.h functions and svn_fs_commit_txn(), so we need
to re-examine every changed-path in the txn and re-verify all
discovered locks. */
SVN_ERR(verify_locks(cb->fs, txn_id, changed_paths, pool));
/* We are going to be one better than this puny old revision. */
new_rev = old_rev + 1;
/* Get a write handle on the proto revision file. */
SVN_ERR(get_writable_proto_rev(&proto_file, &proto_file_lockcookie,
cb->fs, txn_id, pool));
SVN_ERR(svn_fs_fs__get_file_offset(&initial_offset, proto_file, pool));
/* Write out all the node-revisions and directory contents. */
root_id = svn_fs_fs__id_txn_create_root(txn_id, pool);
SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
start_node_id, start_copy_id, initial_offset,
cb->reps_to_cache, cb->reps_hash, cb->reps_pool,
TRUE, pool));
/* Write the changed-path information. */
SVN_ERR(write_final_changed_path_info(&changed_path_offset, proto_file,
cb->fs, txn_id, changed_paths,
pool));
if (svn_fs_fs__use_log_addressing(cb->fs))
{
/* Append the index data to the rev file. */
SVN_ERR(svn_fs_fs__add_index_data(cb->fs, proto_file,
svn_fs_fs__path_l2p_proto_index(cb->fs, txn_id, pool),
svn_fs_fs__path_p2l_proto_index(cb->fs, txn_id, pool),
new_rev, pool));
}
else
{
/* Write the final line. */
svn_stringbuf_t *trailer
= svn_fs_fs__unparse_revision_trailer
((apr_off_t)svn_fs_fs__id_item(new_root_id),
changed_path_offset,
pool);
SVN_ERR(svn_io_file_write_full(proto_file, trailer->data, trailer->len,
NULL, pool));
}
SVN_ERR(svn_io_file_flush_to_disk(proto_file, pool));
SVN_ERR(svn_io_file_close(proto_file, pool));
/* We don't unlock the prototype revision file immediately to avoid a
race with another caller writing to the prototype revision file
before we commit it. */
/* Create the shard for the rev and revprop file, if we're sharding and
this is the first revision of a new shard. We don't care if this
fails because the shard already existed for some reason. */
if (ffd->max_files_per_dir && new_rev % ffd->max_files_per_dir == 0)
{
/* Create the revs shard. */
{
const char *new_dir
= svn_fs_fs__path_rev_shard(cb->fs, new_rev, pool);
svn_error_t *err
= svn_io_dir_make(new_dir, APR_OS_DEFAULT, pool);
if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
return svn_error_trace(err);
svn_error_clear(err);
SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
PATH_REVS_DIR,
pool),
new_dir, pool));
}
/* Create the revprops shard. */
SVN_ERR_ASSERT(! svn_fs_fs__is_packed_revprop(cb->fs, new_rev));
{
const char *new_dir
= svn_fs_fs__path_revprops_shard(cb->fs, new_rev, pool);
svn_error_t *err
= svn_io_dir_make(new_dir, APR_OS_DEFAULT, pool);
if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
return svn_error_trace(err);
svn_error_clear(err);
SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
PATH_REVPROPS_DIR,
pool),
new_dir, pool));
}
}
/* Move the finished rev file into place.
### This "breaks" the transaction by removing the protorev file
### but the revision is not yet complete. If this commit does
### not complete for any reason the transaction will be lost. */
old_rev_filename = svn_fs_fs__path_rev_absolute(cb->fs, old_rev, pool);
rev_filename = svn_fs_fs__path_rev(cb->fs, new_rev, pool);
proto_filename = svn_fs_fs__path_txn_proto_rev(cb->fs, txn_id, pool);
SVN_ERR(svn_fs_fs__move_into_place(proto_filename, rev_filename,
old_rev_filename, pool));
/* Now that we've moved the prototype revision file out of the way,
we can unlock it (since further attempts to write to the file
will fail as it no longer exists). We must do this so that we can
remove the transaction directory later. */
SVN_ERR(unlock_proto_rev(cb->fs, txn_id, proto_file_lockcookie, pool));
/* Move the revprops file into place. */
SVN_ERR_ASSERT(! svn_fs_fs__is_packed_revprop(cb->fs, new_rev));
SVN_ERR(write_final_revprop(&revprop_filename, cb->txn, txn_id, pool));
final_revprop = svn_fs_fs__path_revprops(cb->fs, new_rev, pool);
SVN_ERR(svn_fs_fs__move_into_place(revprop_filename, final_revprop,
old_rev_filename, pool));
/* Update the 'current' file. */
SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev, pool));
SVN_ERR(write_final_current(cb->fs, txn_id, new_rev, start_node_id,
start_copy_id, pool));
/* At this point the new revision is committed and globally visible
so let the caller know it succeeded by giving it the new revision
number, which fulfills svn_fs_commit_txn() contract. Any errors
after this point do not change the fact that a new revision was
created. */
*cb->new_rev_p = new_rev;
ffd->youngest_rev_cache = new_rev;
/* Remove this transaction directory. */
SVN_ERR(svn_fs_fs__purge_txn(cb->fs, cb->txn->id, pool));
return SVN_NO_ERROR;
}
/* Add the representations in REPS_TO_CACHE (an array of representation_t *)
* to the rep-cache database of FS. */
static svn_error_t *
write_reps_to_cache(svn_fs_t *fs,
const apr_array_header_t *reps_to_cache,
apr_pool_t *scratch_pool)
{
int i;
for (i = 0; i < reps_to_cache->nelts; i++)
{
representation_t *rep = APR_ARRAY_IDX(reps_to_cache, i, representation_t *);
SVN_ERR(svn_fs_fs__set_rep_reference(fs, rep, scratch_pool));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__commit(svn_revnum_t *new_rev_p,
svn_fs_t *fs,
svn_fs_txn_t *txn,
apr_pool_t *pool)
{
struct commit_baton cb;
fs_fs_data_t *ffd = fs->fsap_data;
cb.new_rev_p = new_rev_p;
cb.fs = fs;
cb.txn = txn;
if (ffd->rep_sharing_allowed)
{
cb.reps_to_cache = apr_array_make(pool, 5, sizeof(representation_t *));
cb.reps_hash = apr_hash_make(pool);
cb.reps_pool = pool;
}
else
{
cb.reps_to_cache = NULL;
cb.reps_hash = NULL;
cb.reps_pool = NULL;
}
SVN_ERR(svn_fs_fs__with_write_lock(fs, commit_body, &cb, pool));
/* At this point, *NEW_REV_P has been set, so errors below won't affect
the success of the commit. (See svn_fs_commit_txn().) */
if (ffd->rep_sharing_allowed)
{
+ svn_error_t *err;
+
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* Write new entries to the rep-sharing database.
*
* We use an sqlite transaction to speed things up;
* see <http://www.sqlite.org/faq.html#q19>.
*/
/* ### A commit that touches thousands of files will starve other
(reader/writer) commits for the duration of the below call.
Maybe write in batches? */
- SVN_SQLITE__WITH_TXN(
- write_reps_to_cache(fs, cb.reps_to_cache, pool),
- ffd->rep_cache_db);
+ SVN_ERR(svn_sqlite__begin_transaction(ffd->rep_cache_db));
+ err = write_reps_to_cache(fs, cb.reps_to_cache, pool);
+ err = svn_sqlite__finish_transaction(ffd->rep_cache_db, err);
+
+ if (svn_error_find_cause(err, SVN_SQLITE__ERR_ROLLBACK_FAILED))
+ {
+ /* Failed rollback means that our db connection is unusable, and
+ the only thing we can do is close it. The connection will be
+ reopened during the next operation with rep-cache.db. */
+ return svn_error_trace(
+ svn_error_compose_create(err,
+ svn_fs_fs__close_rep_cache(fs)));
+ }
+ else if (err)
+ return svn_error_trace(err);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__list_transactions(apr_array_header_t **names_p,
svn_fs_t *fs,
apr_pool_t *pool)
{
const char *txn_dir;
apr_hash_t *dirents;
apr_hash_index_t *hi;
apr_array_header_t *names;
apr_size_t ext_len = strlen(PATH_EXT_TXN);
names = apr_array_make(pool, 1, sizeof(const char *));
/* Get the transactions directory. */
txn_dir = svn_fs_fs__path_txns_dir(fs, pool);
/* Now find a listing of this directory. */
SVN_ERR(svn_io_get_dirents3(&dirents, txn_dir, TRUE, pool, pool));
/* Loop through all the entries and return anything that ends with '.txn'. */
for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
{
const char *name = apr_hash_this_key(hi);
apr_ssize_t klen = apr_hash_this_key_len(hi);
const char *id;
/* The name must end with ".txn" to be considered a transaction. */
if ((apr_size_t) klen <= ext_len
|| (strcmp(name + klen - ext_len, PATH_EXT_TXN)) != 0)
continue;
/* Truncate the ".txn" extension and store the ID. */
id = apr_pstrndup(pool, name, strlen(name) - ext_len);
APR_ARRAY_PUSH(names, const char *) = id;
}
*names_p = names;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__open_txn(svn_fs_txn_t **txn_p,
svn_fs_t *fs,
const char *name,
apr_pool_t *pool)
{
svn_fs_txn_t *txn;
fs_txn_data_t *ftd;
svn_node_kind_t kind;
transaction_t *local_txn;
svn_fs_fs__id_part_t txn_id;
SVN_ERR(svn_fs_fs__id_txn_parse(&txn_id, name));
/* First check to see if the directory exists. */
SVN_ERR(svn_io_check_path(svn_fs_fs__path_txn_dir(fs, &txn_id, pool),
&kind, pool));
/* Did we find it? */
if (kind != svn_node_dir)
return svn_error_createf(SVN_ERR_FS_NO_SUCH_TRANSACTION, NULL,
_("No such transaction '%s'"),
name);
txn = apr_pcalloc(pool, sizeof(*txn));
ftd = apr_pcalloc(pool, sizeof(*ftd));
ftd->txn_id = txn_id;
/* Read in the root node of this transaction. */
txn->id = apr_pstrdup(pool, name);
txn->fs = fs;
SVN_ERR(svn_fs_fs__get_txn(&local_txn, fs, &txn_id, pool));
txn->base_rev = svn_fs_fs__id_rev(local_txn->base_id);
txn->vtable = &txn_vtable;
txn->fsap_data = ftd;
*txn_p = txn;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__txn_proplist(apr_hash_t **table_p,
svn_fs_txn_t *txn,
apr_pool_t *pool)
{
apr_hash_t *proplist = apr_hash_make(pool);
SVN_ERR(get_txn_proplist(proplist, txn->fs, svn_fs_fs__txn_get_id(txn),
pool));
*table_p = proplist;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__delete_node_revision(svn_fs_t *fs,
const svn_fs_id_t *id,
apr_pool_t *pool)
{
node_revision_t *noderev;
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, pool, pool));
/* Delete any mutable property representation. */
if (noderev->prop_rep && is_txn_rep(noderev->prop_rep))
SVN_ERR(svn_io_remove_file2(svn_fs_fs__path_txn_node_props(fs, id, pool),
FALSE, pool));
/* Delete any mutable data representation. */
if (noderev->data_rep && is_txn_rep(noderev->data_rep)
&& noderev->kind == svn_node_dir)
{
fs_fs_data_t *ffd = fs->fsap_data;
SVN_ERR(svn_io_remove_file2(svn_fs_fs__path_txn_node_children(fs, id,
pool),
FALSE, pool));
/* remove the corresponding entry from the cache, if such exists */
if (ffd->txn_dir_cache)
{
const char *key = svn_fs_fs__id_unparse(id, pool)->data;
SVN_ERR(svn_cache__set(ffd->txn_dir_cache, key, NULL, pool));
}
}
return svn_io_remove_file2(svn_fs_fs__path_txn_node_rev(fs, id, pool),
FALSE, pool);
}
/*** Transactions ***/
svn_error_t *
svn_fs_fs__get_txn_ids(const svn_fs_id_t **root_id_p,
const svn_fs_id_t **base_root_id_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
transaction_t *txn;
SVN_ERR(svn_fs_fs__get_txn(&txn, fs, txn_id, pool));
*root_id_p = txn->root_id;
*base_root_id_p = txn->base_id;
return SVN_NO_ERROR;
}
/* Generic transaction operations. */
svn_error_t *
svn_fs_fs__txn_prop(svn_string_t **value_p,
svn_fs_txn_t *txn,
const char *propname,
apr_pool_t *pool)
{
apr_hash_t *table;
svn_fs_t *fs = txn->fs;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
SVN_ERR(svn_fs_fs__txn_proplist(&table, txn, pool));
*value_p = svn_hash_gets(table, propname);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__begin_txn(svn_fs_txn_t **txn_p,
svn_fs_t *fs,
svn_revnum_t rev,
apr_uint32_t flags,
apr_pool_t *pool)
{
svn_string_t date;
fs_txn_data_t *ftd;
apr_hash_t *props = apr_hash_make(pool);
SVN_ERR(svn_fs__check_fs(fs, TRUE));
SVN_ERR(svn_fs_fs__create_txn(txn_p, fs, rev, pool));
/* Put a datestamp on the newly created txn, so we always know
exactly how old it is. (This will help sysadmins identify
long-abandoned txns that may need to be manually removed.) When
a txn is promoted to a revision, this property will be
automatically overwritten with a revision datestamp. */
date.data = svn_time_to_cstring(apr_time_now(), pool);
date.len = strlen(date.data);
svn_hash_sets(props, SVN_PROP_REVISION_DATE, &date);
/* Set temporary txn props that represent the requested 'flags'
behaviors. */
if (flags & SVN_FS_TXN_CHECK_OOD)
svn_hash_sets(props, SVN_FS__PROP_TXN_CHECK_OOD,
svn_string_create("true", pool));
if (flags & SVN_FS_TXN_CHECK_LOCKS)
svn_hash_sets(props, SVN_FS__PROP_TXN_CHECK_LOCKS,
svn_string_create("true", pool));
if (flags & SVN_FS_TXN_CLIENT_DATE)
svn_hash_sets(props, SVN_FS__PROP_TXN_CLIENT_DATE,
svn_string_create("0", pool));
ftd = (*txn_p)->fsap_data;
return svn_error_trace(set_txn_proplist(fs, &ftd->txn_id, props, FALSE,
pool));
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_fs/tree.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_fs/tree.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/tree.c (revision 309511)
@@ -1,4571 +1,4571 @@
/* tree.c : tree-like filesystem, built on DAG filesystem
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* The job of this layer is to take a filesystem with lots of node
sharing going on --- the real DAG filesystem as it appears in the
database --- and make it look and act like an ordinary tree
filesystem, with no sharing.
We do just-in-time cloning: you can walk from some unfinished
transaction's root down into directories and files shared with
committed revisions; as soon as you try to change something, the
appropriate nodes get cloned (and parent directory entries updated)
invisibly, behind your back. Any other references you have to
nodes that have been cloned by other changes, even made by other
processes, are automatically updated to point to the right clones. */
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <apr_pools.h>
#include <apr_hash.h>
#include "svn_hash.h"
#include "svn_private_config.h"
#include "svn_pools.h"
#include "svn_error.h"
#include "svn_path.h"
#include "svn_mergeinfo.h"
#include "svn_fs.h"
#include "svn_props.h"
#include "svn_sorts.h"
#include "fs.h"
#include "cached_data.h"
#include "dag.h"
#include "lock.h"
#include "tree.h"
#include "fs_fs.h"
#include "id.h"
#include "pack.h"
#include "temp_serializer.h"
#include "transaction.h"
#include "util.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_fs_util.h"
#include "private/svn_fspath.h"
#include "../libsvn_fs/fs-loader.h"
/* The root structures.
Why do they contain different data? Well, transactions are mutable
enough that it isn't safe to cache the DAG node for the root
directory or the hash of copyfrom data: somebody else might modify
them concurrently on disk! (Why is the DAG node cache safer than
the root DAG node? When cloning transaction DAG nodes in and out
of the cache, all of the possibly-mutable data from the
node_revision_t inside the dag_node_t is dropped.) Additionally,
revisions are immutable enough that their DAG node cache can be
kept in the FS object and shared among multiple revision root
objects.
*/
typedef dag_node_t fs_rev_root_data_t;
typedef struct fs_txn_root_data_t
{
/* TXN_ID value from the main struct but as a struct instead of a string */
svn_fs_fs__id_part_t txn_id;
/* Cache of txn DAG nodes (without their nested noderevs, because
* it's mutable). Same keys/values as ffd->rev_node_cache. */
svn_cache__t *txn_node_cache;
} fs_txn_root_data_t;
/* Declared here to resolve the circular dependencies. */
static svn_error_t * get_dag(dag_node_t **dag_node_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool);
static svn_fs_root_t *make_revision_root(svn_fs_t *fs, svn_revnum_t rev,
dag_node_t *root_dir,
apr_pool_t *pool);
static svn_error_t *make_txn_root(svn_fs_root_t **root_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn,
svn_revnum_t base_rev,
apr_uint32_t flags,
apr_pool_t *pool);
static svn_error_t *fs_closest_copy(svn_fs_root_t **root_p,
const char **path_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool);
/*** Node Caching ***/
/* 1st level cache */
/* An entry in the first-level cache. REVISION and PATH form the key that
will ultimately be matched.
*/
typedef struct cache_entry_t
{
/* hash value derived from PATH, REVISION.
Used to short-circuit failed lookups. */
apr_uint32_t hash_value;
/* revision to which the NODE belongs */
svn_revnum_t revision;
/* path of the NODE */
char *path;
/* cached value of strlen(PATH). */
apr_size_t path_len;
/* the node allocated in the cache's pool. NULL for empty entries. */
dag_node_t *node;
} cache_entry_t;
/* Number of entries in the cache. Keep this low to keep pressure on the
CPU caches low as well. A binary value is most efficient. If we walk
a directory tree, we want enough entries to store nodes for all files
without overwriting the nodes for the parent folder. That way, there
will be no unnecessary misses (except for a few random ones caused by
hash collision).
The actual number of instances may be higher but entries that got
overwritten are no longer visible.
*/
enum { BUCKET_COUNT = 256 };
/* The actual cache structure. All nodes will be allocated in POOL.
When the number of INSERTIONS (i.e. objects created form that pool)
exceeds a certain threshold, the pool will be cleared and the cache
with it.
*/
struct fs_fs_dag_cache_t
{
/* fixed number of (possibly empty) cache entries */
cache_entry_t buckets[BUCKET_COUNT];
/* pool used for all node allocation */
apr_pool_t *pool;
/* number of entries created from POOL since the last cleanup */
apr_size_t insertions;
/* Property lookups etc. have a very high locality (75% re-hit).
Thus, remember the last hit location for optimistic lookup. */
apr_size_t last_hit;
/* Position of the last bucket hit that actually had a DAG node in it.
LAST_HIT may refer to a bucket that matches path@rev but has not
its NODE element set, yet.
This value is a mere hint for optimistic lookup and any value is
valid (as long as it is < BUCKET_COUNT). */
apr_size_t last_non_empty;
};
fs_fs_dag_cache_t*
svn_fs_fs__create_dag_cache(apr_pool_t *pool)
{
fs_fs_dag_cache_t *result = apr_pcalloc(pool, sizeof(*result));
result->pool = svn_pool_create(pool);
return result;
}
/* Clears the CACHE at regular intervals (destroying all cached nodes)
*/
static void
auto_clear_dag_cache(fs_fs_dag_cache_t* cache)
{
if (cache->insertions > BUCKET_COUNT)
{
svn_pool_clear(cache->pool);
memset(cache->buckets, 0, sizeof(cache->buckets));
cache->insertions = 0;
}
}
/* For the given REVISION and PATH, return the respective entry in CACHE.
If the entry is empty, its NODE member will be NULL and the caller
may then set it to the corresponding DAG node allocated in CACHE->POOL.
*/
static cache_entry_t *
cache_lookup( fs_fs_dag_cache_t *cache
, svn_revnum_t revision
, const char *path)
{
apr_size_t i, bucket_index;
apr_size_t path_len = strlen(path);
apr_uint32_t hash_value = (apr_uint32_t)revision;
#if SVN_UNALIGNED_ACCESS_IS_OK
/* "randomizing" / distributing factor used in our hash function */
const apr_uint32_t factor = 0xd1f3da69;
#endif
/* optimistic lookup: hit the same bucket again? */
cache_entry_t *result = &cache->buckets[cache->last_hit];
if ( (result->revision == revision)
&& (result->path_len == path_len)
&& !memcmp(result->path, path, path_len))
{
/* Remember the position of the last node we found in this cache. */
if (result->node)
cache->last_non_empty = cache->last_hit;
return result;
}
/* need to do a full lookup. Calculate the hash value
(HASH_VALUE has been initialized to REVISION).
Note that the actual hash function is arbitrary as long as its result
in HASH_VALUE only depends on REVISION and *PATH. However, we try to
make as much of *PATH influence the result as possible to get an "even"
spread across the hash buckets (maximizes our cache retention rate and
thus the hit rates).
When chunked access is possible (independent of the PATH pointer's
value!), we read 4 bytes at once and multiply the hash value with a
FACTOR that mirror / pattern / shift all 4 input bytes to various bits
of the result. The final result will be taken from the MSBs.
When chunked access is not possible (not supported by CPU or odd bytes
at the end of *PATH), we use the simple traditional "* 33" hash
function that works very well with texts / paths and that e.g. APR uses.
Please note that the bytewise and the chunked calculation are *NOT*
interchangeable as they will yield different results for the same input.
For any given machine and *PATH, we must use a fixed combination of the
two functions.
*/
i = 0;
#if SVN_UNALIGNED_ACCESS_IS_OK
/* We relax the dependency chain between iterations by processing
two chunks from the input per hash_value self-multiplication.
The HASH_VALUE update latency is now 1 MUL latency + 1 ADD latency
per 2 chunks instead of 1 chunk.
*/
for (; i + 8 <= path_len; i += 8)
hash_value = hash_value * factor * factor
+ ( *(const apr_uint32_t*)(path + i) * factor
+ *(const apr_uint32_t*)(path + i + 4));
#endif
for (; i < path_len; ++i)
/* Help GCC to minimize the HASH_VALUE update latency by splitting the
MUL 33 of the naive implementation: h = h * 33 + path[i]. This
shortens the dependency chain from 1 shift + 2 ADDs to 1 shift + 1 ADD.
*/
hash_value = hash_value * 32 + (hash_value + (unsigned char)path[i]);
bucket_index = hash_value + (hash_value >> 16);
bucket_index = (bucket_index + (bucket_index >> 8)) % BUCKET_COUNT;
/* access the corresponding bucket and remember its location */
result = &cache->buckets[bucket_index];
cache->last_hit = bucket_index;
/* if it is *NOT* a match, clear the bucket, expect the caller to fill
in the node and count it as an insertion */
if ( (result->hash_value != hash_value)
|| (result->revision != revision)
|| (result->path_len != path_len)
|| memcmp(result->path, path, path_len))
{
result->hash_value = hash_value;
result->revision = revision;
if (result->path_len < path_len)
result->path = apr_palloc(cache->pool, path_len + 1);
result->path_len = path_len;
memcpy(result->path, path, path_len + 1);
result->node = NULL;
cache->insertions++;
}
else if (result->node)
{
/* This bucket is valid & has a suitable DAG node in it.
Remember its location. */
cache->last_non_empty = bucket_index;
}
return result;
}
/* Optimistic lookup using the last seen non-empty location in CACHE.
Return the node of that entry, if it is still in use and matches PATH.
Return NULL otherwise. Since the caller usually already knows the path
length, provide it in PATH_LEN. */
static dag_node_t *
cache_lookup_last_path(fs_fs_dag_cache_t *cache,
const char *path,
apr_size_t path_len)
{
cache_entry_t *result = &cache->buckets[cache->last_non_empty];
assert(strlen(path) == path_len);
if ( result->node
&& (result->path_len == path_len)
&& !memcmp(result->path, path, path_len))
{
return result->node;
}
return NULL;
}
/* 2nd level cache */
/* Find and return the DAG node cache for ROOT and the key that
should be used for PATH.
Pool will only be used for allocating a new keys if necessary */
static void
locate_cache(svn_cache__t **cache,
const char **key,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
if (root->is_txn_root)
{
fs_txn_root_data_t *frd = root->fsap_data;
if (cache)
*cache = frd->txn_node_cache;
if (key && path)
*key = path;
}
else
{
fs_fs_data_t *ffd = root->fs->fsap_data;
if (cache)
*cache = ffd->rev_node_cache;
if (key && path)
*key = svn_fs_fs__combine_number_and_string(root->rev, path, pool);
}
}
/* In *NODE_P, return the DAG node for PATH from ROOT's node cache, or NULL
if the node isn't cached. *NODE_P is allocated in POOL. */
static svn_error_t *
dag_node_cache_get(dag_node_t **node_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
svn_boolean_t found;
dag_node_t *node = NULL;
svn_cache__t *cache;
const char *key;
SVN_ERR_ASSERT(*path == '/');
if (!root->is_txn_root)
{
/* immutable DAG node. use the global caches for it */
fs_fs_data_t *ffd = root->fs->fsap_data;
cache_entry_t *bucket;
auto_clear_dag_cache(ffd->dag_node_cache);
bucket = cache_lookup(ffd->dag_node_cache, root->rev, path);
if (bucket->node == NULL)
{
locate_cache(&cache, &key, root, path, pool);
SVN_ERR(svn_cache__get((void **)&node, &found, cache, key, pool));
if (found && node)
{
/* Patch up the FS, since this might have come from an old FS
* object. */
svn_fs_fs__dag_set_fs(node, root->fs);
/* Retain the DAG node in L1 cache. */
bucket->node = svn_fs_fs__dag_dup(node,
ffd->dag_node_cache->pool);
}
}
else
{
/* Copy the node from L1 cache into the passed-in POOL. */
node = svn_fs_fs__dag_dup(bucket->node, pool);
}
}
else
{
/* DAG is mutable / may become invalid. Use the TXN-local cache */
locate_cache(&cache, &key, root, path, pool);
SVN_ERR(svn_cache__get((void **) &node, &found, cache, key, pool));
if (found && node)
{
/* Patch up the FS, since this might have come from an old FS
* object. */
svn_fs_fs__dag_set_fs(node, root->fs);
}
}
*node_p = node;
return SVN_NO_ERROR;
}
/* Add the NODE for PATH to ROOT's node cache. */
static svn_error_t *
dag_node_cache_set(svn_fs_root_t *root,
const char *path,
dag_node_t *node,
apr_pool_t *pool)
{
svn_cache__t *cache;
const char *key;
SVN_ERR_ASSERT(*path == '/');
locate_cache(&cache, &key, root, path, pool);
return svn_cache__set(cache, key, node, pool);
}
/* Baton for find_descendants_in_cache. */
struct fdic_baton {
const char *path;
apr_array_header_t *list;
apr_pool_t *pool;
};
/* If the given item is a descendant of BATON->PATH, push
* it onto BATON->LIST (copying into BATON->POOL). Implements
* the svn_iter_apr_hash_cb_t prototype. */
static svn_error_t *
find_descendants_in_cache(void *baton,
const void *key,
apr_ssize_t klen,
void *val,
apr_pool_t *pool)
{
struct fdic_baton *b = baton;
const char *item_path = key;
if (svn_fspath__skip_ancestor(b->path, item_path))
APR_ARRAY_PUSH(b->list, const char *) = apr_pstrdup(b->pool, item_path);
return SVN_NO_ERROR;
}
/* Invalidate cache entries for PATH and any of its children. This
should *only* be called on a transaction root! */
static svn_error_t *
dag_node_cache_invalidate(svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
struct fdic_baton b;
svn_cache__t *cache;
apr_pool_t *iterpool;
int i;
b.path = path;
b.pool = svn_pool_create(pool);
b.list = apr_array_make(b.pool, 1, sizeof(const char *));
SVN_ERR_ASSERT(root->is_txn_root);
locate_cache(&cache, NULL, root, NULL, b.pool);
SVN_ERR(svn_cache__iter(NULL, cache, find_descendants_in_cache,
&b, b.pool));
iterpool = svn_pool_create(b.pool);
for (i = 0; i < b.list->nelts; i++)
{
const char *descendant = APR_ARRAY_IDX(b.list, i, const char *);
svn_pool_clear(iterpool);
SVN_ERR(svn_cache__set(cache, descendant, NULL, iterpool));
}
svn_pool_destroy(iterpool);
svn_pool_destroy(b.pool);
return SVN_NO_ERROR;
}
/* Creating transaction and revision root nodes. */
svn_error_t *
svn_fs_fs__txn_root(svn_fs_root_t **root_p,
svn_fs_txn_t *txn,
apr_pool_t *pool)
{
apr_uint32_t flags = 0;
apr_hash_t *txnprops;
/* Look for the temporary txn props representing 'flags'. */
SVN_ERR(svn_fs_fs__txn_proplist(&txnprops, txn, pool));
if (txnprops)
{
if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
flags |= SVN_FS_TXN_CHECK_OOD;
if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
flags |= SVN_FS_TXN_CHECK_LOCKS;
}
return make_txn_root(root_p, txn->fs, svn_fs_fs__txn_get_id(txn),
txn->base_rev, flags, pool);
}
svn_error_t *
svn_fs_fs__revision_root(svn_fs_root_t **root_p,
svn_fs_t *fs,
svn_revnum_t rev,
apr_pool_t *pool)
{
dag_node_t *root_dir;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
SVN_ERR(svn_fs_fs__dag_revision_root(&root_dir, fs, rev, pool));
*root_p = make_revision_root(fs, rev, root_dir, pool);
return SVN_NO_ERROR;
}
/* Getting dag nodes for roots. */
/* Return the transaction ID to a given transaction ROOT. */
static const svn_fs_fs__id_part_t *
root_txn_id(svn_fs_root_t *root)
{
fs_txn_root_data_t *frd = root->fsap_data;
assert(root->is_txn_root);
return &frd->txn_id;
}
/* Set *NODE_P to a freshly opened dag node referring to the root
directory of ROOT, allocating from POOL. */
static svn_error_t *
root_node(dag_node_t **node_p,
svn_fs_root_t *root,
apr_pool_t *pool)
{
if (root->is_txn_root)
{
/* It's a transaction root. Open a fresh copy. */
return svn_fs_fs__dag_txn_root(node_p, root->fs, root_txn_id(root),
pool);
}
else
{
/* It's a revision root, so we already have its root directory
opened. */
dag_node_t *root_dir = root->fsap_data;
*node_p = svn_fs_fs__dag_dup(root_dir, pool);
return SVN_NO_ERROR;
}
}
/* Set *NODE_P to a mutable root directory for ROOT, cloning if
necessary, allocating in POOL. ROOT must be a transaction root.
Use ERROR_PATH in error messages. */
static svn_error_t *
mutable_root_node(dag_node_t **node_p,
svn_fs_root_t *root,
const char *error_path,
apr_pool_t *pool)
{
if (root->is_txn_root)
{
/* It's a transaction root. Open a fresh copy. */
return svn_fs_fs__dag_clone_root(node_p, root->fs, root_txn_id(root),
pool);
}
else
/* If it's not a transaction root, we can't change its contents. */
return SVN_FS__ERR_NOT_MUTABLE(root->fs, root->rev, error_path);
}
/* Traversing directory paths. */
typedef enum copy_id_inherit_t
{
copy_id_inherit_unknown = 0,
copy_id_inherit_self,
copy_id_inherit_parent,
copy_id_inherit_new
} copy_id_inherit_t;
/* A linked list representing the path from a node up to a root
directory. We use this for cloning, and for operations that need
to deal with both a node and its parent directory. For example, a
`delete' operation needs to know that the node actually exists, but
also needs to change the parent directory. */
typedef struct parent_path_t
{
/* A node along the path. This could be the final node, one of its
parents, or the root. Every parent path ends with an element for
the root directory. */
dag_node_t *node;
/* The name NODE has in its parent directory. This is zero for the
root directory, which (obviously) has no name in its parent. */
char *entry;
/* The parent of NODE, or zero if NODE is the root directory. */
struct parent_path_t *parent;
/* The copy ID inheritance style. */
copy_id_inherit_t copy_inherit;
/* If copy ID inheritance style is copy_id_inherit_new, this is the
path which should be implicitly copied; otherwise, this is NULL. */
const char *copy_src_path;
} parent_path_t;
/* Return a text string describing the absolute path of parent_path
PARENT_PATH. It will be allocated in POOL. */
static const char *
parent_path_path(parent_path_t *parent_path,
apr_pool_t *pool)
{
const char *path_so_far = "/";
if (parent_path->parent)
path_so_far = parent_path_path(parent_path->parent, pool);
return parent_path->entry
? svn_fspath__join(path_so_far, parent_path->entry, pool)
: path_so_far;
}
/* Return the FS path for the parent path chain object CHILD relative
to its ANCESTOR in the same chain, allocated in POOL. */
static const char *
parent_path_relpath(parent_path_t *child,
parent_path_t *ancestor,
apr_pool_t *pool)
{
const char *path_so_far = "";
parent_path_t *this_node = child;
while (this_node != ancestor)
{
assert(this_node != NULL);
path_so_far = svn_relpath_join(this_node->entry, path_so_far, pool);
this_node = this_node->parent;
}
return path_so_far;
}
/* Choose a copy ID inheritance method *INHERIT_P to be used in the
event that immutable node CHILD in FS needs to be made mutable. If
the inheritance method is copy_id_inherit_new, also return a
*COPY_SRC_PATH on which to base the new copy ID (else return NULL
for that path). CHILD must have a parent (it cannot be the root
node). Allocations are taken from POOL. */
static svn_error_t *
get_copy_inheritance(copy_id_inherit_t *inherit_p,
const char **copy_src_path,
svn_fs_t *fs,
parent_path_t *child,
apr_pool_t *pool)
{
const svn_fs_id_t *child_id, *parent_id, *copyroot_id;
const svn_fs_fs__id_part_t *child_copy_id, *parent_copy_id;
const char *id_path = NULL;
svn_fs_root_t *copyroot_root;
dag_node_t *copyroot_node;
svn_revnum_t copyroot_rev;
const char *copyroot_path;
SVN_ERR_ASSERT(child && child->parent);
/* Initialize some convenience variables. */
child_id = svn_fs_fs__dag_get_id(child->node);
parent_id = svn_fs_fs__dag_get_id(child->parent->node);
child_copy_id = svn_fs_fs__id_copy_id(child_id);
parent_copy_id = svn_fs_fs__id_copy_id(parent_id);
/* If this child is already mutable, we have nothing to do. */
if (svn_fs_fs__id_is_txn(child_id))
{
*inherit_p = copy_id_inherit_self;
*copy_src_path = NULL;
return SVN_NO_ERROR;
}
/* From this point on, we'll assume that the child will just take
its copy ID from its parent. */
*inherit_p = copy_id_inherit_parent;
*copy_src_path = NULL;
/* Special case: if the child's copy ID is '0', use the parent's
copy ID. */
if (svn_fs_fs__id_part_is_root(child_copy_id))
return SVN_NO_ERROR;
/* Compare the copy IDs of the child and its parent. If they are
the same, then the child is already on the same branch as the
parent, and should use the same mutability copy ID that the
parent will use. */
if (svn_fs_fs__id_part_eq(child_copy_id, parent_copy_id))
return SVN_NO_ERROR;
/* If the child is on the same branch that the parent is on, the
child should just use the same copy ID that the parent would use.
Else, the child needs to generate a new copy ID to use should it
need to be made mutable. We will claim that child is on the same
branch as its parent if the child itself is not a branch point,
or if it is a branch point that we are accessing via its original
copy destination path. */
SVN_ERR(svn_fs_fs__dag_get_copyroot(&copyroot_rev, &copyroot_path,
child->node));
SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, fs, copyroot_rev, pool));
SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, pool));
copyroot_id = svn_fs_fs__dag_get_id(copyroot_node);
if (svn_fs_fs__id_compare(copyroot_id, child_id) == svn_fs_node_unrelated)
return SVN_NO_ERROR;
/* Determine if we are looking at the child via its original path or
as a subtree item of a copied tree. */
id_path = svn_fs_fs__dag_get_created_path(child->node);
if (strcmp(id_path, parent_path_path(child, pool)) == 0)
{
*inherit_p = copy_id_inherit_self;
return SVN_NO_ERROR;
}
/* We are pretty sure that the child node is an unedited nested
branched node. When it needs to be made mutable, it should claim
a new copy ID. */
*inherit_p = copy_id_inherit_new;
*copy_src_path = id_path;
return SVN_NO_ERROR;
}
/* Allocate a new parent_path_t node from POOL, referring to NODE,
ENTRY, PARENT, and COPY_ID. */
static parent_path_t *
make_parent_path(dag_node_t *node,
char *entry,
parent_path_t *parent,
apr_pool_t *pool)
{
parent_path_t *parent_path = apr_pcalloc(pool, sizeof(*parent_path));
parent_path->node = node;
parent_path->entry = entry;
parent_path->parent = parent;
parent_path->copy_inherit = copy_id_inherit_unknown;
parent_path->copy_src_path = NULL;
return parent_path;
}
/* Flags for open_path. */
typedef enum open_path_flags_t {
/* The last component of the PATH need not exist. (All parent
directories must exist, as usual.) If the last component doesn't
exist, simply leave the `node' member of the bottom parent_path
component zero. */
open_path_last_optional = 1,
/* When this flag is set, don't bother to lookup the DAG node in
our caches because we already tried this. Ignoring this flag
has no functional impact. */
open_path_uncached = 2,
/* The caller does not care about the parent node chain but only
the final DAG node. */
open_path_node_only = 4,
/* The caller wants a NULL path object instead of an error if the
path cannot be found. */
open_path_allow_null = 8
} open_path_flags_t;
/* Try a short-cut for the open_path() function using the last node accessed.
* If that ROOT is that nodes's "created rev" and PATH of PATH_LEN chars is
* its "created path", return the node in *NODE_P. Set it to NULL otherwise.
*
* This function is used to support ra_serf-style access patterns where we
* are first asked for path@rev and then for path@c_rev of the same node.
* The shortcut works by ignoring the "rev" part of the cache key and then
* checking whether we got lucky. Lookup and verification are both quick
* plus there are many early outs for common types of mismatch.
*/
static svn_error_t *
try_match_last_node(dag_node_t **node_p,
svn_fs_root_t *root,
const char *path,
apr_size_t path_len,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = root->fs->fsap_data;
/* Optimistic lookup: if the last node returned from the cache applied to
the same PATH, return it in NODE. */
dag_node_t *node
= cache_lookup_last_path(ffd->dag_node_cache, path, path_len);
/* Did we get a bucket with a committed node? */
if (node && !svn_fs_fs__dag_check_mutable(node))
{
/* Get the path&rev pair at which this node was created.
This is repository location for which this node is _known_ to be
the right lookup result irrespective of how we found it. */
const char *created_path
= svn_fs_fs__dag_get_created_path(node);
svn_revnum_t revision;
SVN_ERR(svn_fs_fs__dag_get_revision(&revision, node, scratch_pool));
/* Is it an exact match? */
if (revision == root->rev && strcmp(created_path, path) == 0)
{
/* Cache it under its full path@rev access path. */
SVN_ERR(dag_node_cache_set(root, path, node, scratch_pool));
*node_p = node;
return SVN_NO_ERROR;
}
}
*node_p = NULL;
return SVN_NO_ERROR;
}
/* Open the node identified by PATH in ROOT, allocating in POOL. Set
*PARENT_PATH_P to a path from the node up to ROOT. The resulting
**PARENT_PATH_P value is guaranteed to contain at least one
*element, for the root directory. PATH must be in canonical form.
If resulting *PARENT_PATH_P will eventually be made mutable and
modified, or if copy ID inheritance information is otherwise needed,
IS_TXN_PATH must be set. If IS_TXN_PATH is FALSE, no copy ID
inheritance information will be calculated for the *PARENT_PATH_P chain.
If FLAGS & open_path_last_optional is zero, return the error
SVN_ERR_FS_NOT_FOUND if the node PATH refers to does not exist. If
non-zero, require all the parent directories to exist as normal,
but if the final path component doesn't exist, simply return a path
whose bottom `node' member is zero. This option is useful for
callers that create new nodes --- we find the parent directory for
them, and tell them whether the entry exists already.
The remaining bits in FLAGS are hints that allow this function
to take shortcuts based on knowledge that the caller provides,
such as the caller is not actually being interested in PARENT_PATH_P,
but only in (*PARENT_PATH_P)->NODE.
NOTE: Public interfaces which only *read* from the filesystem
should not call this function directly, but should instead use
get_dag().
*/
static svn_error_t *
open_path(parent_path_t **parent_path_p,
svn_fs_root_t *root,
const char *path,
int flags,
svn_boolean_t is_txn_path,
apr_pool_t *pool)
{
svn_fs_t *fs = root->fs;
dag_node_t *here = NULL; /* The directory we're currently looking at. */
parent_path_t *parent_path; /* The path from HERE up to the root. */
const char *rest = NULL; /* The portion of PATH we haven't traversed yet. */
apr_pool_t *iterpool = svn_pool_create(pool);
/* path to the currently processed entry without trailing '/'.
We will reuse this across iterations by simply putting a NUL terminator
at the respective position and replacing that with a '/' in the next
iteration. This is correct as we assert() PATH to be canonical. */
svn_stringbuf_t *path_so_far = svn_stringbuf_create(path, pool);
apr_size_t path_len = path_so_far->len;
/* Callers often traverse the DAG in some path-based order or along the
history segments. That allows us to try a few guesses about where to
find the next item. This is only useful if the caller didn't request
the full parent chain. */
assert(svn_fs__is_canonical_abspath(path));
path_so_far->len = 0; /* "" */
if (flags & open_path_node_only)
{
const char *directory;
/* First attempt: Assume that we access the DAG for the same path as
in the last lookup but for a different revision that happens to be
the last revision that touched the respective node. This is a
common pattern when e.g. checking out over ra_serf. Note that this
will only work for committed data as the revision info for nodes in
txns is bogus.
This shortcut is quick and will exit this function upon success.
So, try it first. */
if (!root->is_txn_root)
{
dag_node_t *node;
SVN_ERR(try_match_last_node(&node, root, path, path_len, iterpool));
/* Did the shortcut work? */
if (node)
{
/* Construct and return the result. */
svn_pool_destroy(iterpool);
parent_path = make_parent_path(node, 0, 0, pool);
parent_path->copy_inherit = copy_id_inherit_self;
*parent_path_p = parent_path;
return SVN_NO_ERROR;
}
}
/* Second attempt: Try starting the lookup immediately at the parent
node. We will often have recently accessed either a sibling or
said parent DIRECTORY itself for the same revision. */
directory = svn_dirent_dirname(path, pool);
if (directory[1] != 0) /* root nodes are covered anyway */
{
SVN_ERR(dag_node_cache_get(&here, root, directory, pool));
/* Did the shortcut work? */
if (here)
{
apr_size_t dirname_len = strlen(directory);
path_so_far->len = dirname_len;
rest = path + dirname_len + 1;
}
}
}
/* did the shortcut work? */
if (!here)
{
/* Make a parent_path item for the root node, using its own current
copy id. */
SVN_ERR(root_node(&here, root, pool));
rest = path + 1; /* skip the leading '/', it saves in iteration */
}
path_so_far->data[path_so_far->len] = '\0';
parent_path = make_parent_path(here, 0, 0, pool);
parent_path->copy_inherit = copy_id_inherit_self;
/* Whenever we are at the top of this loop:
- HERE is our current directory,
- ID is the node revision ID of HERE,
- REST is the path we're going to find in HERE, and
- PARENT_PATH includes HERE and all its parents. */
for (;;)
{
const char *next;
char *entry;
dag_node_t *child;
svn_pool_clear(iterpool);
/* Parse out the next entry from the path. */
entry = svn_fs__next_entry_name(&next, rest, pool);
/* Update the path traversed thus far. */
path_so_far->data[path_so_far->len] = '/';
path_so_far->len += strlen(entry) + 1;
path_so_far->data[path_so_far->len] = '\0';
if (*entry == '\0')
{
/* Given the behavior of svn_fs__next_entry_name(), this
happens when the path either starts or ends with a slash.
In either case, we stay put: the current directory stays
the same, and we add nothing to the parent path. */
child = here;
}
else
{
copy_id_inherit_t inherit;
const char *copy_path = NULL;
dag_node_t *cached_node = NULL;
/* If we found a directory entry, follow it. First, we
check our node cache, and, failing that, we hit the DAG
layer. Don't bother to contact the cache for the last
element if we already know the lookup to fail for the
complete path. */
if (next || !(flags & open_path_uncached))
SVN_ERR(dag_node_cache_get(&cached_node, root, path_so_far->data,
pool));
if (cached_node)
child = cached_node;
else
SVN_ERR(svn_fs_fs__dag_open(&child, here, entry, pool, iterpool));
/* "file not found" requires special handling. */
if (child == NULL)
{
/* If this was the last path component, and the caller
said it was optional, then don't return an error;
just put a NULL node pointer in the path. */
if ((flags & open_path_last_optional)
&& (! next || *next == '\0'))
{
parent_path = make_parent_path(NULL, entry, parent_path,
pool);
break;
}
else if (flags & open_path_allow_null)
{
parent_path = NULL;
break;
}
else
{
/* Build a better error message than svn_fs_fs__dag_open
can provide, giving the root and full path name. */
return SVN_FS__NOT_FOUND(root, path);
}
}
if (flags & open_path_node_only)
{
/* Shortcut: the caller only wants the final DAG node. */
parent_path->node = child;
}
else
{
/* Now, make a parent_path item for CHILD. */
parent_path = make_parent_path(child, entry, parent_path, pool);
if (is_txn_path)
{
SVN_ERR(get_copy_inheritance(&inherit, &copy_path, fs,
parent_path, iterpool));
parent_path->copy_inherit = inherit;
parent_path->copy_src_path = apr_pstrdup(pool, copy_path);
}
}
/* Cache the node we found (if it wasn't already cached). */
if (! cached_node)
SVN_ERR(dag_node_cache_set(root, path_so_far->data, child,
iterpool));
}
/* Are we finished traversing the path? */
if (! next)
break;
/* The path isn't finished yet; we'd better be in a directory. */
if (svn_fs_fs__dag_node_kind(child) != svn_node_dir)
SVN_ERR_W(SVN_FS__ERR_NOT_DIRECTORY(fs, path_so_far->data),
apr_psprintf(iterpool, _("Failure opening '%s'"), path));
rest = next;
here = child;
}
svn_pool_destroy(iterpool);
*parent_path_p = parent_path;
return SVN_NO_ERROR;
}
/* Make the node referred to by PARENT_PATH mutable, if it isn't
already, allocating from POOL. ROOT must be the root from which
PARENT_PATH descends. Clone any parent directories as needed.
Adjust the dag nodes in PARENT_PATH to refer to the clones. Use
ERROR_PATH in error messages. */
static svn_error_t *
make_path_mutable(svn_fs_root_t *root,
parent_path_t *parent_path,
const char *error_path,
apr_pool_t *pool)
{
dag_node_t *clone;
const svn_fs_fs__id_part_t *txn_id = root_txn_id(root);
/* Is the node mutable already? */
if (svn_fs_fs__dag_check_mutable(parent_path->node))
return SVN_NO_ERROR;
/* Are we trying to clone the root, or somebody's child node? */
if (parent_path->parent)
{
const svn_fs_id_t *parent_id, *child_id, *copyroot_id;
svn_fs_fs__id_part_t copy_id = { SVN_INVALID_REVNUM, 0 };
svn_fs_fs__id_part_t *copy_id_ptr = &copy_id;
copy_id_inherit_t inherit = parent_path->copy_inherit;
const char *clone_path, *copyroot_path;
svn_revnum_t copyroot_rev;
svn_boolean_t is_parent_copyroot = FALSE;
svn_fs_root_t *copyroot_root;
dag_node_t *copyroot_node;
/* We're trying to clone somebody's child. Make sure our parent
is mutable. */
SVN_ERR(make_path_mutable(root, parent_path->parent,
error_path, pool));
switch (inherit)
{
case copy_id_inherit_parent:
parent_id = svn_fs_fs__dag_get_id(parent_path->parent->node);
copy_id = *svn_fs_fs__id_copy_id(parent_id);
break;
case copy_id_inherit_new:
SVN_ERR(svn_fs_fs__reserve_copy_id(&copy_id, root->fs, txn_id,
pool));
break;
case copy_id_inherit_self:
copy_id_ptr = NULL;
break;
case copy_id_inherit_unknown:
default:
SVN_ERR_MALFUNCTION(); /* uh-oh -- somebody didn't calculate copy-ID
inheritance data. */
}
/* Determine what copyroot our new child node should use. */
SVN_ERR(svn_fs_fs__dag_get_copyroot(&copyroot_rev, &copyroot_path,
parent_path->node));
SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, root->fs,
copyroot_rev, pool));
SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, pool));
child_id = svn_fs_fs__dag_get_id(parent_path->node);
copyroot_id = svn_fs_fs__dag_get_id(copyroot_node);
if (!svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(child_id),
svn_fs_fs__id_node_id(copyroot_id)))
is_parent_copyroot = TRUE;
/* Now make this node mutable. */
clone_path = parent_path_path(parent_path->parent, pool);
SVN_ERR(svn_fs_fs__dag_clone_child(&clone,
parent_path->parent->node,
clone_path,
parent_path->entry,
copy_id_ptr, txn_id,
is_parent_copyroot,
pool));
/* Update the path cache. */
SVN_ERR(dag_node_cache_set(root, parent_path_path(parent_path, pool),
clone, pool));
}
else
{
/* We're trying to clone the root directory. */
SVN_ERR(mutable_root_node(&clone, root, error_path, pool));
}
/* Update the PARENT_PATH link to refer to the clone. */
parent_path->node = clone;
return SVN_NO_ERROR;
}
/* Open the node identified by PATH in ROOT. Set DAG_NODE_P to the
node we find, allocated in POOL. Return the error
SVN_ERR_FS_NOT_FOUND if this node doesn't exist. */
static svn_error_t *
get_dag(dag_node_t **dag_node_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
parent_path_t *parent_path;
dag_node_t *node = NULL;
/* First we look for the DAG in our cache
(if the path may be canonical). */
if (*path == '/')
SVN_ERR(dag_node_cache_get(&node, root, path, pool));
if (! node)
{
/* Canonicalize the input PATH. As it turns out, >95% of all paths
* seen here during e.g. svnadmin verify are non-canonical, i.e.
* miss the leading '/'. Unconditional canonicalization has a net
* performance benefit over previously checking path for being
* canonical. */
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(dag_node_cache_get(&node, root, path, pool));
if (! node)
{
/* Call open_path with no flags, as we want this to return an
* error if the node for which we are searching doesn't exist. */
SVN_ERR(open_path(&parent_path, root, path,
open_path_uncached | open_path_node_only,
FALSE, pool));
node = parent_path->node;
/* No need to cache our find -- open_path() will do that for us. */
}
}
*dag_node_p = node;
return SVN_NO_ERROR;
}
/* Populating the `changes' table. */
/* Add a change to the changes table in FS, keyed on transaction id
TXN_ID, and indicated that a change of kind CHANGE_KIND occurred on
PATH (whose node revision id is--or was, in the case of a
deletion--NODEREV_ID), and optionally that TEXT_MODs, PROP_MODs or
MERGEINFO_MODs occurred. If the change resulted from a copy,
COPYFROM_REV and COPYFROM_PATH specify under which revision and path
the node was copied from. If this was not part of a copy, COPYFROM_REV
should be SVN_INVALID_REVNUM. Do all this as part of POOL. */
static svn_error_t *
add_change(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
const char *path,
const svn_fs_id_t *noderev_id,
svn_fs_path_change_kind_t change_kind,
svn_boolean_t text_mod,
svn_boolean_t prop_mod,
svn_boolean_t mergeinfo_mod,
svn_node_kind_t node_kind,
svn_revnum_t copyfrom_rev,
const char *copyfrom_path,
apr_pool_t *pool)
{
return svn_fs_fs__add_change(fs, txn_id,
svn_fs__canonicalize_abspath(path, pool),
noderev_id, change_kind,
text_mod, prop_mod, mergeinfo_mod,
node_kind, copyfrom_rev, copyfrom_path,
pool);
}
/* Generic node operations. */
/* Get the id of a node referenced by path PATH in ROOT. Return the
id in *ID_P allocated in POOL. */
svn_error_t *
svn_fs_fs__node_id(const svn_fs_id_t **id_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
if ((! root->is_txn_root)
&& (path[0] == '\0' || ((path[0] == '/') && (path[1] == '\0'))))
{
/* Optimize the case where we don't need any db access at all.
The root directory ("" or "/") node is stored in the
svn_fs_root_t object, and never changes when it's a revision
root, so we can just reach in and grab it directly. */
dag_node_t *root_dir = root->fsap_data;
*id_p = svn_fs_fs__id_copy(svn_fs_fs__dag_get_id(root_dir), pool);
}
else
{
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, pool));
*id_p = svn_fs_fs__id_copy(svn_fs_fs__dag_get_id(node), pool);
}
return SVN_NO_ERROR;
}
static svn_error_t *
fs_node_relation(svn_fs_node_relation_t *relation,
svn_fs_root_t *root_a, const char *path_a,
svn_fs_root_t *root_b, const char *path_b,
apr_pool_t *pool)
{
dag_node_t *node;
const svn_fs_id_t *id_a, *id_b;
svn_fs_fs__id_part_t node_id_a, node_id_b;
/* Root paths are a common special case. */
svn_boolean_t a_is_root_dir
= (path_a[0] == '\0') || ((path_a[0] == '/') && (path_a[1] == '\0'));
svn_boolean_t b_is_root_dir
= (path_b[0] == '\0') || ((path_b[0] == '/') && (path_b[1] == '\0'));
/* Another useful thing to know: Both are txns but not the same txn. */
svn_boolean_t different_txn
= root_a->is_txn_root && root_b->is_txn_root
&& strcmp(root_a->txn, root_b->txn);
/* Path from different repository are always unrelated. */
if (root_a->fs != root_b->fs)
{
*relation = svn_fs_node_unrelated;
return SVN_NO_ERROR;
}
/* Are both (!) root paths? Then, they are related and we only test how
* direct the relation is. */
if (a_is_root_dir && b_is_root_dir)
{
/* For txn roots, root->REV is the base revision of that TXN. */
*relation = ( (root_a->rev == root_b->rev)
&& (root_a->is_txn_root == root_b->is_txn_root)
&& !different_txn)
? svn_fs_node_unchanged
: svn_fs_node_common_ancestor;
return SVN_NO_ERROR;
}
/* We checked for all separations between ID spaces (repos, txn).
* Now, we can simply test for the ID values themselves. */
SVN_ERR(get_dag(&node, root_a, path_a, pool));
id_a = svn_fs_fs__dag_get_id(node);
node_id_a = *svn_fs_fs__id_node_id(id_a);
SVN_ERR(get_dag(&node, root_b, path_b, pool));
id_b = svn_fs_fs__dag_get_id(node);
node_id_b = *svn_fs_fs__id_node_id(id_b);
/* Noderevs from different nodes are unrelated. */
if (!svn_fs_fs__id_part_eq(&node_id_a, &node_id_b))
{
*relation = svn_fs_node_unrelated;
return SVN_NO_ERROR;
}
/* Noderevs have the same node-ID now. So, they *seem* to be related.
*
* Special case: Different txns may create the same (txn-local) node ID.
* Only when they are committed can they actually be related to others. */
if (different_txn && node_id_a.revision == SVN_INVALID_REVNUM)
{
*relation = svn_fs_node_unrelated;
return SVN_NO_ERROR;
}
/* The noderevs are actually related. Are they the same? */
if (svn_fs_fs__id_eq(id_a, id_b))
*relation = svn_fs_node_unchanged;
else
*relation = svn_fs_node_common_ancestor;
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__node_created_rev(svn_revnum_t *revision,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, pool));
return svn_fs_fs__dag_get_revision(revision, node, pool);
}
/* Set *CREATED_PATH to the path at which PATH under ROOT was created.
Return a string allocated in POOL. */
static svn_error_t *
fs_node_created_path(const char **created_path,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, pool));
*created_path = svn_fs_fs__dag_get_created_path(node);
return SVN_NO_ERROR;
}
/* Set *KIND_P to the type of node located at PATH under ROOT.
Perform temporary allocations in POOL. */
static svn_error_t *
node_kind(svn_node_kind_t *kind_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
const svn_fs_id_t *node_id;
dag_node_t *node;
/* Get the node id. */
SVN_ERR(svn_fs_fs__node_id(&node_id, root, path, pool));
/* Use the node id to get the real kind. */
SVN_ERR(svn_fs_fs__dag_get_node(&node, root->fs, node_id, pool));
*kind_p = svn_fs_fs__dag_node_kind(node);
return SVN_NO_ERROR;
}
/* Set *KIND_P to the type of node present at PATH under ROOT. If
PATH does not exist under ROOT, set *KIND_P to svn_node_none. Use
POOL for temporary allocation. */
svn_error_t *
svn_fs_fs__check_path(svn_node_kind_t *kind_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
svn_error_t *err = node_kind(kind_p, root, path, pool);
if (err &&
((err->apr_err == SVN_ERR_FS_NOT_FOUND)
|| (err->apr_err == SVN_ERR_FS_NOT_DIRECTORY)))
{
svn_error_clear(err);
err = SVN_NO_ERROR;
*kind_p = svn_node_none;
}
return svn_error_trace(err);
}
/* Set *VALUE_P to the value of the property named PROPNAME of PATH in
ROOT. If the node has no property by that name, set *VALUE_P to
zero. Allocate the result in POOL. */
static svn_error_t *
fs_node_prop(svn_string_t **value_p,
svn_fs_root_t *root,
const char *path,
const char *propname,
apr_pool_t *pool)
{
dag_node_t *node;
apr_hash_t *proplist;
SVN_ERR(get_dag(&node, root, path, pool));
SVN_ERR(svn_fs_fs__dag_get_proplist(&proplist, node, pool));
*value_p = NULL;
if (proplist)
*value_p = svn_hash_gets(proplist, propname);
return SVN_NO_ERROR;
}
/* Set *TABLE_P to the entire property list of PATH under ROOT, as an
APR hash table allocated in POOL. The resulting property table
maps property names to pointers to svn_string_t objects containing
the property value. */
static svn_error_t *
fs_node_proplist(apr_hash_t **table_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
apr_hash_t *table;
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, pool));
SVN_ERR(svn_fs_fs__dag_get_proplist(&table, node, pool));
*table_p = table ? table : apr_hash_make(pool);
return SVN_NO_ERROR;
}
static svn_error_t *
fs_node_has_props(svn_boolean_t *has_props,
svn_fs_root_t *root,
const char *path,
apr_pool_t *scratch_pool)
{
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, scratch_pool));
return svn_error_trace(svn_fs_fs__dag_has_props(has_props, node,
scratch_pool));
}
static svn_error_t *
increment_mergeinfo_up_tree(parent_path_t *pp,
apr_int64_t increment,
apr_pool_t *pool)
{
for (; pp; pp = pp->parent)
SVN_ERR(svn_fs_fs__dag_increment_mergeinfo_count(pp->node,
increment,
pool));
return SVN_NO_ERROR;
}
/* Change, add, or delete a node's property value. The affected node
is PATH under ROOT, the property value to modify is NAME, and VALUE
points to either a string value to set the new contents to, or NULL
if the property should be deleted. Perform temporary allocations
in POOL. */
static svn_error_t *
fs_change_node_prop(svn_fs_root_t *root,
const char *path,
const char *name,
const svn_string_t *value,
apr_pool_t *pool)
{
parent_path_t *parent_path;
apr_hash_t *proplist;
const svn_fs_fs__id_part_t *txn_id;
svn_boolean_t mergeinfo_mod = FALSE;
if (! root->is_txn_root)
return SVN_FS__NOT_TXN(root);
txn_id = root_txn_id(root);
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, 0, TRUE, pool));
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(path, root->fs, FALSE, FALSE,
pool));
SVN_ERR(make_path_mutable(root, parent_path, path, pool));
SVN_ERR(svn_fs_fs__dag_get_proplist(&proplist, parent_path->node, pool));
/* If there's no proplist, but we're just deleting a property, exit now. */
if ((! proplist) && (! value))
return SVN_NO_ERROR;
/* Now, if there's no proplist, we know we need to make one. */
if (! proplist)
proplist = apr_hash_make(pool);
if (svn_fs_fs__fs_supports_mergeinfo(root->fs)
&& strcmp (name, SVN_PROP_MERGEINFO) == 0)
{
apr_int64_t increment = 0;
svn_boolean_t had_mergeinfo;
SVN_ERR(svn_fs_fs__dag_has_mergeinfo(&had_mergeinfo, parent_path->node));
if (value && !had_mergeinfo)
increment = 1;
else if (!value && had_mergeinfo)
increment = -1;
if (increment != 0)
{
SVN_ERR(increment_mergeinfo_up_tree(parent_path, increment, pool));
SVN_ERR(svn_fs_fs__dag_set_has_mergeinfo(parent_path->node,
(value != NULL), pool));
}
mergeinfo_mod = TRUE;
}
/* Set the property. */
svn_hash_sets(proplist, name, value);
/* Overwrite the node's proplist. */
SVN_ERR(svn_fs_fs__dag_set_proplist(parent_path->node, proplist,
pool));
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path,
svn_fs_fs__dag_get_id(parent_path->node),
svn_fs_path_change_modify, FALSE, TRUE, mergeinfo_mod,
svn_fs_fs__dag_node_kind(parent_path->node),
SVN_INVALID_REVNUM, NULL, pool);
}
/* Determine if the properties of two path/root combinations are
different. Set *CHANGED_P to TRUE if the properties at PATH1 under
ROOT1 differ from those at PATH2 under ROOT2, or FALSE otherwise.
Both roots must be in the same filesystem. */
static svn_error_t *
fs_props_changed(svn_boolean_t *changed_p,
svn_fs_root_t *root1,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
svn_boolean_t strict,
apr_pool_t *pool)
{
dag_node_t *node1, *node2;
/* Check that roots are in the same fs. */
if (root1->fs != root2->fs)
return svn_error_create
(SVN_ERR_FS_GENERAL, NULL,
_("Cannot compare property value between two different filesystems"));
SVN_ERR(get_dag(&node1, root1, path1, pool));
SVN_ERR(get_dag(&node2, root2, path2, pool));
return svn_fs_fs__dag_things_different(changed_p, NULL,
node1, node2, strict, pool);
}
/* Merges and commits. */
/* Set *NODE to the root node of ROOT. */
static svn_error_t *
get_root(dag_node_t **node, svn_fs_root_t *root, apr_pool_t *pool)
{
return get_dag(node, root, "/", pool);
}
/* Set the contents of CONFLICT_PATH to PATH, and return an
SVN_ERR_FS_CONFLICT error that indicates that there was a conflict
at PATH. Perform all allocations in POOL (except the allocation of
CONFLICT_PATH, which should be handled outside this function). */
static svn_error_t *
conflict_err(svn_stringbuf_t *conflict_path,
const char *path)
{
svn_stringbuf_set(conflict_path, path);
return svn_error_createf(SVN_ERR_FS_CONFLICT, NULL,
_("Conflict at '%s'"), path);
}
/* Compare the directory representations at nodes LHS and RHS and set
* *CHANGED to TRUE, if at least one entry has been added or removed them.
* Use POOL for temporary allocations.
*/
static svn_error_t *
compare_dir_structure(svn_boolean_t *changed,
dag_node_t *lhs,
dag_node_t *rhs,
apr_pool_t *pool)
{
apr_array_header_t *lhs_entries;
apr_array_header_t *rhs_entries;
int i;
SVN_ERR(svn_fs_fs__dag_dir_entries(&lhs_entries, lhs, pool));
SVN_ERR(svn_fs_fs__dag_dir_entries(&rhs_entries, rhs, pool));
/* different number of entries -> some addition / removal */
if (lhs_entries->nelts != rhs_entries->nelts)
{
*changed = TRUE;
return SVN_NO_ERROR;
}
/* Since directories are sorted by name, we can simply compare their
entries one-by-one without binary lookup etc. */
for (i = 0; i < lhs_entries->nelts; ++i)
{
svn_fs_dirent_t *lhs_entry
= APR_ARRAY_IDX(lhs_entries, i, svn_fs_dirent_t *);
svn_fs_dirent_t *rhs_entry
= APR_ARRAY_IDX(rhs_entries, i, svn_fs_dirent_t *);
if (strcmp(lhs_entry->name, rhs_entry->name)
|| !svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(lhs_entry->id),
svn_fs_fs__id_node_id(rhs_entry->id))
|| !svn_fs_fs__id_part_eq(svn_fs_fs__id_copy_id(lhs_entry->id),
svn_fs_fs__id_copy_id(rhs_entry->id)))
{
*changed = TRUE;
return SVN_NO_ERROR;
}
}
*changed = FALSE;
return SVN_NO_ERROR;
}
/* Merge changes between ANCESTOR and SOURCE into TARGET. ANCESTOR
* and TARGET must be distinct node revisions. TARGET_PATH should
* correspond to TARGET's full path in its filesystem, and is used for
* reporting conflict location.
*
* SOURCE, TARGET, and ANCESTOR are generally directories; this
* function recursively merges the directories' contents. If any are
* files, this function simply returns an error whenever SOURCE,
* TARGET, and ANCESTOR are all distinct node revisions.
*
* If there are differences between ANCESTOR and SOURCE that conflict
* with changes between ANCESTOR and TARGET, this function returns an
* SVN_ERR_FS_CONFLICT error, and updates CONFLICT_P to the name of the
* conflicting node in TARGET, with TARGET_PATH prepended as a path.
*
* If there are no conflicting differences, CONFLICT_P is updated to
* the empty string.
*
* CONFLICT_P must point to a valid svn_stringbuf_t.
*
* Do any necessary temporary allocation in POOL.
*/
static svn_error_t *
merge(svn_stringbuf_t *conflict_p,
const char *target_path,
dag_node_t *target,
dag_node_t *source,
dag_node_t *ancestor,
const svn_fs_fs__id_part_t *txn_id,
apr_int64_t *mergeinfo_increment_out,
apr_pool_t *pool)
{
const svn_fs_id_t *source_id, *target_id, *ancestor_id;
apr_array_header_t *s_entries, *t_entries, *a_entries;
int i, s_idx = -1, t_idx = -1;
svn_fs_t *fs;
apr_pool_t *iterpool;
apr_int64_t mergeinfo_increment = 0;
svn_boolean_t fs_supports_mergeinfo;
/* Make sure everyone comes from the same filesystem. */
fs = svn_fs_fs__dag_get_fs(ancestor);
if ((fs != svn_fs_fs__dag_get_fs(source))
|| (fs != svn_fs_fs__dag_get_fs(target)))
{
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Bad merge; ancestor, source, and target not all in same fs"));
}
/* We have the same fs, now check it. */
SVN_ERR(svn_fs__check_fs(fs, TRUE));
source_id = svn_fs_fs__dag_get_id(source);
target_id = svn_fs_fs__dag_get_id(target);
ancestor_id = svn_fs_fs__dag_get_id(ancestor);
/* It's improper to call this function with ancestor == target. */
if (svn_fs_fs__id_eq(ancestor_id, target_id))
{
svn_string_t *id_str = svn_fs_fs__id_unparse(target_id, pool);
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL,
_("Bad merge; target '%s' has id '%s', same as ancestor"),
target_path, id_str->data);
}
svn_stringbuf_setempty(conflict_p);
/* Base cases:
* Either no change made in source, or same change as made in target.
* Both mean nothing to merge here.
*/
if (svn_fs_fs__id_eq(ancestor_id, source_id)
|| (svn_fs_fs__id_eq(source_id, target_id)))
return SVN_NO_ERROR;
/* Else proceed, knowing all three are distinct node revisions.
*
* How to merge from this point:
*
* if (not all 3 are directories)
* {
* early exit with conflict;
* }
*
* // Property changes may only be made to up-to-date
* // directories, because once the client commits the prop
* // change, it bumps the directory's revision, and therefore
* // must be able to depend on there being no other changes to
* // that directory in the repository.
* if (target's property list differs from ancestor's)
* conflict;
*
* For each entry NAME in the directory ANCESTOR:
*
* Let ANCESTOR-ENTRY, SOURCE-ENTRY, and TARGET-ENTRY be the IDs of
* the name within ANCESTOR, SOURCE, and TARGET respectively.
* (Possibly null if NAME does not exist in SOURCE or TARGET.)
*
* If ANCESTOR-ENTRY == SOURCE-ENTRY, then:
* No changes were made to this entry while the transaction was in
* progress, so do nothing to the target.
*
* Else if ANCESTOR-ENTRY == TARGET-ENTRY, then:
* A change was made to this entry while the transaction was in
* process, but the transaction did not touch this entry. Replace
* TARGET-ENTRY with SOURCE-ENTRY.
*
* Else:
* Changes were made to this entry both within the transaction and
* to the repository while the transaction was in progress. They
* must be merged or declared to be in conflict.
*
* If SOURCE-ENTRY and TARGET-ENTRY are both null, that's a
* double delete; flag a conflict.
*
* If any of the three entries is of type file, declare a conflict.
*
* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
* modification of ANCESTOR-ENTRY (determine by comparing the
* node-id fields), declare a conflict. A replacement is
* incompatible with a modification or other replacement--even
* an identical replacement.
*
* Direct modifications were made to the directory ANCESTOR-ENTRY
* in both SOURCE and TARGET. Recursively merge these
* modifications.
*
* For each leftover entry NAME in the directory SOURCE:
*
* If NAME exists in TARGET, declare a conflict. Even if SOURCE and
* TARGET are adding exactly the same thing, two additions are not
* auto-mergeable with each other.
*
* Add NAME to TARGET with the entry from SOURCE.
*
* Now that we are done merging the changes from SOURCE into the
* directory TARGET, update TARGET's predecessor to be SOURCE.
*/
if ((svn_fs_fs__dag_node_kind(source) != svn_node_dir)
|| (svn_fs_fs__dag_node_kind(target) != svn_node_dir)
|| (svn_fs_fs__dag_node_kind(ancestor) != svn_node_dir))
{
return conflict_err(conflict_p, target_path);
}
/* Possible early merge failure: if target and ancestor have
different property lists, then the merge should fail.
Propchanges can *only* be committed on an up-to-date directory.
### TODO: see issue #418 about the inelegance of this.
Another possible, similar, early merge failure: if source and
ancestor have different property lists (meaning someone else
changed directory properties while our commit transaction was
happening), the merge should fail. See issue #2751.
*/
{
node_revision_t *tgt_nr, *anc_nr, *src_nr;
svn_boolean_t same;
apr_pool_t *scratch_pool;
/* Get node revisions for our id's. */
scratch_pool = svn_pool_create(pool);
SVN_ERR(svn_fs_fs__get_node_revision(&tgt_nr, fs, target_id, pool,
scratch_pool));
svn_pool_clear(scratch_pool);
SVN_ERR(svn_fs_fs__get_node_revision(&anc_nr, fs, ancestor_id, pool,
scratch_pool));
svn_pool_clear(scratch_pool);
SVN_ERR(svn_fs_fs__get_node_revision(&src_nr, fs, source_id, pool,
scratch_pool));
svn_pool_destroy(scratch_pool);
/* Now compare the prop-keys of the skels. Note that just because
the keys are different -doesn't- mean the proplists have
different contents. */
SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, src_nr, anc_nr, pool));
if (! same)
return conflict_err(conflict_p, target_path);
/* The directory entries got changed in the repository but the directory
properties did not. */
SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, tgt_nr, anc_nr, pool));
if (! same)
{
/* There is an incoming prop change for this directory.
We will accept it only if the directory changes were mere updates
to its entries, i.e. there were no additions or removals.
Those could cause update problems to the working copy. */
svn_boolean_t changed;
SVN_ERR(compare_dir_structure(&changed, source, ancestor, pool));
if (changed)
return conflict_err(conflict_p, target_path);
}
}
/* ### todo: it would be more efficient to simply check for a NULL
entries hash where necessary below than to allocate an empty hash
here, but another day, another day... */
SVN_ERR(svn_fs_fs__dag_dir_entries(&s_entries, source, pool));
SVN_ERR(svn_fs_fs__dag_dir_entries(&t_entries, target, pool));
SVN_ERR(svn_fs_fs__dag_dir_entries(&a_entries, ancestor, pool));
fs_supports_mergeinfo = svn_fs_fs__fs_supports_mergeinfo(fs);
/* for each entry E in a_entries... */
iterpool = svn_pool_create(pool);
for (i = 0; i < a_entries->nelts; ++i)
{
svn_fs_dirent_t *s_entry, *t_entry, *a_entry;
svn_pool_clear(iterpool);
a_entry = APR_ARRAY_IDX(a_entries, i, svn_fs_dirent_t *);
s_entry = svn_fs_fs__find_dir_entry(s_entries, a_entry->name, &s_idx);
t_entry = svn_fs_fs__find_dir_entry(t_entries, a_entry->name, &t_idx);
/* No changes were made to this entry while the transaction was
in progress, so do nothing to the target. */
if (s_entry && svn_fs_fs__id_eq(a_entry->id, s_entry->id))
continue;
/* A change was made to this entry while the transaction was in
process, but the transaction did not touch this entry. */
else if (t_entry && svn_fs_fs__id_eq(a_entry->id, t_entry->id))
{
dag_node_t *t_ent_node;
SVN_ERR(svn_fs_fs__dag_get_node(&t_ent_node, fs,
t_entry->id, iterpool));
if (fs_supports_mergeinfo)
{
apr_int64_t mergeinfo_start;
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_start,
t_ent_node));
mergeinfo_increment -= mergeinfo_start;
}
if (s_entry)
{
dag_node_t *s_ent_node;
SVN_ERR(svn_fs_fs__dag_get_node(&s_ent_node, fs,
s_entry->id, iterpool));
if (fs_supports_mergeinfo)
{
apr_int64_t mergeinfo_end;
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_end,
s_ent_node));
mergeinfo_increment += mergeinfo_end;
}
SVN_ERR(svn_fs_fs__dag_set_entry(target, a_entry->name,
s_entry->id,
s_entry->kind,
txn_id,
pool));
}
else
{
SVN_ERR(svn_fs_fs__dag_delete(target, a_entry->name, txn_id,
iterpool));
}
}
/* Changes were made to this entry both within the transaction
and to the repository while the transaction was in progress.
They must be merged or declared to be in conflict. */
else
{
dag_node_t *s_ent_node, *t_ent_node, *a_ent_node;
const char *new_tpath;
apr_int64_t sub_mergeinfo_increment;
/* If SOURCE-ENTRY and TARGET-ENTRY are both null, that's a
double delete; if one of them is null, that's a delete versus
a modification. In any of these cases, flag a conflict. */
if (s_entry == NULL || t_entry == NULL)
return conflict_err(conflict_p,
svn_fspath__join(target_path,
a_entry->name,
iterpool));
/* If any of the three entries is of type file, flag a conflict. */
if (s_entry->kind == svn_node_file
|| t_entry->kind == svn_node_file
|| a_entry->kind == svn_node_file)
return conflict_err(conflict_p,
svn_fspath__join(target_path,
a_entry->name,
iterpool));
/* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
modification of ANCESTOR-ENTRY, declare a conflict. */
if (!svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(s_entry->id),
svn_fs_fs__id_node_id(a_entry->id))
|| !svn_fs_fs__id_part_eq(svn_fs_fs__id_copy_id(s_entry->id),
svn_fs_fs__id_copy_id(a_entry->id))
|| !svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(t_entry->id),
svn_fs_fs__id_node_id(a_entry->id))
|| !svn_fs_fs__id_part_eq(svn_fs_fs__id_copy_id(t_entry->id),
svn_fs_fs__id_copy_id(a_entry->id)))
return conflict_err(conflict_p,
svn_fspath__join(target_path,
a_entry->name,
iterpool));
/* Direct modifications were made to the directory
ANCESTOR-ENTRY in both SOURCE and TARGET. Recursively
merge these modifications. */
SVN_ERR(svn_fs_fs__dag_get_node(&s_ent_node, fs,
s_entry->id, iterpool));
SVN_ERR(svn_fs_fs__dag_get_node(&t_ent_node, fs,
t_entry->id, iterpool));
SVN_ERR(svn_fs_fs__dag_get_node(&a_ent_node, fs,
a_entry->id, iterpool));
new_tpath = svn_fspath__join(target_path, t_entry->name, iterpool);
SVN_ERR(merge(conflict_p, new_tpath,
t_ent_node, s_ent_node, a_ent_node,
txn_id,
&sub_mergeinfo_increment,
iterpool));
if (fs_supports_mergeinfo)
mergeinfo_increment += sub_mergeinfo_increment;
}
}
/* For each entry E in source but not in ancestor */
for (i = 0; i < s_entries->nelts; ++i)
{
svn_fs_dirent_t *a_entry, *s_entry, *t_entry;
dag_node_t *s_ent_node;
svn_pool_clear(iterpool);
s_entry = APR_ARRAY_IDX(s_entries, i, svn_fs_dirent_t *);
a_entry = svn_fs_fs__find_dir_entry(a_entries, s_entry->name, &s_idx);
t_entry = svn_fs_fs__find_dir_entry(t_entries, s_entry->name, &t_idx);
/* Process only entries in source that are NOT in ancestor. */
if (a_entry)
continue;
/* If NAME exists in TARGET, declare a conflict. */
if (t_entry)
return conflict_err(conflict_p,
svn_fspath__join(target_path,
t_entry->name,
iterpool));
SVN_ERR(svn_fs_fs__dag_get_node(&s_ent_node, fs,
s_entry->id, iterpool));
if (fs_supports_mergeinfo)
{
apr_int64_t mergeinfo_s;
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_s,
s_ent_node));
mergeinfo_increment += mergeinfo_s;
}
SVN_ERR(svn_fs_fs__dag_set_entry
(target, s_entry->name, s_entry->id, s_entry->kind,
txn_id, iterpool));
}
svn_pool_destroy(iterpool);
SVN_ERR(svn_fs_fs__dag_update_ancestry(target, source, pool));
if (fs_supports_mergeinfo)
SVN_ERR(svn_fs_fs__dag_increment_mergeinfo_count(target,
mergeinfo_increment,
pool));
if (mergeinfo_increment_out)
*mergeinfo_increment_out = mergeinfo_increment;
return SVN_NO_ERROR;
}
/* Merge changes between an ancestor and SOURCE_NODE into
TXN. The ancestor is either ANCESTOR_NODE, or if
that is null, TXN's base node.
If the merge is successful, TXN's base will become
SOURCE_NODE, and its root node will have a new ID, a
successor of SOURCE_NODE.
If a conflict results, update *CONFLICT to the path in the txn that
conflicted; see the CONFLICT_P parameter of merge() for details. */
static svn_error_t *
merge_changes(dag_node_t *ancestor_node,
dag_node_t *source_node,
svn_fs_txn_t *txn,
svn_stringbuf_t *conflict,
apr_pool_t *pool)
{
dag_node_t *txn_root_node;
svn_fs_t *fs = txn->fs;
const svn_fs_fs__id_part_t *txn_id = svn_fs_fs__txn_get_id(txn);
SVN_ERR(svn_fs_fs__dag_txn_root(&txn_root_node, fs, txn_id, pool));
if (ancestor_node == NULL)
{
SVN_ERR(svn_fs_fs__dag_txn_base_root(&ancestor_node, fs,
txn_id, pool));
}
if (svn_fs_fs__id_eq(svn_fs_fs__dag_get_id(ancestor_node),
svn_fs_fs__dag_get_id(txn_root_node)))
{
/* If no changes have been made in TXN since its current base,
then it can't conflict with any changes since that base.
The caller isn't supposed to call us in that case. */
SVN_ERR_MALFUNCTION();
}
else
SVN_ERR(merge(conflict, "/", txn_root_node,
source_node, ancestor_node, txn_id, NULL, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__commit_txn(const char **conflict_p,
svn_revnum_t *new_rev,
svn_fs_txn_t *txn,
apr_pool_t *pool)
{
/* How do commits work in Subversion?
*
* When you're ready to commit, here's what you have:
*
* 1. A transaction, with a mutable tree hanging off it.
* 2. A base revision, against which TXN_TREE was made.
* 3. A latest revision, which may be newer than the base rev.
*
* The problem is that if latest != base, then one can't simply
* attach the txn root as the root of the new revision, because that
* would lose all the changes between base and latest. It is also
* not acceptable to insist that base == latest; in a busy
* repository, commits happen too fast to insist that everyone keep
* their entire tree up-to-date at all times. Non-overlapping
* changes should not interfere with each other.
*
* The solution is to merge the changes between base and latest into
* the txn tree [see the function merge()]. The txn tree is the
* only one of the three trees that is mutable, so it has to be the
* one to adjust.
*
* You might have to adjust it more than once, if a new latest
* revision gets committed while you were merging in the previous
* one. For example:
*
* 1. Jane starts txn T, based at revision 6.
* 2. Someone commits (or already committed) revision 7.
* 3. Jane's starts merging the changes between 6 and 7 into T.
* 4. Meanwhile, someone commits revision 8.
* 5. Jane finishes the 6-->7 merge. T could now be committed
* against a latest revision of 7, if only that were still the
* latest. Unfortunately, 8 is now the latest, so...
* 6. Jane starts merging the changes between 7 and 8 into T.
* 7. Meanwhile, no one commits any new revisions. Whew.
* 8. Jane commits T, creating revision 9, whose tree is exactly
* T's tree, except immutable now.
*
* Lather, rinse, repeat.
*/
svn_error_t *err = SVN_NO_ERROR;
svn_stringbuf_t *conflict = svn_stringbuf_create_empty(pool);
svn_fs_t *fs = txn->fs;
fs_fs_data_t *ffd = fs->fsap_data;
/* Limit memory usage when the repository has a high commit rate and
needs to run the following while loop multiple times. The memory
growth without an iteration pool is very noticeable when the
transaction modifies a node that has 20,000 sibling nodes. */
apr_pool_t *iterpool = svn_pool_create(pool);
/* Initialize output params. */
*new_rev = SVN_INVALID_REVNUM;
if (conflict_p)
*conflict_p = NULL;
while (1729)
{
svn_revnum_t youngish_rev;
svn_fs_root_t *youngish_root;
dag_node_t *youngish_root_node;
svn_pool_clear(iterpool);
/* Get the *current* youngest revision. We call it "youngish"
because new revisions might get committed after we've
obtained it. */
SVN_ERR(svn_fs_fs__youngest_rev(&youngish_rev, fs, iterpool));
SVN_ERR(svn_fs_fs__revision_root(&youngish_root, fs, youngish_rev,
iterpool));
/* Get the dag node for the youngest revision. Later we'll use
it as the SOURCE argument to a merge, and if the merge
succeeds, this youngest root node will become the new base
root for the svn txn that was the target of the merge (but
note that the youngest rev may have changed by then -- that's
why we're careful to get this root in its own bdb txn
here). */
SVN_ERR(get_root(&youngish_root_node, youngish_root, iterpool));
/* Try to merge. If the merge succeeds, the base root node of
TARGET's txn will become the same as youngish_root_node, so
any future merges will only be between that node and whatever
the root node of the youngest rev is by then. */
err = merge_changes(NULL, youngish_root_node, txn, conflict, iterpool);
if (err)
{
if ((err->apr_err == SVN_ERR_FS_CONFLICT) && conflict_p)
*conflict_p = conflict->data;
goto cleanup;
}
txn->base_rev = youngish_rev;
/* Try to commit. */
err = svn_fs_fs__commit(new_rev, fs, txn, iterpool);
if (err && (err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE))
{
/* Did someone else finish committing a new revision while we
were in mid-merge or mid-commit? If so, we'll need to
loop again to merge the new changes in, then try to
commit again. Or if that's not what happened, then just
return the error. */
svn_revnum_t youngest_rev;
SVN_ERR(svn_fs_fs__youngest_rev(&youngest_rev, fs, iterpool));
if (youngest_rev == youngish_rev)
goto cleanup;
else
svn_error_clear(err);
}
else if (err)
{
goto cleanup;
}
else
{
err = SVN_NO_ERROR;
goto cleanup;
}
}
cleanup:
svn_fs_fs__reset_txn_caches(fs);
svn_pool_destroy(iterpool);
SVN_ERR(err);
if (ffd->pack_after_commit)
{
- SVN_ERR(svn_fs_fs__pack(fs, NULL, NULL, NULL, NULL, pool));
+ SVN_ERR(svn_fs_fs__pack(fs, 0, NULL, NULL, NULL, NULL, pool));
}
return SVN_NO_ERROR;
}
/* Merge changes between two nodes into a third node. Given nodes
SOURCE_PATH under SOURCE_ROOT, TARGET_PATH under TARGET_ROOT and
ANCESTOR_PATH under ANCESTOR_ROOT, modify target to contain all the
changes between the ancestor and source. If there are conflicts,
return SVN_ERR_FS_CONFLICT and set *CONFLICT_P to a textual
description of the offending changes. Perform any temporary
allocations in POOL. */
static svn_error_t *
fs_merge(const char **conflict_p,
svn_fs_root_t *source_root,
const char *source_path,
svn_fs_root_t *target_root,
const char *target_path,
svn_fs_root_t *ancestor_root,
const char *ancestor_path,
apr_pool_t *pool)
{
dag_node_t *source, *ancestor;
svn_fs_txn_t *txn;
svn_error_t *err;
svn_stringbuf_t *conflict = svn_stringbuf_create_empty(pool);
if (! target_root->is_txn_root)
return SVN_FS__NOT_TXN(target_root);
/* Paranoia. */
if ((source_root->fs != ancestor_root->fs)
|| (target_root->fs != ancestor_root->fs))
{
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Bad merge; ancestor, source, and target not all in same fs"));
}
/* ### kff todo: is there any compelling reason to get the nodes in
one db transaction? Right now we don't; txn_body_get_root() gets
one node at a time. This will probably need to change:
Jim Blandy <jimb@zwingli.cygnus.com> writes:
> svn_fs_merge needs to be a single transaction, to protect it against
> people deleting parents of nodes it's working on, etc.
*/
/* Get the ancestor node. */
SVN_ERR(get_root(&ancestor, ancestor_root, pool));
/* Get the source node. */
SVN_ERR(get_root(&source, source_root, pool));
/* Open a txn for the txn root into which we're merging. */
SVN_ERR(svn_fs_fs__open_txn(&txn, ancestor_root->fs, target_root->txn,
pool));
/* Merge changes between ANCESTOR and SOURCE into TXN. */
err = merge_changes(ancestor, source, txn, conflict, pool);
if (err)
{
if ((err->apr_err == SVN_ERR_FS_CONFLICT) && conflict_p)
*conflict_p = conflict->data;
return svn_error_trace(err);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__deltify(svn_fs_t *fs,
svn_revnum_t revision,
apr_pool_t *pool)
{
/* Deltify is a no-op for fs_fs. */
return SVN_NO_ERROR;
}
/* Directories. */
/* Set *TABLE_P to a newly allocated APR hash table containing the
entries of the directory at PATH in ROOT. The keys of the table
are entry names, as byte strings, excluding the final null
character; the table's values are pointers to svn_fs_dirent_t
structures. Allocate the table and its contents in POOL. */
static svn_error_t *
fs_dir_entries(apr_hash_t **table_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *node;
apr_hash_t *hash = svn_hash__make(pool);
apr_array_header_t *table;
int i;
/* Get the entries for this path in the caller's pool. */
SVN_ERR(get_dag(&node, root, path, pool));
SVN_ERR(svn_fs_fs__dag_dir_entries(&table, node, pool));
/* Convert directory array to hash. */
for (i = 0; i < table->nelts; ++i)
{
svn_fs_dirent_t *entry = APR_ARRAY_IDX(table, i, svn_fs_dirent_t *);
svn_hash_sets(hash, entry->name, entry);
}
*table_p = hash;
return SVN_NO_ERROR;
}
static svn_error_t *
fs_dir_optimal_order(apr_array_header_t **ordered_p,
svn_fs_root_t *root,
apr_hash_t *entries,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
*ordered_p = svn_fs_fs__order_dir_entries(root->fs, entries, result_pool,
scratch_pool);
return SVN_NO_ERROR;
}
/* Raise an error if PATH contains a newline because FSFS cannot handle
* such paths. See issue #4340. */
static svn_error_t *
check_newline(const char *path, apr_pool_t *pool)
{
char *c = strchr(path, '\n');
if (c)
return svn_error_createf(SVN_ERR_FS_PATH_SYNTAX, NULL,
_("Invalid control character '0x%02x' in path '%s'"),
(unsigned char)*c, svn_path_illegal_path_escape(path, pool));
return SVN_NO_ERROR;
}
/* Create a new directory named PATH in ROOT. The new directory has
no entries, and no properties. ROOT must be the root of a
transaction, not a revision. Do any necessary temporary allocation
in POOL. */
static svn_error_t *
fs_make_dir(svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
parent_path_t *parent_path;
dag_node_t *sub_dir;
const svn_fs_fs__id_part_t *txn_id = root_txn_id(root);
SVN_ERR(check_newline(path, pool));
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, open_path_last_optional,
TRUE, pool));
/* Check (recursively) to see if some lock is 'reserving' a path at
that location, or even some child-path; if so, check that we can
use it. */
if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(path, root->fs, TRUE, FALSE,
pool));
/* If there's already a sub-directory by that name, complain. This
also catches the case of trying to make a subdirectory named `/'. */
if (parent_path->node)
return SVN_FS__ALREADY_EXISTS(root, path);
/* Create the subdirectory. */
SVN_ERR(make_path_mutable(root, parent_path->parent, path, pool));
SVN_ERR(svn_fs_fs__dag_make_dir(&sub_dir,
parent_path->parent->node,
parent_path_path(parent_path->parent,
pool),
parent_path->entry,
txn_id,
pool));
/* Add this directory to the path cache. */
SVN_ERR(dag_node_cache_set(root, parent_path_path(parent_path, pool),
sub_dir, pool));
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(sub_dir),
svn_fs_path_change_add, FALSE, FALSE, FALSE,
svn_node_dir, SVN_INVALID_REVNUM, NULL, pool);
}
/* Delete the node at PATH under ROOT. ROOT must be a transaction
root. Perform temporary allocations in POOL. */
static svn_error_t *
fs_delete_node(svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
parent_path_t *parent_path;
const svn_fs_fs__id_part_t *txn_id;
apr_int64_t mergeinfo_count = 0;
svn_node_kind_t kind;
if (! root->is_txn_root)
return SVN_FS__NOT_TXN(root);
txn_id = root_txn_id(root);
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, 0, TRUE, pool));
kind = svn_fs_fs__dag_node_kind(parent_path->node);
/* We can't remove the root of the filesystem. */
if (! parent_path->parent)
return svn_error_create(SVN_ERR_FS_ROOT_DIR, NULL,
_("The root directory cannot be deleted"));
/* Check to see if path (or any child thereof) is locked; if so,
check that we can use the existing lock(s). */
if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(path, root->fs, TRUE, FALSE,
pool));
/* Make the parent directory mutable, and do the deletion. */
SVN_ERR(make_path_mutable(root, parent_path->parent, path, pool));
if (svn_fs_fs__fs_supports_mergeinfo(root->fs))
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_count,
parent_path->node));
SVN_ERR(svn_fs_fs__dag_delete(parent_path->parent->node,
parent_path->entry,
txn_id, pool));
/* Remove this node and any children from the path cache. */
SVN_ERR(dag_node_cache_invalidate(root, parent_path_path(parent_path, pool),
pool));
/* Update mergeinfo counts for parents */
if (mergeinfo_count > 0)
SVN_ERR(increment_mergeinfo_up_tree(parent_path->parent,
-mergeinfo_count,
pool));
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path,
svn_fs_fs__dag_get_id(parent_path->node),
svn_fs_path_change_delete, FALSE, FALSE, FALSE, kind,
SVN_INVALID_REVNUM, NULL, pool);
}
/* Set *SAME_P to TRUE if FS1 and FS2 have the same UUID, else set to FALSE.
Use POOL for temporary allocation only.
Note: this code is duplicated between libsvn_fs_fs and libsvn_fs_base. */
static svn_error_t *
fs_same_p(svn_boolean_t *same_p,
svn_fs_t *fs1,
svn_fs_t *fs2,
apr_pool_t *pool)
{
*same_p = ! strcmp(fs1->uuid, fs2->uuid);
return SVN_NO_ERROR;
}
/* Copy the node at FROM_PATH under FROM_ROOT to TO_PATH under
TO_ROOT. If PRESERVE_HISTORY is set, then the copy is recorded in
the copies table. Perform temporary allocations in POOL. */
static svn_error_t *
copy_helper(svn_fs_root_t *from_root,
const char *from_path,
svn_fs_root_t *to_root,
const char *to_path,
svn_boolean_t preserve_history,
apr_pool_t *pool)
{
dag_node_t *from_node;
parent_path_t *to_parent_path;
const svn_fs_fs__id_part_t *txn_id = root_txn_id(to_root);
svn_boolean_t same_p;
/* Use an error check, not an assert, because even the caller cannot
guarantee that a filesystem's UUID has not changed "on the fly". */
SVN_ERR(fs_same_p(&same_p, from_root->fs, to_root->fs, pool));
if (! same_p)
return svn_error_createf
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Cannot copy between two different filesystems ('%s' and '%s')"),
from_root->fs->path, to_root->fs->path);
/* more things that we can't do ATM */
if (from_root->is_txn_root)
return svn_error_create
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Copy from mutable tree not currently supported"));
if (! to_root->is_txn_root)
return svn_error_create
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Copy immutable tree not supported"));
/* Get the NODE for FROM_PATH in FROM_ROOT.*/
SVN_ERR(get_dag(&from_node, from_root, from_path, pool));
/* Build up the parent path from TO_PATH in TO_ROOT. If the last
component does not exist, it's not that big a deal. We'll just
make one there. */
SVN_ERR(open_path(&to_parent_path, to_root, to_path,
open_path_last_optional, TRUE, pool));
/* Check to see if path (or any child thereof) is locked; if so,
check that we can use the existing lock(s). */
if (to_root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(to_path, to_root->fs,
TRUE, FALSE, pool));
/* If the destination node already exists as the same node as the
source (in other words, this operation would result in nothing
happening at all), just do nothing an return successfully,
proud that you saved yourself from a tiresome task. */
if (to_parent_path->node &&
svn_fs_fs__id_eq(svn_fs_fs__dag_get_id(from_node),
svn_fs_fs__dag_get_id(to_parent_path->node)))
return SVN_NO_ERROR;
if (! from_root->is_txn_root)
{
svn_fs_path_change_kind_t kind;
dag_node_t *new_node;
const char *from_canonpath;
apr_int64_t mergeinfo_start;
apr_int64_t mergeinfo_end;
/* If TO_PATH already existed prior to the copy, note that this
operation is a replacement, not an addition. */
if (to_parent_path->node)
{
kind = svn_fs_path_change_replace;
if (svn_fs_fs__fs_supports_mergeinfo(to_root->fs))
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_start,
to_parent_path->node));
}
else
{
kind = svn_fs_path_change_add;
mergeinfo_start = 0;
}
if (svn_fs_fs__fs_supports_mergeinfo(to_root->fs))
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_end,
from_node));
/* Make sure the target node's parents are mutable. */
SVN_ERR(make_path_mutable(to_root, to_parent_path->parent,
to_path, pool));
/* Canonicalize the copyfrom path. */
from_canonpath = svn_fs__canonicalize_abspath(from_path, pool);
SVN_ERR(svn_fs_fs__dag_copy(to_parent_path->parent->node,
to_parent_path->entry,
from_node,
preserve_history,
from_root->rev,
from_canonpath,
txn_id, pool));
if (kind != svn_fs_path_change_add)
SVN_ERR(dag_node_cache_invalidate(to_root,
parent_path_path(to_parent_path,
pool), pool));
if (svn_fs_fs__fs_supports_mergeinfo(to_root->fs)
&& mergeinfo_start != mergeinfo_end)
SVN_ERR(increment_mergeinfo_up_tree(to_parent_path->parent,
mergeinfo_end - mergeinfo_start,
pool));
/* Make a record of this modification in the changes table. */
SVN_ERR(get_dag(&new_node, to_root, to_path, pool));
SVN_ERR(add_change(to_root->fs, txn_id, to_path,
svn_fs_fs__dag_get_id(new_node), kind, FALSE,
FALSE, FALSE, svn_fs_fs__dag_node_kind(from_node),
from_root->rev, from_canonpath, pool));
}
else
{
/* See IZ Issue #436 */
/* Copying from transaction roots not currently available.
### cmpilato todo someday: make this not so. :-) Note that
when copying from mutable trees, you have to make sure that
you aren't creating a cyclic graph filesystem, and a simple
referencing operation won't cut it. Currently, we should not
be able to reach this clause, and the interface reports that
this only works from immutable trees anyway, but JimB has
stated that this requirement need not be necessary in the
future. */
SVN_ERR_MALFUNCTION();
}
return SVN_NO_ERROR;
}
/* Create a copy of FROM_PATH in FROM_ROOT named TO_PATH in TO_ROOT.
If FROM_PATH is a directory, copy it recursively. Temporary
allocations are from POOL.*/
static svn_error_t *
fs_copy(svn_fs_root_t *from_root,
const char *from_path,
svn_fs_root_t *to_root,
const char *to_path,
apr_pool_t *pool)
{
SVN_ERR(check_newline(to_path, pool));
return svn_error_trace(copy_helper(from_root,
svn_fs__canonicalize_abspath(from_path,
pool),
to_root,
svn_fs__canonicalize_abspath(to_path,
pool),
TRUE, pool));
}
/* Create a copy of FROM_PATH in FROM_ROOT named TO_PATH in TO_ROOT.
If FROM_PATH is a directory, copy it recursively. No history is
preserved. Temporary allocations are from POOL. */
static svn_error_t *
fs_revision_link(svn_fs_root_t *from_root,
svn_fs_root_t *to_root,
const char *path,
apr_pool_t *pool)
{
if (! to_root->is_txn_root)
return SVN_FS__NOT_TXN(to_root);
path = svn_fs__canonicalize_abspath(path, pool);
return svn_error_trace(copy_helper(from_root, path, to_root, path,
FALSE, pool));
}
/* Discover the copy ancestry of PATH under ROOT. Return a relevant
ancestor/revision combination in *PATH_P and *REV_P. Temporary
allocations are in POOL. */
static svn_error_t *
fs_copied_from(svn_revnum_t *rev_p,
const char **path_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *node;
/* There is no cached entry, look it up the old-fashioned
way. */
SVN_ERR(get_dag(&node, root, path, pool));
SVN_ERR(svn_fs_fs__dag_get_copyfrom_rev(rev_p, node));
SVN_ERR(svn_fs_fs__dag_get_copyfrom_path(path_p, node));
return SVN_NO_ERROR;
}
/* Files. */
/* Create the empty file PATH under ROOT. Temporary allocations are
in POOL. */
static svn_error_t *
fs_make_file(svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
parent_path_t *parent_path;
dag_node_t *child;
const svn_fs_fs__id_part_t *txn_id = root_txn_id(root);
SVN_ERR(check_newline(path, pool));
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, open_path_last_optional,
TRUE, pool));
/* If there's already a file by that name, complain.
This also catches the case of trying to make a file named `/'. */
if (parent_path->node)
return SVN_FS__ALREADY_EXISTS(root, path);
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(path, root->fs, FALSE, FALSE,
pool));
/* Create the file. */
SVN_ERR(make_path_mutable(root, parent_path->parent, path, pool));
SVN_ERR(svn_fs_fs__dag_make_file(&child,
parent_path->parent->node,
parent_path_path(parent_path->parent,
pool),
parent_path->entry,
txn_id,
pool));
/* Add this file to the path cache. */
SVN_ERR(dag_node_cache_set(root, parent_path_path(parent_path, pool), child,
pool));
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(child),
svn_fs_path_change_add, TRUE, FALSE, FALSE,
svn_node_file, SVN_INVALID_REVNUM, NULL, pool);
}
/* Set *LENGTH_P to the size of the file PATH under ROOT. Temporary
allocations are in POOL. */
static svn_error_t *
fs_file_length(svn_filesize_t *length_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *file;
/* First create a dag_node_t from the root/path pair. */
SVN_ERR(get_dag(&file, root, path, pool));
/* Now fetch its length */
return svn_fs_fs__dag_file_length(length_p, file, pool);
}
/* Set *CHECKSUM to the checksum of type KIND for PATH under ROOT, or
NULL if that information isn't available. Temporary allocations
are from POOL. */
static svn_error_t *
fs_file_checksum(svn_checksum_t **checksum,
svn_checksum_kind_t kind,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *file;
SVN_ERR(get_dag(&file, root, path, pool));
return svn_fs_fs__dag_file_checksum(checksum, file, kind, pool);
}
/* --- Machinery for svn_fs_file_contents() --- */
/* Set *CONTENTS to a readable stream that will return the contents of
PATH under ROOT. The stream is allocated in POOL. */
static svn_error_t *
fs_file_contents(svn_stream_t **contents,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
dag_node_t *node;
svn_stream_t *file_stream;
/* First create a dag_node_t from the root/path pair. */
SVN_ERR(get_dag(&node, root, path, pool));
/* Then create a readable stream from the dag_node_t. */
SVN_ERR(svn_fs_fs__dag_get_contents(&file_stream, node, pool));
*contents = file_stream;
return SVN_NO_ERROR;
}
/* --- End machinery for svn_fs_file_contents() --- */
/* --- Machinery for svn_fs_try_process_file_contents() --- */
static svn_error_t *
fs_try_process_file_contents(svn_boolean_t *success,
svn_fs_root_t *root,
const char *path,
svn_fs_process_contents_func_t processor,
void* baton,
apr_pool_t *pool)
{
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, pool));
return svn_fs_fs__dag_try_process_file_contents(success, node,
processor, baton, pool);
}
/* --- End machinery for svn_fs_try_process_file_contents() --- */
/* --- Machinery for svn_fs_apply_textdelta() --- */
/* Local baton type for all the helper functions below. */
typedef struct txdelta_baton_t
{
/* This is the custom-built window consumer given to us by the delta
library; it uniquely knows how to read data from our designated
"source" stream, interpret the window, and write data to our
designated "target" stream (in this case, our repos file.) */
svn_txdelta_window_handler_t interpreter;
void *interpreter_baton;
/* The original file info */
svn_fs_root_t *root;
const char *path;
/* Derived from the file info */
dag_node_t *node;
svn_stream_t *source_stream;
svn_stream_t *target_stream;
/* MD5 digest for the base text against which a delta is to be
applied, and for the resultant fulltext, respectively. Either or
both may be null, in which case ignored. */
svn_checksum_t *base_checksum;
svn_checksum_t *result_checksum;
/* Pool used by db txns */
apr_pool_t *pool;
} txdelta_baton_t;
/* The main window handler returned by svn_fs_apply_textdelta. */
static svn_error_t *
window_consumer(svn_txdelta_window_t *window, void *baton)
{
txdelta_baton_t *tb = (txdelta_baton_t *) baton;
/* Send the window right through to the custom window interpreter.
In theory, the interpreter will then write more data to
cb->target_string. */
SVN_ERR(tb->interpreter(window, tb->interpreter_baton));
/* Is the window NULL? If so, we're done. The stream has already been
closed by the interpreter. */
if (! window)
SVN_ERR(svn_fs_fs__dag_finalize_edits(tb->node, tb->result_checksum,
tb->pool));
return SVN_NO_ERROR;
}
/* Helper function for fs_apply_textdelta. BATON is of type
txdelta_baton_t. */
static svn_error_t *
apply_textdelta(void *baton, apr_pool_t *pool)
{
txdelta_baton_t *tb = (txdelta_baton_t *) baton;
parent_path_t *parent_path;
const svn_fs_fs__id_part_t *txn_id = root_txn_id(tb->root);
/* Call open_path with no flags, as we want this to return an error
if the node for which we are searching doesn't exist. */
SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, TRUE, pool));
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
if (tb->root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(tb->path, tb->root->fs,
FALSE, FALSE, pool));
/* Now, make sure this path is mutable. */
SVN_ERR(make_path_mutable(tb->root, parent_path, tb->path, pool));
tb->node = parent_path->node;
if (tb->base_checksum)
{
svn_checksum_t *checksum;
/* Until we finalize the node, its data_key points to the old
contents, in other words, the base text. */
SVN_ERR(svn_fs_fs__dag_file_checksum(&checksum, tb->node,
tb->base_checksum->kind, pool));
if (!svn_checksum_match(tb->base_checksum, checksum))
return svn_checksum_mismatch_err(tb->base_checksum, checksum, pool,
_("Base checksum mismatch on '%s'"),
tb->path);
}
/* Make a readable "source" stream out of the current contents of
ROOT/PATH; obviously, this must done in the context of a db_txn.
The stream is returned in tb->source_stream. */
SVN_ERR(svn_fs_fs__dag_get_contents(&(tb->source_stream),
tb->node, tb->pool));
/* Make a writable "target" stream */
SVN_ERR(svn_fs_fs__dag_get_edit_stream(&(tb->target_stream), tb->node,
tb->pool));
/* Now, create a custom window handler that uses our two streams. */
svn_txdelta_apply(tb->source_stream,
tb->target_stream,
NULL,
tb->path,
tb->pool,
&(tb->interpreter),
&(tb->interpreter_baton));
/* Make a record of this modification in the changes table. */
return add_change(tb->root->fs, txn_id, tb->path,
svn_fs_fs__dag_get_id(tb->node),
svn_fs_path_change_modify, TRUE, FALSE, FALSE,
svn_node_file, SVN_INVALID_REVNUM, NULL, pool);
}
/* Set *CONTENTS_P and *CONTENTS_BATON_P to a window handler and baton
that will accept text delta windows to modify the contents of PATH
under ROOT. Allocations are in POOL. */
static svn_error_t *
fs_apply_textdelta(svn_txdelta_window_handler_t *contents_p,
void **contents_baton_p,
svn_fs_root_t *root,
const char *path,
svn_checksum_t *base_checksum,
svn_checksum_t *result_checksum,
apr_pool_t *pool)
{
txdelta_baton_t *tb = apr_pcalloc(pool, sizeof(*tb));
tb->root = root;
tb->path = svn_fs__canonicalize_abspath(path, pool);
tb->pool = pool;
tb->base_checksum = svn_checksum_dup(base_checksum, pool);
tb->result_checksum = svn_checksum_dup(result_checksum, pool);
SVN_ERR(apply_textdelta(tb, pool));
*contents_p = window_consumer;
*contents_baton_p = tb;
return SVN_NO_ERROR;
}
/* --- End machinery for svn_fs_apply_textdelta() --- */
/* --- Machinery for svn_fs_apply_text() --- */
/* Baton for svn_fs_apply_text(). */
struct text_baton_t
{
/* The original file info */
svn_fs_root_t *root;
const char *path;
/* Derived from the file info */
dag_node_t *node;
/* The returned stream that will accept the file's new contents. */
svn_stream_t *stream;
/* The actual fs stream that the returned stream will write to. */
svn_stream_t *file_stream;
/* MD5 digest for the final fulltext written to the file. May
be null, in which case ignored. */
svn_checksum_t *result_checksum;
/* Pool used by db txns */
apr_pool_t *pool;
};
/* A wrapper around svn_fs_fs__dag_finalize_edits, but for
* fulltext data, not text deltas. Closes BATON->file_stream.
*
* Note: If you're confused about how this function relates to another
* of similar name, think of it this way:
*
* svn_fs_apply_textdelta() ==> ... ==> txn_body_txdelta_finalize_edits()
* svn_fs_apply_text() ==> ... ==> txn_body_fulltext_finalize_edits()
*/
/* Write function for the publically returned stream. */
static svn_error_t *
text_stream_writer(void *baton,
const char *data,
apr_size_t *len)
{
struct text_baton_t *tb = baton;
/* Psst, here's some data. Pass it on to the -real- file stream. */
return svn_stream_write(tb->file_stream, data, len);
}
/* Close function for the publically returned stream. */
static svn_error_t *
text_stream_closer(void *baton)
{
struct text_baton_t *tb = baton;
/* Close the internal-use stream. ### This used to be inside of
txn_body_fulltext_finalize_edits(), but that invoked a nested
Berkeley DB transaction -- scandalous! */
SVN_ERR(svn_stream_close(tb->file_stream));
/* Need to tell fs that we're done sending text */
return svn_fs_fs__dag_finalize_edits(tb->node, tb->result_checksum,
tb->pool);
}
/* Helper function for fs_apply_text. BATON is of type
text_baton_t. */
static svn_error_t *
apply_text(void *baton, apr_pool_t *pool)
{
struct text_baton_t *tb = baton;
parent_path_t *parent_path;
const svn_fs_fs__id_part_t *txn_id = root_txn_id(tb->root);
/* Call open_path with no flags, as we want this to return an error
if the node for which we are searching doesn't exist. */
SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, TRUE, pool));
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
if (tb->root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
SVN_ERR(svn_fs_fs__allow_locked_operation(tb->path, tb->root->fs,
FALSE, FALSE, pool));
/* Now, make sure this path is mutable. */
SVN_ERR(make_path_mutable(tb->root, parent_path, tb->path, pool));
tb->node = parent_path->node;
/* Make a writable stream for replacing the file's text. */
SVN_ERR(svn_fs_fs__dag_get_edit_stream(&(tb->file_stream), tb->node,
tb->pool));
/* Create a 'returnable' stream which writes to the file_stream. */
tb->stream = svn_stream_create(tb, tb->pool);
svn_stream_set_write(tb->stream, text_stream_writer);
svn_stream_set_close(tb->stream, text_stream_closer);
/* Make a record of this modification in the changes table. */
return add_change(tb->root->fs, txn_id, tb->path,
svn_fs_fs__dag_get_id(tb->node),
svn_fs_path_change_modify, TRUE, FALSE, FALSE,
svn_node_file, SVN_INVALID_REVNUM, NULL, pool);
}
/* Return a writable stream that will set the contents of PATH under
ROOT. RESULT_CHECKSUM is the MD5 checksum of the final result.
Temporary allocations are in POOL. */
static svn_error_t *
fs_apply_text(svn_stream_t **contents_p,
svn_fs_root_t *root,
const char *path,
svn_checksum_t *result_checksum,
apr_pool_t *pool)
{
struct text_baton_t *tb = apr_pcalloc(pool, sizeof(*tb));
tb->root = root;
tb->path = svn_fs__canonicalize_abspath(path, pool);
tb->pool = pool;
tb->result_checksum = svn_checksum_dup(result_checksum, pool);
SVN_ERR(apply_text(tb, pool));
*contents_p = tb->stream;
return SVN_NO_ERROR;
}
/* --- End machinery for svn_fs_apply_text() --- */
/* Check if the contents of PATH1 under ROOT1 are different from the
contents of PATH2 under ROOT2. If they are different set
*CHANGED_P to TRUE, otherwise set it to FALSE. */
static svn_error_t *
fs_contents_changed(svn_boolean_t *changed_p,
svn_fs_root_t *root1,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
svn_boolean_t strict,
apr_pool_t *pool)
{
dag_node_t *node1, *node2;
/* Check that roots are in the same fs. */
if (root1->fs != root2->fs)
return svn_error_create
(SVN_ERR_FS_GENERAL, NULL,
_("Cannot compare file contents between two different filesystems"));
/* Check that both paths are files. */
{
svn_node_kind_t kind;
SVN_ERR(svn_fs_fs__check_path(&kind, root1, path1, pool));
if (kind != svn_node_file)
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL, _("'%s' is not a file"), path1);
SVN_ERR(svn_fs_fs__check_path(&kind, root2, path2, pool));
if (kind != svn_node_file)
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL, _("'%s' is not a file"), path2);
}
SVN_ERR(get_dag(&node1, root1, path1, pool));
SVN_ERR(get_dag(&node2, root2, path2, pool));
return svn_fs_fs__dag_things_different(NULL, changed_p,
node1, node2, strict, pool);
}
/* Public interface to computing file text deltas. */
static svn_error_t *
fs_get_file_delta_stream(svn_txdelta_stream_t **stream_p,
svn_fs_root_t *source_root,
const char *source_path,
svn_fs_root_t *target_root,
const char *target_path,
apr_pool_t *pool)
{
dag_node_t *source_node, *target_node;
if (source_root && source_path)
SVN_ERR(get_dag(&source_node, source_root, source_path, pool));
else
source_node = NULL;
SVN_ERR(get_dag(&target_node, target_root, target_path, pool));
/* Create a delta stream that turns the source into the target. */
return svn_fs_fs__dag_get_file_delta_stream(stream_p, source_node,
target_node, pool);
}
/* Finding Changes */
/* Set *CHANGED_PATHS_P to a newly allocated hash containing
descriptions of the paths changed under ROOT. The hash is keyed
with const char * paths and has svn_fs_path_change2_t * values. Use
POOL for all allocations. */
static svn_error_t *
fs_paths_changed(apr_hash_t **changed_paths_p,
svn_fs_root_t *root,
apr_pool_t *pool)
{
if (root->is_txn_root)
return svn_fs_fs__txn_changes_fetch(changed_paths_p, root->fs,
root_txn_id(root), pool);
else
return svn_fs_fs__paths_changed(changed_paths_p, root->fs, root->rev,
pool);
}
/* Our coolio opaque history object. */
typedef struct fs_history_data_t
{
/* filesystem object */
svn_fs_t *fs;
/* path and revision of historical location */
const char *path;
svn_revnum_t revision;
/* internal-use hints about where to resume the history search. */
const char *path_hint;
svn_revnum_t rev_hint;
/* FALSE until the first call to svn_fs_history_prev(). */
svn_boolean_t is_interesting;
} fs_history_data_t;
static svn_fs_history_t *
assemble_history(svn_fs_t *fs,
const char *path,
svn_revnum_t revision,
svn_boolean_t is_interesting,
const char *path_hint,
svn_revnum_t rev_hint,
apr_pool_t *pool);
/* Set *HISTORY_P to an opaque node history object which represents
PATH under ROOT. ROOT must be a revision root. Use POOL for all
allocations. */
static svn_error_t *
fs_node_history(svn_fs_history_t **history_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_node_kind_t kind;
/* We require a revision root. */
if (root->is_txn_root)
return svn_error_create(SVN_ERR_FS_NOT_REVISION_ROOT, NULL, NULL);
/* And we require that the path exist in the root. */
SVN_ERR(svn_fs_fs__check_path(&kind, root, path, scratch_pool));
if (kind == svn_node_none)
return SVN_FS__NOT_FOUND(root, path);
/* Okay, all seems well. Build our history object and return it. */
*history_p = assemble_history(root->fs, path, root->rev, FALSE, NULL,
SVN_INVALID_REVNUM, result_pool);
return SVN_NO_ERROR;
}
/* Find the youngest copyroot for path PARENT_PATH or its parents in
filesystem FS, and store the copyroot in *REV_P and *PATH_P.
Perform all allocations in POOL. */
static svn_error_t *
find_youngest_copyroot(svn_revnum_t *rev_p,
const char **path_p,
svn_fs_t *fs,
parent_path_t *parent_path,
apr_pool_t *pool)
{
svn_revnum_t rev_mine;
svn_revnum_t rev_parent = SVN_INVALID_REVNUM;
const char *path_mine;
const char *path_parent = NULL;
/* First find our parent's youngest copyroot. */
if (parent_path->parent)
SVN_ERR(find_youngest_copyroot(&rev_parent, &path_parent, fs,
parent_path->parent, pool));
/* Find our copyroot. */
SVN_ERR(svn_fs_fs__dag_get_copyroot(&rev_mine, &path_mine,
parent_path->node));
/* If a parent and child were copied to in the same revision, prefer
the child copy target, since it is the copy relevant to the
history of the child. */
if (rev_mine >= rev_parent)
{
*rev_p = rev_mine;
*path_p = path_mine;
}
else
{
*rev_p = rev_parent;
*path_p = path_parent;
}
return SVN_NO_ERROR;
}
static svn_error_t *fs_closest_copy(svn_fs_root_t **root_p,
const char **path_p,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
svn_fs_t *fs = root->fs;
parent_path_t *parent_path, *copy_dst_parent_path;
svn_revnum_t copy_dst_rev, created_rev;
const char *copy_dst_path;
svn_fs_root_t *copy_dst_root;
dag_node_t *copy_dst_node;
/* Initialize return values. */
*root_p = NULL;
*path_p = NULL;
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, 0, FALSE, pool));
/* Find the youngest copyroot in the path of this node-rev, which
will indicate the target of the innermost copy affecting the
node-rev. */
SVN_ERR(find_youngest_copyroot(&copy_dst_rev, &copy_dst_path,
fs, parent_path, pool));
if (copy_dst_rev == 0) /* There are no copies affecting this node-rev. */
return SVN_NO_ERROR;
/* It is possible that this node was created from scratch at some
revision between COPY_DST_REV and REV. Make sure that PATH
exists as of COPY_DST_REV and is related to this node-rev. */
SVN_ERR(svn_fs_fs__revision_root(&copy_dst_root, fs, copy_dst_rev, pool));
SVN_ERR(open_path(&copy_dst_parent_path, copy_dst_root, path,
open_path_node_only | open_path_allow_null, FALSE, pool));
if (copy_dst_parent_path == NULL)
return SVN_NO_ERROR;
copy_dst_node = copy_dst_parent_path->node;
if (! svn_fs_fs__id_check_related(svn_fs_fs__dag_get_id(copy_dst_node),
svn_fs_fs__dag_get_id(parent_path->node)))
return SVN_NO_ERROR;
/* One final check must be done here. If you copy a directory and
create a new entity somewhere beneath that directory in the same
txn, then we can't claim that the copy affected the new entity.
For example, if you do:
copy dir1 dir2
create dir2/new-thing
commit
then dir2/new-thing was not affected by the copy of dir1 to dir2.
We detect this situation by asking if PATH@COPY_DST_REV's
created-rev is COPY_DST_REV, and that node-revision has no
predecessors, then there is no relevant closest copy.
*/
SVN_ERR(svn_fs_fs__dag_get_revision(&created_rev, copy_dst_node, pool));
if (created_rev == copy_dst_rev)
{
const svn_fs_id_t *pred;
SVN_ERR(svn_fs_fs__dag_get_predecessor_id(&pred, copy_dst_node));
if (! pred)
return SVN_NO_ERROR;
}
/* The copy destination checks out. Return it. */
*root_p = copy_dst_root;
*path_p = copy_dst_path;
return SVN_NO_ERROR;
}
/* Set *PREV_PATH and *PREV_REV to the path and revision which
represent the location at which PATH in FS was located immediately
prior to REVISION iff there was a copy operation (to PATH or one of
its parent directories) between that previous location and
PATH@REVISION.
If there was no such copy operation in that portion of PATH's
history, set *PREV_PATH to NULL and *PREV_REV to SVN_INVALID_REVNUM. */
static svn_error_t *
prev_location(const char **prev_path,
svn_revnum_t *prev_rev,
svn_fs_t *fs,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
const char *copy_path, *copy_src_path, *remainder_path;
svn_fs_root_t *copy_root;
svn_revnum_t copy_src_rev;
/* Ask about the most recent copy which affected PATH@REVISION. If
there was no such copy, we're done. */
SVN_ERR(fs_closest_copy(&copy_root, &copy_path, root, path, pool));
if (! copy_root)
{
*prev_rev = SVN_INVALID_REVNUM;
*prev_path = NULL;
return SVN_NO_ERROR;
}
/* Ultimately, it's not the path of the closest copy's source that
we care about -- it's our own path's location in the copy source
revision. So we'll tack the relative path that expresses the
difference between the copy destination and our path in the copy
revision onto the copy source path to determine this information.
In other words, if our path is "/branches/my-branch/foo/bar", and
we know that the closest relevant copy was a copy of "/trunk" to
"/branches/my-branch", then that relative path under the copy
destination is "/foo/bar". Tacking that onto the copy source
path tells us that our path was located at "/trunk/foo/bar"
before the copy.
*/
SVN_ERR(fs_copied_from(&copy_src_rev, &copy_src_path,
copy_root, copy_path, pool));
remainder_path = svn_fspath__skip_ancestor(copy_path, path);
*prev_path = svn_fspath__join(copy_src_path, remainder_path, pool);
*prev_rev = copy_src_rev;
return SVN_NO_ERROR;
}
static svn_error_t *
fs_node_origin_rev(svn_revnum_t *revision,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
svn_fs_t *fs = root->fs;
const svn_fs_id_t *given_noderev_id, *cached_origin_id;
const svn_fs_fs__id_part_t *node_id;
path = svn_fs__canonicalize_abspath(path, pool);
/* Check the cache first. */
SVN_ERR(svn_fs_fs__node_id(&given_noderev_id, root, path, pool));
node_id = svn_fs_fs__id_node_id(given_noderev_id);
/* Is it a brand new uncommitted node or a new-style node ID?
* (committed old-style nodes will have a 0 revision value;
* rev 0, number 0 is rev 0 root node). Note that != 0 includes
* SVN_INVALID_REVNUM for uncommitted nodes. */
if (node_id->revision != 0 || node_id->number == 0)
{
*revision = node_id->revision;
return SVN_NO_ERROR;
}
/* OK, it's an old-style ID? Maybe it's cached. */
SVN_ERR(svn_fs_fs__get_node_origin(&cached_origin_id,
fs,
node_id,
pool));
if (cached_origin_id != NULL)
{
*revision = svn_fs_fs__id_rev(cached_origin_id);
return SVN_NO_ERROR;
}
{
/* Ah well, the answer isn't in the ID itself or in the cache.
Let's actually calculate it, then. */
svn_fs_root_t *curroot = root;
apr_pool_t *subpool = svn_pool_create(pool);
apr_pool_t *predidpool = svn_pool_create(pool);
svn_stringbuf_t *lastpath = svn_stringbuf_create(path, pool);
svn_revnum_t lastrev = SVN_INVALID_REVNUM;
dag_node_t *node;
const svn_fs_id_t *pred_id;
/* Walk the closest-copy chain back to the first copy in our history.
NOTE: We merely *assume* that this is faster than walking the
predecessor chain, because we *assume* that copies of parent
directories happen less often than modifications to a given item. */
while (1)
{
svn_revnum_t currev;
const char *curpath = lastpath->data;
svn_pool_clear(subpool);
/* Get a root pointing to LASTREV. (The first time around,
LASTREV is invalid, but that's cool because CURROOT is
already initialized.) */
if (SVN_IS_VALID_REVNUM(lastrev))
SVN_ERR(svn_fs_fs__revision_root(&curroot, fs, lastrev, subpool));
/* Find the previous location using the closest-copy shortcut. */
SVN_ERR(prev_location(&curpath, &currev, fs, curroot, curpath,
subpool));
if (! curpath)
break;
/* Update our LASTPATH and LASTREV variables (which survive
SUBPOOL). */
svn_stringbuf_set(lastpath, curpath);
lastrev = currev;
}
/* Walk the predecessor links back to origin. */
SVN_ERR(svn_fs_fs__node_id(&pred_id, curroot, lastpath->data, predidpool));
do
{
svn_pool_clear(subpool);
SVN_ERR(svn_fs_fs__dag_get_node(&node, fs, pred_id, subpool));
/* Why not just fetch the predecessor ID in PREDIDPOOL?
Because svn_fs_fs__dag_get_predecessor_id() doesn't
necessarily honor the passed-in pool, and might return a
value cached in the node (which is allocated in
SUBPOOL... maybe). */
svn_pool_clear(predidpool);
SVN_ERR(svn_fs_fs__dag_get_predecessor_id(&pred_id, node));
pred_id = pred_id ? svn_fs_fs__id_copy(pred_id, predidpool) : NULL;
}
while (pred_id);
/* When we get here, NODE should be the first node-revision in our
chain. */
SVN_ERR(svn_fs_fs__dag_get_revision(revision, node, pool));
/* Wow, I don't want to have to do all that again. Let's cache
the result. */
if (node_id->revision != SVN_INVALID_REVNUM)
SVN_ERR(svn_fs_fs__set_node_origin(fs, node_id,
svn_fs_fs__dag_get_id(node), pool));
svn_pool_destroy(subpool);
svn_pool_destroy(predidpool);
return SVN_NO_ERROR;
}
}
static svn_error_t *
history_prev(svn_fs_history_t **prev_history,
svn_fs_history_t *history,
svn_boolean_t cross_copies,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_history_data_t *fhd = history->fsap_data;
const char *commit_path, *src_path, *path = fhd->path;
svn_revnum_t commit_rev, src_rev, dst_rev;
svn_revnum_t revision = fhd->revision;
svn_fs_t *fs = fhd->fs;
parent_path_t *parent_path;
dag_node_t *node;
svn_fs_root_t *root;
svn_boolean_t reported = fhd->is_interesting;
svn_revnum_t copyroot_rev;
const char *copyroot_path;
/* Initialize our return value. */
*prev_history = NULL;
/* If our last history report left us hints about where to pickup
the chase, then our last report was on the destination of a
copy. If we are crossing copies, start from those locations,
otherwise, we're all done here. */
if (fhd->path_hint && SVN_IS_VALID_REVNUM(fhd->rev_hint))
{
reported = FALSE;
if (! cross_copies)
return SVN_NO_ERROR;
path = fhd->path_hint;
revision = fhd->rev_hint;
}
/* Construct a ROOT for the current revision. */
SVN_ERR(svn_fs_fs__revision_root(&root, fs, revision, scratch_pool));
/* Open PATH/REVISION, and get its node and a bunch of other
goodies. */
SVN_ERR(open_path(&parent_path, root, path, 0, FALSE, scratch_pool));
node = parent_path->node;
commit_path = svn_fs_fs__dag_get_created_path(node);
SVN_ERR(svn_fs_fs__dag_get_revision(&commit_rev, node, scratch_pool));
/* The Subversion filesystem is written in such a way that a given
line of history may have at most one interesting history point
per filesystem revision. Either that node was edited (and
possibly copied), or it was copied but not edited. And a copy
source cannot be from the same revision as its destination. So,
if our history revision matches its node's commit revision, we
know that ... */
if (revision == commit_rev)
{
if (! reported)
{
/* ... we either have not yet reported on this revision (and
need now to do so) ... */
*prev_history = assemble_history(fs, commit_path,
commit_rev, TRUE, NULL,
SVN_INVALID_REVNUM, result_pool);
return SVN_NO_ERROR;
}
else
{
/* ... or we *have* reported on this revision, and must now
progress toward this node's predecessor (unless there is
no predecessor, in which case we're all done!). */
const svn_fs_id_t *pred_id;
SVN_ERR(svn_fs_fs__dag_get_predecessor_id(&pred_id, node));
if (! pred_id)
return SVN_NO_ERROR;
/* Replace NODE and friends with the information from its
predecessor. */
SVN_ERR(svn_fs_fs__dag_get_node(&node, fs, pred_id, scratch_pool));
commit_path = svn_fs_fs__dag_get_created_path(node);
SVN_ERR(svn_fs_fs__dag_get_revision(&commit_rev, node, scratch_pool));
}
}
/* Find the youngest copyroot in the path of this node, including
itself. */
SVN_ERR(find_youngest_copyroot(&copyroot_rev, &copyroot_path, fs,
parent_path, scratch_pool));
/* Initialize some state variables. */
src_path = NULL;
src_rev = SVN_INVALID_REVNUM;
dst_rev = SVN_INVALID_REVNUM;
if (copyroot_rev > commit_rev)
{
const char *remainder_path;
const char *copy_dst, *copy_src;
svn_fs_root_t *copyroot_root;
SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, fs, copyroot_rev,
scratch_pool));
SVN_ERR(get_dag(&node, copyroot_root, copyroot_path, scratch_pool));
copy_dst = svn_fs_fs__dag_get_created_path(node);
/* If our current path was the very destination of the copy,
then our new current path will be the copy source. If our
current path was instead the *child* of the destination of
the copy, then figure out its previous location by taking its
path relative to the copy destination and appending that to
the copy source. Finally, if our current path doesn't meet
one of these other criteria ... ### for now just fallback to
the old copy hunt algorithm. */
remainder_path = svn_fspath__skip_ancestor(copy_dst, path);
if (remainder_path)
{
/* If we get here, then our current path is the destination
of, or the child of the destination of, a copy. Fill
in the return values and get outta here. */
SVN_ERR(svn_fs_fs__dag_get_copyfrom_rev(&src_rev, node));
SVN_ERR(svn_fs_fs__dag_get_copyfrom_path(&copy_src, node));
dst_rev = copyroot_rev;
src_path = svn_fspath__join(copy_src, remainder_path, scratch_pool);
}
}
/* If we calculated a copy source path and revision, we'll make a
'copy-style' history object. */
if (src_path && SVN_IS_VALID_REVNUM(src_rev))
{
svn_boolean_t retry = FALSE;
/* It's possible for us to find a copy location that is the same
as the history point we've just reported. If that happens,
we simply need to take another trip through this history
search. */
if ((dst_rev == revision) && reported)
retry = TRUE;
*prev_history = assemble_history(fs, path, dst_rev, ! retry,
src_path, src_rev, result_pool);
}
else
{
*prev_history = assemble_history(fs, commit_path, commit_rev, TRUE,
NULL, SVN_INVALID_REVNUM, result_pool);
}
return SVN_NO_ERROR;
}
/* Implement svn_fs_history_prev, set *PREV_HISTORY_P to a new
svn_fs_history_t object that represents the predecessory of
HISTORY. If CROSS_COPIES is true, *PREV_HISTORY_P may be related
only through a copy operation. Perform all allocations in POOL. */
static svn_error_t *
fs_history_prev(svn_fs_history_t **prev_history_p,
svn_fs_history_t *history,
svn_boolean_t cross_copies,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_fs_history_t *prev_history = NULL;
fs_history_data_t *fhd = history->fsap_data;
svn_fs_t *fs = fhd->fs;
/* Special case: the root directory changes in every single
revision, no exceptions. And, the root can't be the target (or
child of a target -- duh) of a copy. So, if that's our path,
then we need only decrement our revision by 1, and there you go. */
if (strcmp(fhd->path, "/") == 0)
{
if (! fhd->is_interesting)
prev_history = assemble_history(fs, "/", fhd->revision,
1, NULL, SVN_INVALID_REVNUM,
result_pool);
else if (fhd->revision > 0)
prev_history = assemble_history(fs, "/", fhd->revision - 1,
1, NULL, SVN_INVALID_REVNUM,
result_pool);
}
else
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
prev_history = history;
while (1)
{
svn_pool_clear(iterpool);
SVN_ERR(history_prev(&prev_history, prev_history, cross_copies,
result_pool, iterpool));
if (! prev_history)
break;
fhd = prev_history->fsap_data;
if (fhd->is_interesting)
break;
}
svn_pool_destroy(iterpool);
}
*prev_history_p = prev_history;
return SVN_NO_ERROR;
}
/* Set *PATH and *REVISION to the path and revision for the HISTORY
object. Use POOL for all allocations. */
static svn_error_t *
fs_history_location(const char **path,
svn_revnum_t *revision,
svn_fs_history_t *history,
apr_pool_t *pool)
{
fs_history_data_t *fhd = history->fsap_data;
*path = apr_pstrdup(pool, fhd->path);
*revision = fhd->revision;
return SVN_NO_ERROR;
}
static history_vtable_t history_vtable = {
fs_history_prev,
fs_history_location
};
/* Return a new history object (marked as "interesting") for PATH and
REVISION, allocated in POOL, and with its members set to the values
of the parameters provided. Note that PATH and PATH_HINT get
normalized and duplicated in POOL. */
static svn_fs_history_t *
assemble_history(svn_fs_t *fs,
const char *path,
svn_revnum_t revision,
svn_boolean_t is_interesting,
const char *path_hint,
svn_revnum_t rev_hint,
apr_pool_t *pool)
{
svn_fs_history_t *history = apr_pcalloc(pool, sizeof(*history));
fs_history_data_t *fhd = apr_pcalloc(pool, sizeof(*fhd));
fhd->path = svn_fs__canonicalize_abspath(path, pool);
fhd->revision = revision;
fhd->is_interesting = is_interesting;
fhd->path_hint = path_hint ? svn_fs__canonicalize_abspath(path_hint, pool)
: NULL;
fhd->rev_hint = rev_hint;
fhd->fs = fs;
history->vtable = &history_vtable;
history->fsap_data = fhd;
return history;
}
/* mergeinfo queries */
/* DIR_DAG is a directory DAG node which has mergeinfo in its
descendants. This function iterates over its children. For each
child with immediate mergeinfo, it adds its mergeinfo to
RESULT_CATALOG. appropriate arguments. For each child with
descendants with mergeinfo, it recurses. Note that it does *not*
call the action on the path for DIR_DAG itself.
POOL is used for temporary allocations, including the mergeinfo
hashes passed to actions; RESULT_POOL is used for the mergeinfo added
to RESULT_CATALOG.
*/
static svn_error_t *
crawl_directory_dag_for_mergeinfo(svn_fs_root_t *root,
const char *this_path,
dag_node_t *dir_dag,
svn_mergeinfo_catalog_t result_catalog,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_array_header_t *entries;
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_fs_fs__dag_dir_entries(&entries, dir_dag, scratch_pool));
for (i = 0; i < entries->nelts; ++i)
{
svn_fs_dirent_t *dirent = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
const char *kid_path;
dag_node_t *kid_dag;
svn_boolean_t has_mergeinfo, go_down;
svn_pool_clear(iterpool);
kid_path = svn_fspath__join(this_path, dirent->name, iterpool);
SVN_ERR(get_dag(&kid_dag, root, kid_path, iterpool));
SVN_ERR(svn_fs_fs__dag_has_mergeinfo(&has_mergeinfo, kid_dag));
SVN_ERR(svn_fs_fs__dag_has_descendants_with_mergeinfo(&go_down, kid_dag));
if (has_mergeinfo)
{
/* Save this particular node's mergeinfo. */
apr_hash_t *proplist;
svn_mergeinfo_t kid_mergeinfo;
svn_string_t *mergeinfo_string;
svn_error_t *err;
SVN_ERR(svn_fs_fs__dag_get_proplist(&proplist, kid_dag, iterpool));
mergeinfo_string = svn_hash_gets(proplist, SVN_PROP_MERGEINFO);
if (!mergeinfo_string)
{
svn_string_t *idstr = svn_fs_fs__id_unparse(dirent->id, iterpool);
return svn_error_createf
(SVN_ERR_FS_CORRUPT, NULL,
_("Node-revision #'%s' claims to have mergeinfo but doesn't"),
idstr->data);
}
/* Issue #3896: If a node has syntactically invalid mergeinfo, then
treat it as if no mergeinfo is present rather than raising a parse
error. */
err = svn_mergeinfo_parse(&kid_mergeinfo,
mergeinfo_string->data,
result_pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
svn_error_clear(err);
else
return svn_error_trace(err);
}
else
{
svn_hash_sets(result_catalog, apr_pstrdup(result_pool, kid_path),
kid_mergeinfo);
}
}
if (go_down)
SVN_ERR(crawl_directory_dag_for_mergeinfo(root,
kid_path,
kid_dag,
result_catalog,
result_pool,
iterpool));
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Return the cache key as a combination of REV_ROOT->REV, the inheritance
flags INHERIT and ADJUST_INHERITED_MERGEINFO, and the PATH. The result
will be allocated in POOL..
*/
static const char *
mergeinfo_cache_key(const char *path,
svn_fs_root_t *rev_root,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t adjust_inherited_mergeinfo,
apr_pool_t *pool)
{
apr_int64_t number = rev_root->rev;
number = number * 4
+ (inherit == svn_mergeinfo_nearest_ancestor ? 2 : 0)
+ (adjust_inherited_mergeinfo ? 1 : 0);
return svn_fs_fs__combine_number_and_string(number, path, pool);
}
/* Calculates the mergeinfo for PATH under REV_ROOT using inheritance
type INHERIT. Returns it in *MERGEINFO, or NULL if there is none.
The result is allocated in RESULT_POOL; SCRATCH_POOL is
used for temporary allocations.
*/
static svn_error_t *
get_mergeinfo_for_path_internal(svn_mergeinfo_t *mergeinfo,
svn_fs_root_t *rev_root,
const char *path,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t adjust_inherited_mergeinfo,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
parent_path_t *parent_path, *nearest_ancestor;
apr_hash_t *proplist;
svn_string_t *mergeinfo_string;
path = svn_fs__canonicalize_abspath(path, scratch_pool);
SVN_ERR(open_path(&parent_path, rev_root, path, 0, FALSE, scratch_pool));
if (inherit == svn_mergeinfo_nearest_ancestor && ! parent_path->parent)
return SVN_NO_ERROR;
if (inherit == svn_mergeinfo_nearest_ancestor)
nearest_ancestor = parent_path->parent;
else
nearest_ancestor = parent_path;
while (TRUE)
{
svn_boolean_t has_mergeinfo;
SVN_ERR(svn_fs_fs__dag_has_mergeinfo(&has_mergeinfo,
nearest_ancestor->node));
if (has_mergeinfo)
break;
/* No need to loop if we're looking for explicit mergeinfo. */
if (inherit == svn_mergeinfo_explicit)
{
return SVN_NO_ERROR;
}
nearest_ancestor = nearest_ancestor->parent;
/* Run out? There's no mergeinfo. */
if (!nearest_ancestor)
{
return SVN_NO_ERROR;
}
}
SVN_ERR(svn_fs_fs__dag_get_proplist(&proplist, nearest_ancestor->node,
scratch_pool));
mergeinfo_string = svn_hash_gets(proplist, SVN_PROP_MERGEINFO);
if (!mergeinfo_string)
return svn_error_createf
(SVN_ERR_FS_CORRUPT, NULL,
_("Node-revision '%s@%ld' claims to have mergeinfo but doesn't"),
parent_path_path(nearest_ancestor, scratch_pool), rev_root->rev);
/* Parse the mergeinfo; store the result in *MERGEINFO. */
{
/* Issue #3896: If a node has syntactically invalid mergeinfo, then
treat it as if no mergeinfo is present rather than raising a parse
error. */
svn_error_t *err = svn_mergeinfo_parse(mergeinfo,
mergeinfo_string->data,
result_pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
{
svn_error_clear(err);
err = NULL;
*mergeinfo = NULL;
}
return svn_error_trace(err);
}
}
/* If our nearest ancestor is the very path we inquired about, we
can return the mergeinfo results directly. Otherwise, we're
inheriting the mergeinfo, so we need to a) remove non-inheritable
ranges and b) telescope the merged-from paths. */
if (adjust_inherited_mergeinfo && (nearest_ancestor != parent_path))
{
svn_mergeinfo_t tmp_mergeinfo;
SVN_ERR(svn_mergeinfo_inheritable2(&tmp_mergeinfo, *mergeinfo,
NULL, SVN_INVALID_REVNUM,
SVN_INVALID_REVNUM, TRUE,
scratch_pool, scratch_pool));
SVN_ERR(svn_fs__append_to_merged_froms(mergeinfo, tmp_mergeinfo,
parent_path_relpath(
parent_path, nearest_ancestor,
scratch_pool),
result_pool));
}
return SVN_NO_ERROR;
}
/* Caching wrapper around get_mergeinfo_for_path_internal().
*/
static svn_error_t *
get_mergeinfo_for_path(svn_mergeinfo_t *mergeinfo,
svn_fs_root_t *rev_root,
const char *path,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t adjust_inherited_mergeinfo,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = rev_root->fs->fsap_data;
const char *cache_key;
svn_boolean_t found = FALSE;
svn_stringbuf_t *mergeinfo_exists;
*mergeinfo = NULL;
cache_key = mergeinfo_cache_key(path, rev_root, inherit,
adjust_inherited_mergeinfo, scratch_pool);
if (ffd->mergeinfo_existence_cache)
{
SVN_ERR(svn_cache__get((void **)&mergeinfo_exists, &found,
ffd->mergeinfo_existence_cache,
cache_key, result_pool));
if (found && mergeinfo_exists->data[0] == '1')
SVN_ERR(svn_cache__get((void **)mergeinfo, &found,
ffd->mergeinfo_cache,
cache_key, result_pool));
}
if (! found)
{
SVN_ERR(get_mergeinfo_for_path_internal(mergeinfo, rev_root, path,
inherit,
adjust_inherited_mergeinfo,
result_pool, scratch_pool));
if (ffd->mergeinfo_existence_cache)
{
mergeinfo_exists = svn_stringbuf_create(*mergeinfo ? "1" : "0",
scratch_pool);
SVN_ERR(svn_cache__set(ffd->mergeinfo_existence_cache,
cache_key, mergeinfo_exists, scratch_pool));
if (*mergeinfo)
SVN_ERR(svn_cache__set(ffd->mergeinfo_cache,
cache_key, *mergeinfo, scratch_pool));
}
}
return SVN_NO_ERROR;
}
/* Adds mergeinfo for each descendant of PATH (but not PATH itself)
under ROOT to RESULT_CATALOG. Returned values are allocated in
RESULT_POOL; temporary values in POOL. */
static svn_error_t *
add_descendant_mergeinfo(svn_mergeinfo_catalog_t result_catalog,
svn_fs_root_t *root,
const char *path,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
dag_node_t *this_dag;
svn_boolean_t go_down;
SVN_ERR(get_dag(&this_dag, root, path, scratch_pool));
SVN_ERR(svn_fs_fs__dag_has_descendants_with_mergeinfo(&go_down,
this_dag));
if (go_down)
SVN_ERR(crawl_directory_dag_for_mergeinfo(root,
path,
this_dag,
result_catalog,
result_pool,
scratch_pool));
return SVN_NO_ERROR;
}
/* Get the mergeinfo for a set of paths, returned in
*MERGEINFO_CATALOG. Returned values are allocated in
POOL, while temporary values are allocated in a sub-pool. */
static svn_error_t *
get_mergeinfos_for_paths(svn_fs_root_t *root,
svn_mergeinfo_catalog_t *mergeinfo_catalog,
const apr_array_header_t *paths,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t include_descendants,
svn_boolean_t adjust_inherited_mergeinfo,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_mergeinfo_catalog_t result_catalog = svn_hash__make(result_pool);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
for (i = 0; i < paths->nelts; i++)
{
svn_error_t *err;
svn_mergeinfo_t path_mergeinfo;
const char *path = APR_ARRAY_IDX(paths, i, const char *);
svn_pool_clear(iterpool);
err = get_mergeinfo_for_path(&path_mergeinfo, root, path,
inherit, adjust_inherited_mergeinfo,
result_pool, iterpool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
{
svn_error_clear(err);
err = NULL;
path_mergeinfo = NULL;
}
else
{
return svn_error_trace(err);
}
}
if (path_mergeinfo)
svn_hash_sets(result_catalog, path, path_mergeinfo);
if (include_descendants)
SVN_ERR(add_descendant_mergeinfo(result_catalog, root, path,
result_pool, scratch_pool));
}
svn_pool_destroy(iterpool);
*mergeinfo_catalog = result_catalog;
return SVN_NO_ERROR;
}
/* Implements svn_fs_get_mergeinfo. */
static svn_error_t *
fs_get_mergeinfo(svn_mergeinfo_catalog_t *catalog,
svn_fs_root_t *root,
const apr_array_header_t *paths,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t include_descendants,
svn_boolean_t adjust_inherited_mergeinfo,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = root->fs->fsap_data;
/* We require a revision root. */
if (root->is_txn_root)
return svn_error_create(SVN_ERR_FS_NOT_REVISION_ROOT, NULL, NULL);
/* We have to actually be able to find the mergeinfo metadata! */
if (! svn_fs_fs__fs_supports_mergeinfo(root->fs))
return svn_error_createf
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Querying mergeinfo requires version %d of the FSFS filesystem "
"schema; filesystem '%s' uses only version %d"),
SVN_FS_FS__MIN_MERGEINFO_FORMAT, root->fs->path, ffd->format);
/* Retrieve a path -> mergeinfo hash mapping. */
return get_mergeinfos_for_paths(root, catalog, paths,
inherit,
include_descendants,
adjust_inherited_mergeinfo,
result_pool, scratch_pool);
}
/* The vtable associated with root objects. */
static root_vtable_t root_vtable = {
fs_paths_changed,
svn_fs_fs__check_path,
fs_node_history,
svn_fs_fs__node_id,
fs_node_relation,
svn_fs_fs__node_created_rev,
fs_node_origin_rev,
fs_node_created_path,
fs_delete_node,
fs_copy,
fs_revision_link,
fs_copied_from,
fs_closest_copy,
fs_node_prop,
fs_node_proplist,
fs_node_has_props,
fs_change_node_prop,
fs_props_changed,
fs_dir_entries,
fs_dir_optimal_order,
fs_make_dir,
fs_file_length,
fs_file_checksum,
fs_file_contents,
fs_try_process_file_contents,
fs_make_file,
fs_apply_textdelta,
fs_apply_text,
fs_contents_changed,
fs_get_file_delta_stream,
fs_merge,
fs_get_mergeinfo,
};
/* Construct a new root object in FS, allocated from POOL. */
static svn_fs_root_t *
make_root(svn_fs_t *fs,
apr_pool_t *pool)
{
svn_fs_root_t *root = apr_pcalloc(pool, sizeof(*root));
root->fs = fs;
root->pool = pool;
root->vtable = &root_vtable;
return root;
}
/* Construct a root object referring to the root of REVISION in FS,
whose root directory is ROOT_DIR. Create the new root in POOL. */
static svn_fs_root_t *
make_revision_root(svn_fs_t *fs,
svn_revnum_t rev,
dag_node_t *root_dir,
apr_pool_t *pool)
{
svn_fs_root_t *root = make_root(fs, pool);
root->is_txn_root = FALSE;
root->rev = rev;
root->fsap_data = root_dir;
return root;
}
/* Construct a root object referring to the root of the transaction
named TXN and based on revision BASE_REV in FS, with FLAGS to
describe transaction's behavior. Create the new root in POOL. */
static svn_error_t *
make_txn_root(svn_fs_root_t **root_p,
svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn,
svn_revnum_t base_rev,
apr_uint32_t flags,
apr_pool_t *pool)
{
svn_fs_root_t *root = make_root(fs, pool);
fs_txn_root_data_t *frd = apr_pcalloc(root->pool, sizeof(*frd));
frd->txn_id = *txn;
root->is_txn_root = TRUE;
root->txn = svn_fs_fs__id_txn_unparse(txn, root->pool);
root->txn_flags = flags;
root->rev = base_rev;
/* Because this cache actually tries to invalidate elements, keep
the number of elements per page down.
Note that since dag_node_cache_invalidate uses svn_cache__iter,
this *cannot* be a memcache-based cache. */
SVN_ERR(svn_cache__create_inprocess(&(frd->txn_node_cache),
svn_fs_fs__dag_serialize,
svn_fs_fs__dag_deserialize,
APR_HASH_KEY_STRING,
32, 20, FALSE,
apr_pstrcat(pool, txn, ":TXN",
SVN_VA_NULL),
root->pool));
/* Initialize transaction-local caches in FS.
Note that we cannot put those caches in frd because that content
fs root object is not available where we would need it. */
SVN_ERR(svn_fs_fs__initialize_txn_caches(fs, root->txn, root->pool));
root->fsap_data = frd;
*root_p = root;
return SVN_NO_ERROR;
}
/* Verify. */
static const char *
stringify_node(dag_node_t *node,
apr_pool_t *pool)
{
/* ### TODO: print some PATH@REV to it, too. */
return svn_fs_fs__id_unparse(svn_fs_fs__dag_get_id(node), pool)->data;
}
/* Check metadata sanity on NODE, and on its children. Manually verify
information for DAG nodes in revision REV, and trust the metadata
accuracy for nodes belonging to older revisions. To detect cycles,
provide all parent dag_node_t * in PARENT_NODES. */
static svn_error_t *
verify_node(dag_node_t *node,
svn_revnum_t rev,
apr_array_header_t *parent_nodes,
apr_pool_t *pool)
{
svn_boolean_t has_mergeinfo;
apr_int64_t mergeinfo_count;
const svn_fs_id_t *pred_id;
svn_fs_t *fs = svn_fs_fs__dag_get_fs(node);
int pred_count;
svn_node_kind_t kind;
apr_pool_t *iterpool = svn_pool_create(pool);
int i;
/* Detect (non-)DAG cycles. */
for (i = 0; i < parent_nodes->nelts; ++i)
{
dag_node_t *parent = APR_ARRAY_IDX(parent_nodes, i, dag_node_t *);
if (svn_fs_fs__id_eq(svn_fs_fs__dag_get_id(parent),
svn_fs_fs__dag_get_id(node)))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Node is its own direct or indirect parent '%s'",
stringify_node(node, iterpool));
}
/* Fetch some data. */
SVN_ERR(svn_fs_fs__dag_has_mergeinfo(&has_mergeinfo, node));
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&mergeinfo_count, node));
SVN_ERR(svn_fs_fs__dag_get_predecessor_id(&pred_id, node));
SVN_ERR(svn_fs_fs__dag_get_predecessor_count(&pred_count, node));
kind = svn_fs_fs__dag_node_kind(node);
/* Sanity check. */
if (mergeinfo_count < 0)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Negative mergeinfo-count %" APR_INT64_T_FMT
" on node '%s'",
mergeinfo_count, stringify_node(node, iterpool));
/* Issue #4129. (This check will explicitly catch non-root instances too.) */
if (pred_id)
{
dag_node_t *pred;
int pred_pred_count;
SVN_ERR(svn_fs_fs__dag_get_node(&pred, fs, pred_id, iterpool));
SVN_ERR(svn_fs_fs__dag_get_predecessor_count(&pred_pred_count, pred));
if (pred_pred_count+1 != pred_count)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Predecessor count mismatch: "
"%s has %d, but %s has %d",
stringify_node(node, iterpool), pred_count,
stringify_node(pred, iterpool),
pred_pred_count);
}
/* Kind-dependent verifications. */
if (kind == svn_node_none)
{
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Node '%s' has kind 'none'",
stringify_node(node, iterpool));
}
if (kind == svn_node_file)
{
if (has_mergeinfo != mergeinfo_count) /* comparing int to bool */
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"File node '%s' has inconsistent mergeinfo: "
"has_mergeinfo=%d, "
"mergeinfo_count=%" APR_INT64_T_FMT,
stringify_node(node, iterpool),
has_mergeinfo, mergeinfo_count);
}
if (kind == svn_node_dir)
{
apr_array_header_t *entries;
apr_int64_t children_mergeinfo = 0;
APR_ARRAY_PUSH(parent_nodes, dag_node_t*) = node;
SVN_ERR(svn_fs_fs__dag_dir_entries(&entries, node, pool));
/* Compute CHILDREN_MERGEINFO. */
for (i = 0; i < entries->nelts; ++i)
{
svn_fs_dirent_t *dirent
= APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
dag_node_t *child;
apr_int64_t child_mergeinfo;
svn_pool_clear(iterpool);
/* Compute CHILD_REV. */
if (svn_fs_fs__id_rev(dirent->id) == rev)
{
SVN_ERR(svn_fs_fs__dag_get_node(&child, fs, dirent->id,
iterpool));
SVN_ERR(verify_node(child, rev, parent_nodes, iterpool));
SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&child_mergeinfo,
child));
}
else
{
/* access mergeinfo counter with minimal overhead */
node_revision_t *noderev;
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, dirent->id,
iterpool, iterpool));
child_mergeinfo = noderev->mergeinfo_count;
}
children_mergeinfo += child_mergeinfo;
}
/* Side-effect of issue #4129. */
if (children_mergeinfo+has_mergeinfo != mergeinfo_count)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Mergeinfo-count discrepancy on '%s': "
"expected %" APR_INT64_T_FMT "+%d, "
"counted %" APR_INT64_T_FMT,
stringify_node(node, iterpool),
mergeinfo_count, has_mergeinfo,
children_mergeinfo);
/* If we don't make it here, there was an error / corruption.
* In that case, nobody will need PARENT_NODES anymore. */
apr_array_pop(parent_nodes);
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__verify_root(svn_fs_root_t *root,
apr_pool_t *pool)
{
svn_fs_t *fs = root->fs;
dag_node_t *root_dir;
apr_array_header_t *parent_nodes;
/* Issue #4129: bogus pred-counts and minfo-cnt's on the root node-rev
(and elsewhere). This code makes more thorough checks than the
commit-time checks in validate_root_noderev(). */
/* Callers should disable caches by setting SVN_FS_CONFIG_FSFS_CACHE_NS;
see r1462436.
When this code is called in the library, we want to ensure we
use the on-disk data --- rather than some data that was read
in the possibly-distance past and cached since. */
if (root->is_txn_root)
{
fs_txn_root_data_t *frd = root->fsap_data;
SVN_ERR(svn_fs_fs__dag_txn_root(&root_dir, fs, &frd->txn_id, pool));
}
else
{
root_dir = root->fsap_data;
}
/* Recursively verify ROOT_DIR. */
parent_nodes = apr_array_make(pool, 16, sizeof(dag_node_t *));
SVN_ERR(verify_node(root_dir, root->rev, parent_nodes, pool));
/* Verify explicitly the predecessor of the root. */
{
const svn_fs_id_t *pred_id;
/* Only r0 should have no predecessor. */
SVN_ERR(svn_fs_fs__dag_get_predecessor_id(&pred_id, root_dir));
if (! root->is_txn_root && !!pred_id != !!root->rev)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"r%ld's root node's predecessor is "
"unexpectedly '%s'",
root->rev,
(pred_id
? svn_fs_fs__id_unparse(pred_id, pool)->data
: "(null)"));
if (root->is_txn_root && !pred_id)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Transaction '%s''s root node's predecessor is "
"unexpectedly NULL",
root->txn);
/* Check the predecessor's revision. */
if (pred_id)
{
svn_revnum_t pred_rev = svn_fs_fs__id_rev(pred_id);
if (! root->is_txn_root && pred_rev+1 != root->rev)
/* Issue #4129. */
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"r%ld's root node's predecessor is r%ld"
" but should be r%ld",
root->rev, pred_rev, root->rev - 1);
if (root->is_txn_root && pred_rev != root->rev)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"Transaction '%s''s root node's predecessor"
" is r%ld"
" but should be r%ld",
root->txn, pred_rev, root->rev);
}
}
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_fs_x/rep-cache-db.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_fs_x/rep-cache-db.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_fs_x/rep-cache-db.h (revision 309511)
@@ -1,92 +1,92 @@
-/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_fs_x/token-map.h.
+/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_fs_x/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_CREATE_SCHEMA 0
#define STMT_0_INFO {"STMT_CREATE_SCHEMA", NULL}
#define STMT_0 \
"PRAGMA PAGE_SIZE = 4096; " \
"CREATE TABLE rep_cache ( " \
" hash TEXT NOT NULL PRIMARY KEY, " \
" revision INTEGER NOT NULL, " \
" offset INTEGER NOT NULL, " \
" size INTEGER NOT NULL, " \
" expanded_size INTEGER NOT NULL " \
" ); " \
"PRAGMA USER_VERSION = 1; " \
""
#define STMT_GET_REP 1
#define STMT_1_INFO {"STMT_GET_REP", NULL}
#define STMT_1 \
"SELECT revision, offset, size, expanded_size " \
"FROM rep_cache " \
"WHERE hash = ?1 " \
""
#define STMT_SET_REP 2
#define STMT_2_INFO {"STMT_SET_REP", NULL}
#define STMT_2 \
"INSERT OR FAIL INTO rep_cache (hash, revision, offset, size, expanded_size) " \
"VALUES (?1, ?2, ?3, ?4, ?5) " \
""
#define STMT_GET_REPS_FOR_RANGE 3
#define STMT_3_INFO {"STMT_GET_REPS_FOR_RANGE", NULL}
#define STMT_3 \
"SELECT hash, revision, offset, size, expanded_size " \
"FROM rep_cache " \
"WHERE revision >= ?1 AND revision <= ?2 " \
""
#define STMT_GET_MAX_REV 4
#define STMT_4_INFO {"STMT_GET_MAX_REV", NULL}
#define STMT_4 \
"SELECT MAX(revision) " \
"FROM rep_cache " \
""
#define STMT_DEL_REPS_YOUNGER_THAN_REV 5
#define STMT_5_INFO {"STMT_DEL_REPS_YOUNGER_THAN_REV", NULL}
#define STMT_5 \
"DELETE FROM rep_cache " \
"WHERE revision > ?1 " \
""
#define STMT_LOCK_REP 6
#define STMT_6_INFO {"STMT_LOCK_REP", NULL}
#define STMT_6 \
"BEGIN TRANSACTION; " \
"INSERT INTO rep_cache VALUES ('dummy', 0, 0, 0, 0) " \
""
#define STMT_UNLOCK_REP 7
#define STMT_7_INFO {"STMT_UNLOCK_REP", NULL}
#define STMT_7 \
"ROLLBACK TRANSACTION; " \
""
#define REP_CACHE_DB_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
STMT_1, \
STMT_2, \
STMT_3, \
STMT_4, \
STMT_5, \
STMT_6, \
STMT_7, \
NULL \
}
#define REP_CACHE_DB_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
STMT_1_INFO, \
STMT_2_INFO, \
STMT_3_INFO, \
STMT_4_INFO, \
STMT_5_INFO, \
STMT_6_INFO, \
STMT_7_INFO, \
{NULL, NULL} \
}
Index: stable/11/contrib/subversion/subversion/libsvn_ra_serf/xml.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_ra_serf/xml.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_ra_serf/xml.c (revision 309511)
@@ -1,1111 +1,1141 @@
/*
* xml.c : standard XML parsing routines for ra_serf
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <apr_uri.h>
#include <expat.h>
#include <serf.h>
#include "svn_hash.h"
#include "svn_pools.h"
#include "svn_ra.h"
#include "svn_dav.h"
#include "svn_xml.h"
#include "../libsvn_ra/ra_loader.h"
#include "svn_config.h"
#include "svn_delta.h"
#include "svn_path.h"
#include "svn_private_config.h"
#include "private/svn_string_private.h"
#include "ra_serf.h"
/* Fix for older expat 1.95.x's that do not define
* XML_STATUS_OK/XML_STATUS_ERROR
*/
#ifndef XML_STATUS_OK
#define XML_STATUS_OK 1
#define XML_STATUS_ERROR 0
#endif
#ifndef XML_VERSION_AT_LEAST
#define XML_VERSION_AT_LEAST(major,minor,patch) \
(((major) < XML_MAJOR_VERSION) \
|| ((major) == XML_MAJOR_VERSION && (minor) < XML_MINOR_VERSION) \
|| ((major) == XML_MAJOR_VERSION && (minor) == XML_MINOR_VERSION && \
(patch) <= XML_MICRO_VERSION))
#endif /* XML_VERSION_AT_LEAST */
/* Read/write chunks of this size into the spillbuf. */
#define PARSE_CHUNK_SIZE 8000
struct svn_ra_serf__xml_context_t {
/* Current state information. */
svn_ra_serf__xml_estate_t *current;
/* If WAITING >= then we are waiting for an element to close before
resuming events. The number stored here is the amount of nested
elements open. The Xml parser will make sure the document is well
formed. */
int waiting;
/* The transition table. */
const svn_ra_serf__xml_transition_t *ttable;
/* The callback information. */
svn_ra_serf__xml_opened_t opened_cb;
svn_ra_serf__xml_closed_t closed_cb;
svn_ra_serf__xml_cdata_t cdata_cb;
void *baton;
/* Linked list of free states. */
svn_ra_serf__xml_estate_t *free_states;
#ifdef SVN_DEBUG
/* Used to verify we are not re-entering a callback, specifically to
ensure SCRATCH_POOL is not cleared while an outer callback is
trying to use it. */
svn_boolean_t within_callback;
#define START_CALLBACK(xmlctx) \
do { \
svn_ra_serf__xml_context_t *xmlctx__tmp = (xmlctx); \
SVN_ERR_ASSERT(!xmlctx__tmp->within_callback); \
xmlctx__tmp->within_callback = TRUE; \
} while (0)
#define END_CALLBACK(xmlctx) ((xmlctx)->within_callback = FALSE)
#else
#define START_CALLBACK(xmlctx) /* empty */
#define END_CALLBACK(xmlctx) /* empty */
#endif /* SVN_DEBUG */
apr_pool_t *scratch_pool;
};
/* Structure which represents an XML namespace. */
typedef struct svn_ra_serf__ns_t {
/* The assigned name. */
const char *xmlns;
/* The full URL for this namespace. */
const char *url;
/* The next namespace in our list. */
struct svn_ra_serf__ns_t *next;
} svn_ra_serf__ns_t;
struct svn_ra_serf__xml_estate_t {
/* The current state value. */
int state;
/* The xml tag that opened this state. Waiting for the tag to close. */
svn_ra_serf__dav_props_t tag;
/* Should the CLOSED_CB function be called for custom processing when
this tag is closed? */
svn_boolean_t custom_close;
/* A pool may be constructed for this state. */
apr_pool_t *state_pool;
/* The namespaces extent for this state/element. This will start with
the parent's NS_LIST, and we will push new namespaces into our
local list. The parent will be unaffected by our locally-scoped data. */
svn_ra_serf__ns_t *ns_list;
/* Any collected attribute values. char * -> svn_string_t *. May be NULL
if no attributes have been collected. */
apr_hash_t *attrs;
/* Any collected cdata. May be NULL if no cdata is being collected. */
svn_stringbuf_t *cdata;
/* Previous/outer state. */
svn_ra_serf__xml_estate_t *prev;
};
struct expat_ctx_t {
svn_ra_serf__xml_context_t *xmlctx;
XML_Parser parser;
svn_ra_serf__handler_t *handler;
const int *expected_status;
svn_error_t *inner_error;
/* Do not use this pool for allocation. It is merely recorded for running
the cleanup handler. */
apr_pool_t *cleanup_pool;
};
static void
define_namespaces(svn_ra_serf__ns_t **ns_list,
const char *const *attrs,
apr_pool_t *(*get_pool)(void *baton),
void *baton)
{
const char *const *tmp_attrs = attrs;
for (tmp_attrs = attrs; *tmp_attrs != NULL; tmp_attrs += 2)
{
if (strncmp(*tmp_attrs, "xmlns", 5) == 0)
{
const svn_ra_serf__ns_t *cur_ns;
svn_boolean_t found = FALSE;
const char *prefix;
/* The empty prefix, or a named-prefix. */
if (tmp_attrs[0][5] == ':')
prefix = &tmp_attrs[0][6];
else
prefix = "";
/* Have we already defined this ns previously? */
for (cur_ns = *ns_list; cur_ns; cur_ns = cur_ns->next)
{
if (strcmp(cur_ns->xmlns, prefix) == 0)
{
found = TRUE;
break;
}
}
if (!found)
{
apr_pool_t *pool;
svn_ra_serf__ns_t *new_ns;
if (get_pool)
pool = get_pool(baton);
else
pool = baton;
new_ns = apr_palloc(pool, sizeof(*new_ns));
new_ns->xmlns = apr_pstrdup(pool, prefix);
new_ns->url = apr_pstrdup(pool, tmp_attrs[1]);
/* Push into the front of NS_LIST. Parent states will point
to later in the chain, so will be unaffected by
shadowing/other namespaces pushed onto NS_LIST. */
new_ns->next = *ns_list;
*ns_list = new_ns;
}
}
}
}
/*
* Look up @a name in the @a ns_list list for previously declared namespace
* definitions.
*
* Return (in @a *returned_prop_name) a #svn_ra_serf__dav_props_t tuple
* representing the expanded name.
*/
static void
expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
const svn_ra_serf__ns_t *ns_list,
const char *name)
{
const char *colon;
colon = strchr(name, ':');
if (colon)
{
const svn_ra_serf__ns_t *ns;
for (ns = ns_list; ns; ns = ns->next)
{
if (strncmp(ns->xmlns, name, colon - name) == 0)
{
returned_prop_name->xmlns = ns->url;
returned_prop_name->name = colon + 1;
return;
}
}
}
else
{
const svn_ra_serf__ns_t *ns;
for (ns = ns_list; ns; ns = ns->next)
{
if (! ns->xmlns[0])
{
returned_prop_name->xmlns = ns->url;
returned_prop_name->name = name;
return;
}
}
}
/* If the prefix is not found, then the name is NOT within a
namespace. */
returned_prop_name->xmlns = "";
returned_prop_name->name = name;
}
#define XML_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
void
svn_ra_serf__add_xml_header_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc)
{
serf_bucket_t *tmp;
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(XML_HEADER, sizeof(XML_HEADER) - 1,
bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
}
void
svn_ra_serf__add_open_tag_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *tag, ...)
{
va_list ap;
const char *key;
serf_bucket_t *tmp;
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(tag, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
va_start(ap, tag);
while ((key = va_arg(ap, char *)) != NULL)
{
const char *val = va_arg(ap, const char *);
if (val)
{
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" ", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(key, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("=\"", 2, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(val, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
}
}
va_end(ap);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(">", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
}
void
svn_ra_serf__add_empty_tag_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *tag, ...)
{
va_list ap;
const char *key;
serf_bucket_t *tmp;
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(tag, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
va_start(ap, tag);
while ((key = va_arg(ap, char *)) != NULL)
{
const char *val = va_arg(ap, const char *);
if (val)
{
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" ", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(key, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("=\"", 2, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(val, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
}
}
va_end(ap);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("/>", 2, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
}
void
svn_ra_serf__add_close_tag_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *tag)
{
serf_bucket_t *tmp;
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</", 2, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING(tag, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(">", 1, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp);
}
void
svn_ra_serf__add_cdata_len_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *data, apr_size_t len)
{
const char *end = data + len;
const char *p = data, *q;
serf_bucket_t *tmp_bkt;
while (1)
{
/* Find a character which needs to be quoted and append bytes up
to that point. Strictly speaking, '>' only needs to be
quoted if it follows "]]", but it's easier to quote it all
the time.
So, why are we escaping '\r' here? Well, according to the
XML spec, '\r\n' gets converted to '\n' during XML parsing.
Also, any '\r' not followed by '\n' is converted to '\n'. By
golly, if we say we want to escape a '\r', we want to make
sure it remains a '\r'! */
q = p;
while (q < end && *q != '&' && *q != '<' && *q != '>' && *q != '\r')
q++;
tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(p, q - p, bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp_bkt);
/* We may already be a winner. */
if (q == end)
break;
/* Append the entity reference for the character. */
if (*q == '&')
{
tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN("&amp;", sizeof("&amp;") - 1,
bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp_bkt);
}
else if (*q == '<')
{
tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN("&lt;", sizeof("&lt;") - 1,
bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp_bkt);
}
else if (*q == '>')
{
tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN("&gt;", sizeof("&gt;") - 1,
bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp_bkt);
}
else if (*q == '\r')
{
tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN("&#13;", sizeof("&#13;") - 1,
bkt_alloc);
serf_bucket_aggregate_append(agg_bucket, tmp_bkt);
}
p = q + 1;
}
}
void svn_ra_serf__add_tag_buckets(serf_bucket_t *agg_bucket, const char *tag,
const char *value,
serf_bucket_alloc_t *bkt_alloc)
{
svn_ra_serf__add_open_tag_buckets(agg_bucket, bkt_alloc, tag, SVN_VA_NULL);
if (value)
{
svn_ra_serf__add_cdata_len_buckets(agg_bucket, bkt_alloc,
value, strlen(value));
}
svn_ra_serf__add_close_tag_buckets(agg_bucket, bkt_alloc, tag);
}
/* Return a pool for XES to use for self-alloc (and other specifics). */
static apr_pool_t *
xes_pool(const svn_ra_serf__xml_estate_t *xes)
{
/* Move up through parent states looking for one with a pool. This
will always terminate since the initial state has a pool. */
while (xes->state_pool == NULL)
xes = xes->prev;
return xes->state_pool;
}
static void
ensure_pool(svn_ra_serf__xml_estate_t *xes)
{
if (xes->state_pool == NULL)
xes->state_pool = svn_pool_create(xes_pool(xes));
}
/* This callback is used by define_namespaces() to wait until a pool is
required before constructing it. */
static apr_pool_t *
lazy_create_pool(void *baton)
{
svn_ra_serf__xml_estate_t *xes = baton;
ensure_pool(xes);
return xes->state_pool;
}
svn_error_t *
svn_ra_serf__xml_context_done(svn_ra_serf__xml_context_t *xmlctx)
{
if (xmlctx->current->prev)
{
/* Probably unreachable as this would be an xml parser error */
return svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
_("XML stream truncated: closing '%s' missing"),
xmlctx->current->tag.name);
}
else if (! xmlctx->free_states)
{
/* If we have no items on the free_states list, we didn't push anything,
which tells us that we found an empty xml body */
const svn_ra_serf__xml_transition_t *scan;
const svn_ra_serf__xml_transition_t *document = NULL;
const char *msg;
for (scan = xmlctx->ttable; scan->ns != NULL; ++scan)
{
if (scan->from_state == XML_STATE_INITIAL)
{
if (document != NULL)
{
document = NULL; /* Multiple document elements defined */
break;
}
document = scan;
}
}
if (document)
msg = apr_psprintf(xmlctx->scratch_pool, "'%s' element not found",
document->name);
else
msg = _("document element not found");
return svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
_("XML stream truncated: %s"),
msg);
}
svn_pool_destroy(xmlctx->scratch_pool);
return SVN_NO_ERROR;
}
svn_ra_serf__xml_context_t *
svn_ra_serf__xml_context_create(
const svn_ra_serf__xml_transition_t *ttable,
svn_ra_serf__xml_opened_t opened_cb,
svn_ra_serf__xml_closed_t closed_cb,
svn_ra_serf__xml_cdata_t cdata_cb,
void *baton,
apr_pool_t *result_pool)
{
svn_ra_serf__xml_context_t *xmlctx;
svn_ra_serf__xml_estate_t *xes;
xmlctx = apr_pcalloc(result_pool, sizeof(*xmlctx));
xmlctx->ttable = ttable;
xmlctx->opened_cb = opened_cb;
xmlctx->closed_cb = closed_cb;
xmlctx->cdata_cb = cdata_cb;
xmlctx->baton = baton;
xmlctx->scratch_pool = svn_pool_create(result_pool);
xes = apr_pcalloc(result_pool, sizeof(*xes));
/* XES->STATE == 0 */
/* Child states may use this pool to allocate themselves. If a child
needs to collect information, then it will construct a subpool and
will use that to allocate itself and its collected data. */
xes->state_pool = result_pool;
xmlctx->current = xes;
return xmlctx;
}
apr_hash_t *
svn_ra_serf__xml_gather_since(svn_ra_serf__xml_estate_t *xes,
int stop_state)
{
apr_hash_t *data;
apr_pool_t *pool;
ensure_pool(xes);
pool = xes->state_pool;
data = apr_hash_make(pool);
for (; xes != NULL; xes = xes->prev)
{
if (xes->attrs != NULL)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(pool, xes->attrs); hi;
hi = apr_hash_next(hi))
{
const void *key;
apr_ssize_t klen;
void *val;
/* Parent name/value lifetimes are at least as long as POOL. */
apr_hash_this(hi, &key, &klen, &val);
apr_hash_set(data, key, klen, val);
}
}
if (xes->state == stop_state)
break;
}
return data;
}
void
svn_ra_serf__xml_note(svn_ra_serf__xml_estate_t *xes,
int state,
const char *name,
const char *value)
{
svn_ra_serf__xml_estate_t *scan;
for (scan = xes; scan != NULL && scan->state != state; scan = scan->prev)
/* pass */ ;
SVN_ERR_ASSERT_NO_RETURN(scan != NULL);
/* Make sure the target state has a pool. */
ensure_pool(scan);
/* ... and attribute storage. */
if (scan->attrs == NULL)
scan->attrs = apr_hash_make(scan->state_pool);
/* In all likelihood, NAME is a string constant. But we can't really
be sure. And it isn't like we're storing a billion of these into
the state pool. */
svn_hash_sets(scan->attrs,
apr_pstrdup(scan->state_pool, name),
apr_pstrdup(scan->state_pool, value));
}
apr_pool_t *
svn_ra_serf__xml_state_pool(svn_ra_serf__xml_estate_t *xes)
{
/* If they asked for a pool, then ensure that we have one to provide. */
ensure_pool(xes);
return xes->state_pool;
}
static svn_error_t *
xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
const char *raw_name,
const char *const *attrs)
{
svn_ra_serf__xml_estate_t *current = xmlctx->current;
svn_ra_serf__dav_props_t elemname;
const svn_ra_serf__xml_transition_t *scan;
apr_pool_t *new_pool;
svn_ra_serf__xml_estate_t *new_xes;
/* If we're waiting for an element to close, then just ignore all
other element-opens. */
if (xmlctx->waiting > 0)
{
xmlctx->waiting++;
return SVN_NO_ERROR;
}
/* Look for xmlns: attributes. Lazily create the state pool if any
were found. */
define_namespaces(&current->ns_list, attrs, lazy_create_pool, current);
expand_ns(&elemname, current->ns_list, raw_name);
for (scan = xmlctx->ttable; scan->ns != NULL; ++scan)
{
if (scan->from_state != current->state)
continue;
/* Wildcard tag match. */
if (*scan->name == '*')
break;
/* Found a specific transition. */
if (strcmp(elemname.name, scan->name) == 0
&& strcmp(elemname.xmlns, scan->ns) == 0)
break;
}
if (scan->ns == NULL)
{
if (current->state == XML_STATE_INITIAL)
{
return svn_error_createf(
SVN_ERR_XML_UNEXPECTED_ELEMENT, NULL,
_("XML Parsing failed: Unexpected root element '%s'"),
elemname.name);
}
xmlctx->waiting++; /* Start waiting for the close tag */
return SVN_NO_ERROR;
}
/* We should not be told to collect cdata if the closed_cb will not
be called. */
SVN_ERR_ASSERT(!scan->collect_cdata || scan->custom_close);
/* Found a transition. Make it happen. */
/* ### todo. push state */
/* ### how to use free states? */
/* This state should be allocated in the extent pool. If we will be
collecting information for this state, then construct a subpool.
### potentially optimize away the subpool if none of the
### attributes are present. subpools are cheap, tho... */
new_pool = xes_pool(current);
if (scan->collect_cdata || scan->collect_attrs[0])
{
new_pool = svn_pool_create(new_pool);
/* Prep the new state. */
new_xes = apr_pcalloc(new_pool, sizeof(*new_xes));
new_xes->state_pool = new_pool;
/* If we're supposed to collect cdata, then set up a buffer for
this. The existence of this buffer will instruct our cdata
callback to collect the cdata. */
if (scan->collect_cdata)
new_xes->cdata = svn_stringbuf_create_empty(new_pool);
if (scan->collect_attrs[0] != NULL)
{
const char *const *saveattr = &scan->collect_attrs[0];
new_xes->attrs = apr_hash_make(new_pool);
for (; *saveattr != NULL; ++saveattr)
{
const char *name;
const char *value;
if (**saveattr == '?')
{
name = *saveattr + 1;
value = svn_xml_get_attr_value(name, attrs);
}
else
{
name = *saveattr;
value = svn_xml_get_attr_value(name, attrs);
if (value == NULL)
return svn_error_createf(
SVN_ERR_XML_ATTRIB_NOT_FOUND,
NULL,
_("Missing XML attribute '%s' on '%s' element"),
name, scan->name);
}
if (value)
svn_hash_sets(new_xes->attrs, name,
apr_pstrdup(new_pool, value));
}
}
}
else
{
/* Prep the new state. */
new_xes = apr_pcalloc(new_pool, sizeof(*new_xes));
/* STATE_POOL remains NULL. */
}
/* Some basic copies to set up the new estate. */
new_xes->state = scan->to_state;
new_xes->tag.name = apr_pstrdup(new_pool, elemname.name);
new_xes->tag.xmlns = apr_pstrdup(new_pool, elemname.xmlns);
new_xes->custom_close = scan->custom_close;
/* Start with the parent's namespace set. */
new_xes->ns_list = current->ns_list;
/* The new state is prepared. Make it current. */
new_xes->prev = current;
xmlctx->current = new_xes;
if (xmlctx->opened_cb)
{
START_CALLBACK(xmlctx);
SVN_ERR(xmlctx->opened_cb(new_xes, xmlctx->baton,
new_xes->state, &new_xes->tag,
xmlctx->scratch_pool));
END_CALLBACK(xmlctx);
svn_pool_clear(xmlctx->scratch_pool);
}
return SVN_NO_ERROR;
}
static svn_error_t *
xml_cb_end(svn_ra_serf__xml_context_t *xmlctx,
const char *raw_name)
{
svn_ra_serf__xml_estate_t *xes = xmlctx->current;
if (xmlctx->waiting > 0)
{
xmlctx->waiting--;
return SVN_NO_ERROR;
}
if (xes->custom_close)
{
const svn_string_t *cdata;
if (xes->cdata)
{
cdata = svn_stringbuf__morph_into_string(xes->cdata);
#ifdef SVN_DEBUG
/* We might toss the pool holding this structure, but it could also
be within a parent pool. In any case, for safety's sake, disable
the stringbuf against future Badness. */
xes->cdata->pool = NULL;
#endif
}
else
cdata = NULL;
START_CALLBACK(xmlctx);
SVN_ERR(xmlctx->closed_cb(xes, xmlctx->baton, xes->state,
cdata, xes->attrs,
xmlctx->scratch_pool));
END_CALLBACK(xmlctx);
svn_pool_clear(xmlctx->scratch_pool);
}
/* Pop the state. */
xmlctx->current = xes->prev;
/* ### not everything should go on the free state list. XES may go
### away with the state pool. */
xes->prev = xmlctx->free_states;
xmlctx->free_states = xes;
/* If there is a STATE_POOL, then toss it. This will get rid of as much
memory as possible. Potentially the XES (if we didn't create a pool
right away, then XES may be in a parent pool). */
if (xes->state_pool)
svn_pool_destroy(xes->state_pool);
return SVN_NO_ERROR;
}
static svn_error_t *
xml_cb_cdata(svn_ra_serf__xml_context_t *xmlctx,
const char *data,
apr_size_t len)
{
/* If we are waiting for a closing tag, then we are uninterested in
the cdata. Just return. */
if (xmlctx->waiting > 0)
return SVN_NO_ERROR;
/* If the current state is collecting cdata, then copy the cdata. */
if (xmlctx->current->cdata != NULL)
{
svn_stringbuf_appendbytes(xmlctx->current->cdata, data, len);
}
/* ... else if a CDATA_CB has been supplied, then invoke it for
all states. */
else if (xmlctx->cdata_cb != NULL)
{
START_CALLBACK(xmlctx);
SVN_ERR(xmlctx->cdata_cb(xmlctx->current,
xmlctx->baton,
xmlctx->current->state,
data, len,
xmlctx->scratch_pool));
END_CALLBACK(xmlctx);
svn_pool_clear(xmlctx->scratch_pool);
}
return SVN_NO_ERROR;
}
/* svn_error_t * wrapper around XML_Parse */
static APR_INLINE svn_error_t *
parse_xml(struct expat_ctx_t *ectx, const char *data, apr_size_t len, svn_boolean_t is_final)
{
int xml_status = XML_Parse(ectx->parser, data, (int)len, is_final);
const char *msg;
int xml_code;
if (xml_status == XML_STATUS_OK)
return ectx->inner_error;
xml_code = XML_GetErrorCode(ectx->parser);
#if XML_VERSION_AT_LEAST(1, 95, 8)
/* If we called XML_StopParser() expat will return an abort error. If we
have a better error stored we should ignore it as it will not help
the end-user to store it in the error chain. */
if (xml_code == XML_ERROR_ABORTED && ectx->inner_error)
return ectx->inner_error;
#endif
msg = XML_ErrorString(xml_code);
return svn_error_compose_create(
ectx->inner_error,
svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA,
svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
_("Malformed XML: %s"),
msg),
_("The XML response contains invalid XML")));
}
/* Apr pool cleanup handler to release an XML_Parser in success and error
conditions */
static apr_status_t
xml_parser_cleanup(void *baton)
{
XML_Parser *xmlp = baton;
if (*xmlp)
{
(void) XML_ParserFree(*xmlp);
*xmlp = NULL;
}
return APR_SUCCESS;
}
/* Conforms to Expat's XML_StartElementHandler */
static void
expat_start(void *userData, const char *raw_name, const char **attrs)
{
struct expat_ctx_t *ectx = userData;
if (ectx->inner_error != NULL)
return;
ectx->inner_error = svn_error_trace(xml_cb_start(ectx->xmlctx,
raw_name, attrs));
#if XML_VERSION_AT_LEAST(1, 95, 8)
if (ectx->inner_error)
(void) XML_StopParser(ectx->parser, 0 /* resumable */);
#endif
}
/* Conforms to Expat's XML_EndElementHandler */
static void
expat_end(void *userData, const char *raw_name)
{
struct expat_ctx_t *ectx = userData;
if (ectx->inner_error != NULL)
return;
ectx->inner_error = svn_error_trace(xml_cb_end(ectx->xmlctx, raw_name));
#if XML_VERSION_AT_LEAST(1, 95, 8)
if (ectx->inner_error)
(void) XML_StopParser(ectx->parser, 0 /* resumable */);
#endif
}
/* Conforms to Expat's XML_CharacterDataHandler */
static void
expat_cdata(void *userData, const char *data, int len)
{
struct expat_ctx_t *ectx = userData;
if (ectx->inner_error != NULL)
return;
ectx->inner_error = svn_error_trace(xml_cb_cdata(ectx->xmlctx, data, len));
#if XML_VERSION_AT_LEAST(1, 95, 8)
if (ectx->inner_error)
(void) XML_StopParser(ectx->parser, 0 /* resumable */);
#endif
}
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+static void
+expat_entity_declaration(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity,
+ const XML_Char *value,
+ int value_length,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName)
+{
+ struct expat_ctx_t *ectx = userData;
+ /* Stop the parser if an entity declaration is hit. */
+ XML_StopParser(ectx->parser, 0 /* resumable */);
+}
+#else
+/* A noop default_handler. */
+static void
+expat_default_handler(void *userData, const XML_Char *s, int len)
+{
+}
+#endif
+
/* Implements svn_ra_serf__response_handler_t */
static svn_error_t *
expat_response_handler(serf_request_t *request,
serf_bucket_t *response,
void *baton,
apr_pool_t *scratch_pool)
{
struct expat_ctx_t *ectx = baton;
svn_boolean_t got_expected_status;
if (ectx->expected_status)
{
const int *status = ectx->expected_status;
got_expected_status = FALSE;
while (*status && ectx->handler->sline.code != *status)
status++;
got_expected_status = (*status) != 0;
}
else
got_expected_status = (ectx->handler->sline.code == 200);
if (!ectx->handler->server_error
&& ((ectx->handler->sline.code < 200) || (ectx->handler->sline.code >= 300)
|| ! got_expected_status))
{
/* By deferring to expect_empty_body(), it will make a choice on
how to handle the body. Whatever the decision, the core handler
will take over, and we will not be called again. */
/* ### This handles xml bodies as svn-errors (returned via serf context
### loop), but ignores non-xml errors.
Current code depends on this behavior and checks itself while other
continues, and then verifies if work has been performed.
### TODO: Make error checking consistent */
/* ### If !GOT_EXPECTED_STATUS, this should always produce an error */
return svn_error_trace(svn_ra_serf__expect_empty_body(
request, response, ectx->handler,
scratch_pool));
}
if (!ectx->parser)
{
ectx->parser = XML_ParserCreate(NULL);
apr_pool_cleanup_register(ectx->cleanup_pool, &ectx->parser,
xml_parser_cleanup, apr_pool_cleanup_null);
XML_SetUserData(ectx->parser, ectx);
XML_SetElementHandler(ectx->parser, expat_start, expat_end);
XML_SetCharacterDataHandler(ectx->parser, expat_cdata);
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ XML_SetEntityDeclHandler(ectx->parser, expat_entity_declaration);
+#else
+ XML_SetDefaultHandler(ectx->parser, expat_default_handler);
+#endif
}
while (1)
{
apr_status_t status;
const char *data;
apr_size_t len;
svn_error_t *err;
svn_boolean_t at_eof = FALSE;
status = serf_bucket_read(response, PARSE_CHUNK_SIZE, &data, &len);
if (SERF_BUCKET_READ_ERROR(status))
return svn_ra_serf__wrap_err(status, NULL);
else if (APR_STATUS_IS_EOF(status))
at_eof = TRUE;
err = parse_xml(ectx, data, len, at_eof /* isFinal */);
if (at_eof || err)
{
/* Release xml parser state/tables. */
apr_pool_cleanup_run(ectx->cleanup_pool, &ectx->parser,
xml_parser_cleanup);
}
SVN_ERR(err);
/* The parsing went fine. What has the bucket told us? */
if (at_eof)
{
/* Make sure we actually got xml and clean up after parsing */
SVN_ERR(svn_ra_serf__xml_context_done(ectx->xmlctx));
}
if (status && !SERF_BUCKET_READ_ERROR(status))
{
return svn_ra_serf__wrap_err(status, NULL);
}
}
/* NOTREACHED */
}
svn_ra_serf__handler_t *
svn_ra_serf__create_expat_handler(svn_ra_serf__session_t *session,
svn_ra_serf__xml_context_t *xmlctx,
const int *expected_status,
apr_pool_t *result_pool)
{
svn_ra_serf__handler_t *handler;
struct expat_ctx_t *ectx;
ectx = apr_pcalloc(result_pool, sizeof(*ectx));
ectx->xmlctx = xmlctx;
ectx->parser = NULL;
ectx->expected_status = expected_status;
ectx->cleanup_pool = result_pool;
handler = svn_ra_serf__create_handler(session, result_pool);
handler->response_handler = expat_response_handler;
handler->response_baton = ectx;
ectx->handler = handler;
return handler;
}
Index: stable/11/contrib/subversion/subversion/libsvn_repos/reporter.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_repos/reporter.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_repos/reporter.c (revision 309511)
@@ -1,1619 +1,1638 @@
/*
* reporter.c : `reporter' vtable routines for updates.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include "svn_dirent_uri.h"
#include "svn_hash.h"
#include "svn_path.h"
#include "svn_types.h"
#include "svn_error.h"
#include "svn_error_codes.h"
#include "svn_fs.h"
#include "svn_repos.h"
#include "svn_pools.h"
#include "svn_props.h"
#include "repos.h"
#include "svn_private_config.h"
#include "private/svn_dep_compat.h"
#include "private/svn_fspath.h"
#include "private/svn_subr_private.h"
#include "private/svn_string_private.h"
#define NUM_CACHED_SOURCE_ROOTS 4
/* Theory of operation: we write report operations out to a spill-buffer
as we receive them. When the report is finished, we read the
operations back out again, using them to guide the progression of
the delta between the source and target revs.
Spill-buffer content format: we use a simple ad-hoc format to store the
report operations. Each report operation is the concatention of
the following ("+/-" indicates the single character '+' or '-';
<length> and <revnum> are written out as decimal strings):
+/- '-' marks the end of the report
If previous is +:
<length>:<bytes> Length-counted path string
+/- '+' indicates the presence of link_path
If previous is +:
<length>:<bytes> Length-counted link_path string
+/- '+' indicates presence of revnum
If previous is +:
<revnum>: Revnum of set_path or link_path
+/- '+' indicates depth other than svn_depth_infinity
If previous is +:
<depth>: "X","E","F","M" =>
svn_depth_{exclude,empty,files,immediates}
+/- '+' indicates start_empty field set
+/- '+' indicates presence of lock_token field.
If previous is +:
<length>:<bytes> Length-counted lock_token string
Terminology: for brevity, this file frequently uses the prefixes
"s_" for source, "t_" for target, and "e_" for editor. Also, to
avoid overloading the word "target", we talk about the source
"anchor and operand", rather than the usual "anchor and target". */
/* Describes the state of a working copy subtree, as given by a
report. Because we keep a lookahead pathinfo, we need to allocate
each one of these things in a subpool of the report baton and free
it when done. */
typedef struct path_info_t
{
const char *path; /* path, munged to be anchor-relative */
const char *link_path; /* NULL for set_path or delete_path */
svn_revnum_t rev; /* SVN_INVALID_REVNUM for delete_path */
svn_depth_t depth; /* Depth of this path, meaningless for files */
svn_boolean_t start_empty; /* Meaningless for delete_path */
const char *lock_token; /* NULL if no token */
apr_pool_t *pool; /* Container pool */
} path_info_t;
/* Describes the standard revision properties that are relevant for
reports. Since a particular revision will often show up more than
once in the report, we cache these properties for the time of the
report generation. */
typedef struct revision_info_t
{
svn_revnum_t rev; /* revision number */
svn_string_t* date; /* revision timestamp */
svn_string_t* author; /* name of the revisions' author */
} revision_info_t;
/* A structure used by the routines within the `reporter' vtable,
driven by the client as it describes its working copy revisions. */
typedef struct report_baton_t
{
/* Parameters remembered from svn_repos_begin_report3 */
svn_repos_t *repos;
const char *fs_base; /* fspath corresponding to wc anchor */
const char *s_operand; /* anchor-relative wc target (may be empty) */
svn_revnum_t t_rev; /* Revnum which the edit will bring the wc to */
const char *t_path; /* FS path the edit will bring the wc to */
svn_boolean_t text_deltas; /* Whether to report text deltas */
apr_size_t zero_copy_limit; /* Max item size that will be sent using
the zero-copy code path. */
/* If the client requested a specific depth, record it here; if the
client did not, then this is svn_depth_unknown, and the depth of
information transmitted from server to client will be governed
strictly by the path-associated depths recorded in the report. */
svn_depth_t requested_depth;
svn_boolean_t ignore_ancestry;
svn_boolean_t send_copyfrom_args;
svn_boolean_t is_switch;
const svn_delta_editor_t *editor;
void *edit_baton;
svn_repos_authz_func_t authz_read_func;
void *authz_read_baton;
/* The spill-buffer holding the report. */
svn_spillbuf_reader_t *reader;
/* For the actual editor drive, we'll need a lookahead path info
entry, a cache of FS roots, and a pool to store them. */
path_info_t *lookahead;
svn_fs_root_t *t_root;
svn_fs_root_t *s_roots[NUM_CACHED_SOURCE_ROOTS];
/* Cache for revision properties. This is used to eliminate redundant
revprop fetching. */
apr_hash_t *revision_infos;
/* This will not change. So, fetch it once and reuse it. */
svn_string_t *repos_uuid;
apr_pool_t *pool;
} report_baton_t;
/* The type of a function that accepts changes to an object's property
list. OBJECT is the object whose properties are being changed.
NAME is the name of the property to change. VALUE is the new value
for the property, or zero if the property should be deleted. */
typedef svn_error_t *proplist_change_fn_t(report_baton_t *b, void *object,
const char *name,
const svn_string_t *value,
apr_pool_t *pool);
static svn_error_t *delta_dirs(report_baton_t *b, svn_revnum_t s_rev,
const char *s_path, const char *t_path,
void *dir_baton, const char *e_path,
svn_boolean_t start_empty,
svn_depth_t wc_depth,
svn_depth_t requested_depth,
apr_pool_t *pool);
/* --- READING PREVIOUSLY STORED REPORT INFORMATION --- */
static svn_error_t *
read_number(apr_uint64_t *num, svn_spillbuf_reader_t *reader, apr_pool_t *pool)
{
char c;
*num = 0;
while (1)
{
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
if (c == ':')
break;
*num = *num * 10 + (c - '0');
}
return SVN_NO_ERROR;
}
static svn_error_t *
read_string(const char **str, svn_spillbuf_reader_t *reader, apr_pool_t *pool)
{
apr_uint64_t len;
apr_size_t size;
apr_size_t amt;
char *buf;
SVN_ERR(read_number(&len, reader, pool));
/* Len can never be less than zero. But could len be so large that
len + 1 wraps around and we end up passing 0 to apr_palloc(),
thus getting a pointer to no storage? Probably not (16 exabyte
string, anyone?) but let's be future-proof anyway. */
if (len + 1 < len || len + 1 > APR_SIZE_MAX)
{
/* xgettext doesn't expand preprocessor definitions, so we must
pass translatable string to apr_psprintf() function to create
intermediate string with appropriate format specifier. */
return svn_error_createf(SVN_ERR_REPOS_BAD_REVISION_REPORT, NULL,
apr_psprintf(pool,
_("Invalid length (%%%s) when "
"about to read a string"),
APR_UINT64_T_FMT),
len);
}
size = (apr_size_t)len;
buf = apr_palloc(pool, size+1);
if (size > 0)
{
SVN_ERR(svn_spillbuf__reader_read(&amt, reader, buf, size, pool));
SVN_ERR_ASSERT(amt == size);
}
buf[len] = 0;
*str = buf;
return SVN_NO_ERROR;
}
static svn_error_t *
read_rev(svn_revnum_t *rev, svn_spillbuf_reader_t *reader, apr_pool_t *pool)
{
char c;
apr_uint64_t num;
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
if (c == '+')
{
SVN_ERR(read_number(&num, reader, pool));
*rev = (svn_revnum_t) num;
}
else
*rev = SVN_INVALID_REVNUM;
return SVN_NO_ERROR;
}
/* Read a single character to set *DEPTH (having already read '+')
from READER. PATH is the path to which the depth applies, and is
used for error reporting only. */
static svn_error_t *
read_depth(svn_depth_t *depth, svn_spillbuf_reader_t *reader, const char *path,
apr_pool_t *pool)
{
char c;
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
switch (c)
{
case 'X':
*depth = svn_depth_exclude;
break;
case 'E':
*depth = svn_depth_empty;
break;
case 'F':
*depth = svn_depth_files;
break;
case 'M':
*depth = svn_depth_immediates;
break;
/* Note that we do not tolerate explicit representation of
svn_depth_infinity here, because that's not how
write_path_info() writes it. */
default:
return svn_error_createf(SVN_ERR_REPOS_BAD_REVISION_REPORT, NULL,
_("Invalid depth (%c) for path '%s'"), c, path);
}
return SVN_NO_ERROR;
}
/* Read a report operation *PI out of READER. Set *PI to NULL if we
have reached the end of the report. */
static svn_error_t *
read_path_info(path_info_t **pi,
svn_spillbuf_reader_t *reader,
apr_pool_t *pool)
{
char c;
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
if (c == '-')
{
*pi = NULL;
return SVN_NO_ERROR;
}
*pi = apr_palloc(pool, sizeof(**pi));
SVN_ERR(read_string(&(*pi)->path, reader, pool));
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
if (c == '+')
SVN_ERR(read_string(&(*pi)->link_path, reader, pool));
else
(*pi)->link_path = NULL;
SVN_ERR(read_rev(&(*pi)->rev, reader, pool));
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
if (c == '+')
SVN_ERR(read_depth(&((*pi)->depth), reader, (*pi)->path, pool));
else
(*pi)->depth = svn_depth_infinity;
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
(*pi)->start_empty = (c == '+');
SVN_ERR(svn_spillbuf__reader_getc(&c, reader, pool));
if (c == '+')
SVN_ERR(read_string(&(*pi)->lock_token, reader, pool));
else
(*pi)->lock_token = NULL;
(*pi)->pool = pool;
return SVN_NO_ERROR;
}
/* Return true if PI's path is a child of PREFIX (which has length PLEN). */
static svn_boolean_t
relevant(path_info_t *pi, const char *prefix, apr_size_t plen)
{
return (pi && strncmp(pi->path, prefix, plen) == 0 &&
(!*prefix || pi->path[plen] == '/'));
}
/* Fetch the next pathinfo from B->reader for a descendant of
PREFIX. If the next pathinfo is for an immediate child of PREFIX,
set *ENTRY to the path component of the report information and
*INFO to the path information for that entry. If the next pathinfo
is for a grandchild or other more remote descendant of PREFIX, set
*ENTRY to the immediate child corresponding to that descendant and
set *INFO to NULL. If the next pathinfo is not for a descendant of
PREFIX, or if we reach the end of the report, set both *ENTRY and
*INFO to NULL.
At all times, B->lookahead is presumed to be the next pathinfo not
yet returned as an immediate child, or NULL if we have reached the
end of the report. Because we use a lookahead element, we can't
rely on the usual nested pool lifetimes, so allocate each pathinfo
in a subpool of the report baton's pool. The caller should delete
(*INFO)->pool when it is done with the information. */
static svn_error_t *
fetch_path_info(report_baton_t *b, const char **entry, path_info_t **info,
const char *prefix, apr_pool_t *pool)
{
apr_size_t plen = strlen(prefix);
const char *relpath, *sep;
apr_pool_t *subpool;
if (!relevant(b->lookahead, prefix, plen))
{
/* No more entries relevant to prefix. */
*entry = NULL;
*info = NULL;
}
else
{
/* Take a look at the prefix-relative part of the path. */
relpath = b->lookahead->path + (*prefix ? plen + 1 : 0);
sep = strchr(relpath, '/');
if (sep)
{
/* Return the immediate child part; do not advance. */
*entry = apr_pstrmemdup(pool, relpath, sep - relpath);
*info = NULL;
}
else
{
/* This is an immediate child; return it and advance. */
*entry = relpath;
*info = b->lookahead;
subpool = svn_pool_create(b->pool);
SVN_ERR(read_path_info(&b->lookahead, b->reader, subpool));
}
}
return SVN_NO_ERROR;
}
/* Skip all path info entries relevant to *PREFIX. Call this when the
editor drive skips a directory. */
static svn_error_t *
skip_path_info(report_baton_t *b, const char *prefix)
{
apr_size_t plen = strlen(prefix);
apr_pool_t *subpool;
while (relevant(b->lookahead, prefix, plen))
{
svn_pool_destroy(b->lookahead->pool);
subpool = svn_pool_create(b->pool);
SVN_ERR(read_path_info(&b->lookahead, b->reader, subpool));
}
return SVN_NO_ERROR;
}
/* Return true if there is at least one path info entry relevant to *PREFIX. */
static svn_boolean_t
any_path_info(report_baton_t *b, const char *prefix)
{
return relevant(b->lookahead, prefix, strlen(prefix));
}
/* --- DRIVING THE EDITOR ONCE THE REPORT IS FINISHED --- */
/* While driving the editor, the target root will remain constant, but
we may have to jump around between source roots depending on the
state of the working copy. If we were to open a root each time we
revisit a rev, we would get no benefit from node-id caching; on the
other hand, if we hold open all the roots we ever visit, we'll use
an unbounded amount of memory. As a compromise, we maintain a
fixed-size LRU cache of source roots. get_source_root retrieves a
root from the cache, using POOL to allocate the new root if
necessary. Be careful not to hold onto the root for too long,
particularly after recursing, since another call to get_source_root
can close it. */
static svn_error_t *
get_source_root(report_baton_t *b, svn_fs_root_t **s_root, svn_revnum_t rev)
{
int i;
svn_fs_root_t *root, *prev = NULL;
/* Look for the desired root in the cache, sliding all the unmatched
entries backwards a slot to make room for the right one. */
for (i = 0; i < NUM_CACHED_SOURCE_ROOTS; i++)
{
root = b->s_roots[i];
b->s_roots[i] = prev;
if (root && svn_fs_revision_root_revision(root) == rev)
break;
prev = root;
}
/* If we didn't find it, throw out the oldest root and open a new one. */
if (i == NUM_CACHED_SOURCE_ROOTS)
{
if (prev)
svn_fs_close_root(prev);
SVN_ERR(svn_fs_revision_root(&root, b->repos->fs, rev, b->pool));
}
/* Assign the desired root to the first cache slot and hand it back. */
b->s_roots[0] = root;
*s_root = root;
return SVN_NO_ERROR;
}
/* Call the directory property-setting function of B->editor to set
the property NAME to VALUE on DIR_BATON. */
static svn_error_t *
change_dir_prop(report_baton_t *b, void *dir_baton, const char *name,
const svn_string_t *value, apr_pool_t *pool)
{
return svn_error_trace(b->editor->change_dir_prop(dir_baton, name, value,
pool));
}
/* Call the file property-setting function of B->editor to set the
property NAME to VALUE on FILE_BATON. */
static svn_error_t *
change_file_prop(report_baton_t *b, void *file_baton, const char *name,
const svn_string_t *value, apr_pool_t *pool)
{
return svn_error_trace(b->editor->change_file_prop(file_baton, name, value,
pool));
}
/* For the report B, return the relevant revprop data of revision REV in
REVISION_INFO. The revision info will be allocated in b->pool.
Temporaries get allocated on SCRATCH_POOL. */
static svn_error_t *
get_revision_info(report_baton_t *b,
svn_revnum_t rev,
revision_info_t** revision_info,
apr_pool_t *scratch_pool)
{
apr_hash_t *r_props;
svn_string_t *cdate, *author;
revision_info_t* info;
/* Try to find the info in the report's cache */
info = apr_hash_get(b->revision_infos, &rev, sizeof(rev));
if (!info)
{
/* Info is not available, yet.
Get all revprops. */
SVN_ERR(svn_fs_revision_proplist(&r_props,
b->repos->fs,
rev,
scratch_pool));
/* Extract the committed-date. */
cdate = svn_hash_gets(r_props, SVN_PROP_REVISION_DATE);
/* Extract the last-author. */
author = svn_hash_gets(r_props, SVN_PROP_REVISION_AUTHOR);
/* Create a result object */
info = apr_palloc(b->pool, sizeof(*info));
info->rev = rev;
info->date = svn_string_dup(cdate, b->pool);
info->author = svn_string_dup(author, b->pool);
/* Cache it */
apr_hash_set(b->revision_infos, &info->rev, sizeof(info->rev), info);
}
*revision_info = info;
return SVN_NO_ERROR;
}
/* Generate the appropriate property editing calls to turn the
properties of S_REV/S_PATH into those of B->t_root/T_PATH. If
S_PATH is NULL, this is an add, so assume the target starts with no
properties. Pass OBJECT on to the editor function wrapper
CHANGE_FN. */
static svn_error_t *
delta_proplists(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
const char *t_path, const char *lock_token,
proplist_change_fn_t *change_fn,
void *object, apr_pool_t *pool)
{
svn_fs_root_t *s_root;
apr_hash_t *s_props = NULL, *t_props;
apr_array_header_t *prop_diffs;
int i;
svn_revnum_t crev;
revision_info_t *revision_info;
svn_boolean_t changed;
const svn_prop_t *pc;
svn_lock_t *lock;
apr_hash_index_t *hi;
/* Fetch the created-rev and send entry props. */
SVN_ERR(svn_fs_node_created_rev(&crev, b->t_root, t_path, pool));
if (SVN_IS_VALID_REVNUM(crev))
{
/* convert committed-rev to string */
char buf[SVN_INT64_BUFFER_SIZE];
svn_string_t cr_str;
cr_str.data = buf;
cr_str.len = svn__i64toa(buf, crev);
/* Transmit the committed-rev. */
SVN_ERR(change_fn(b, object,
SVN_PROP_ENTRY_COMMITTED_REV, &cr_str, pool));
SVN_ERR(get_revision_info(b, crev, &revision_info, pool));
/* Transmit the committed-date. */
if (revision_info->date || s_path)
SVN_ERR(change_fn(b, object, SVN_PROP_ENTRY_COMMITTED_DATE,
revision_info->date, pool));
/* Transmit the last-author. */
if (revision_info->author || s_path)
SVN_ERR(change_fn(b, object, SVN_PROP_ENTRY_LAST_AUTHOR,
revision_info->author, pool));
/* Transmit the UUID. */
SVN_ERR(change_fn(b, object, SVN_PROP_ENTRY_UUID,
b->repos_uuid, pool));
}
/* Update lock properties. */
if (lock_token)
{
SVN_ERR(svn_fs_get_lock(&lock, b->repos->fs, t_path, pool));
/* Delete a defunct lock. */
if (! lock || strcmp(lock_token, lock->token) != 0)
SVN_ERR(change_fn(b, object, SVN_PROP_ENTRY_LOCK_TOKEN,
NULL, pool));
}
if (s_path)
{
SVN_ERR(get_source_root(b, &s_root, s_rev));
/* Is this deltification worth our time? */
SVN_ERR(svn_fs_props_different(&changed, b->t_root, t_path, s_root,
s_path, pool));
if (! changed)
return SVN_NO_ERROR;
/* If so, go ahead and get the source path's properties. */
SVN_ERR(svn_fs_node_proplist(&s_props, s_root, s_path, pool));
}
/* Get the target path's properties */
SVN_ERR(svn_fs_node_proplist(&t_props, b->t_root, t_path, pool));
if (s_props && apr_hash_count(s_props))
{
/* Now transmit the differences. */
SVN_ERR(svn_prop_diffs(&prop_diffs, t_props, s_props, pool));
for (i = 0; i < prop_diffs->nelts; i++)
{
pc = &APR_ARRAY_IDX(prop_diffs, i, svn_prop_t);
SVN_ERR(change_fn(b, object, pc->name, pc->value, pool));
}
}
else if (apr_hash_count(t_props))
{
/* So source, i.e. all new. Transmit all target props. */
for (hi = apr_hash_first(pool, t_props); hi; hi = apr_hash_next(hi))
{
const char *key = apr_hash_this_key(hi);
svn_string_t *val = apr_hash_this_val(hi);
SVN_ERR(change_fn(b, object, key, val, pool));
}
}
return SVN_NO_ERROR;
}
/* Baton type to be passed into send_zero_copy_delta.
*/
typedef struct zero_copy_baton_t
{
/* don't process data larger than this limit */
apr_size_t zero_copy_limit;
/* window handler and baton to send the data to */
svn_txdelta_window_handler_t dhandler;
void *dbaton;
/* return value: will be set to TRUE, if the data was processed. */
svn_boolean_t zero_copy_succeeded;
} zero_copy_baton_t;
/* Implement svn_fs_process_contents_func_t. If LEN is smaller than the
* limit given in *BATON, send the CONTENTS as an delta windows to the
* handler given in BATON and set the ZERO_COPY_SUCCEEDED flag in that
* BATON. Otherwise, reset it to FALSE.
* Use POOL for temporary allocations.
*/
static svn_error_t *
send_zero_copy_delta(const unsigned char *contents,
apr_size_t len,
void *baton,
apr_pool_t *pool)
{
zero_copy_baton_t *zero_copy_baton = baton;
/* if the item is too large, the caller must revert to traditional
streaming code. */
if (len > zero_copy_baton->zero_copy_limit)
{
zero_copy_baton->zero_copy_succeeded = FALSE;
return SVN_NO_ERROR;
}
SVN_ERR(svn_txdelta_send_contents(contents, len,
zero_copy_baton->dhandler,
zero_copy_baton->dbaton, pool));
/* all fine now */
zero_copy_baton->zero_copy_succeeded = TRUE;
return SVN_NO_ERROR;
}
/* Make the appropriate edits on FILE_BATON to change its contents and
properties from those in S_REV/S_PATH to those in B->t_root/T_PATH,
possibly using LOCK_TOKEN to determine if the client's lock on the file
is defunct. */
static svn_error_t *
delta_files(report_baton_t *b, void *file_baton, svn_revnum_t s_rev,
const char *s_path, const char *t_path, const char *lock_token,
apr_pool_t *pool)
{
svn_boolean_t changed;
svn_fs_root_t *s_root = NULL;
svn_txdelta_stream_t *dstream = NULL;
svn_checksum_t *s_checksum;
const char *s_hex_digest = NULL;
svn_txdelta_window_handler_t dhandler;
void *dbaton;
/* Compare the files' property lists. */
SVN_ERR(delta_proplists(b, s_rev, s_path, t_path, lock_token,
change_file_prop, file_baton, pool));
if (s_path)
{
SVN_ERR(get_source_root(b, &s_root, s_rev));
/* We're not interested in the theoretical difference between "has
contents which have not changed with respect to" and "has the same
actual contents as" when sending text-deltas. If we know the
delta is an empty one, we avoiding sending it in either case. */
SVN_ERR(svn_repos__compare_files(&changed, b->t_root, t_path,
s_root, s_path, pool));
if (!changed)
return SVN_NO_ERROR;
SVN_ERR(svn_fs_file_checksum(&s_checksum, svn_checksum_md5, s_root,
s_path, TRUE, pool));
s_hex_digest = svn_checksum_to_cstring(s_checksum, pool);
}
/* Send the delta stream if desired, or just a NULL window if not. */
SVN_ERR(b->editor->apply_textdelta(file_baton, s_hex_digest, pool,
&dhandler, &dbaton));
if (dhandler != svn_delta_noop_window_handler)
{
if (b->text_deltas)
{
/* if we send deltas against empty streams, we may use our
zero-copy code. */
if (b->zero_copy_limit > 0 && s_path == NULL)
{
zero_copy_baton_t baton;
svn_boolean_t called = FALSE;
baton.zero_copy_limit = b->zero_copy_limit;
baton.dhandler = dhandler;
baton.dbaton = dbaton;
baton.zero_copy_succeeded = FALSE;
SVN_ERR(svn_fs_try_process_file_contents(&called,
b->t_root, t_path,
send_zero_copy_delta,
&baton, pool));
/* data has been available and small enough,
i.e. been processed? */
if (called && baton.zero_copy_succeeded)
return SVN_NO_ERROR;
}
SVN_ERR(svn_fs_get_file_delta_stream(&dstream, s_root, s_path,
b->t_root, t_path, pool));
SVN_ERR(svn_txdelta_send_txstream(dstream, dhandler, dbaton, pool));
}
else
SVN_ERR(dhandler(NULL, dbaton));
}
return SVN_NO_ERROR;
}
/* Determine if the user is authorized to view B->t_root/PATH. */
static svn_error_t *
check_auth(report_baton_t *b, svn_boolean_t *allowed, const char *path,
apr_pool_t *pool)
{
if (b->authz_read_func)
return svn_error_trace(b->authz_read_func(allowed, b->t_root, path,
b->authz_read_baton, pool));
*allowed = TRUE;
return SVN_NO_ERROR;
}
/* Create a dirent in *ENTRY for the given ROOT and PATH. We use this to
replace the source or target dirent when a report pathinfo tells us to
change paths or revisions. */
static svn_error_t *
fake_dirent(const svn_fs_dirent_t **entry, svn_fs_root_t *root,
const char *path, apr_pool_t *pool)
{
svn_node_kind_t kind;
svn_fs_dirent_t *ent;
SVN_ERR(svn_fs_check_path(&kind, root, path, pool));
if (kind == svn_node_none)
*entry = NULL;
else
{
ent = apr_palloc(pool, sizeof(**entry));
/* ### All callers should be updated to pass just one of these
formats */
ent->name = (*path == '/') ? svn_fspath__basename(path, pool)
: svn_relpath_basename(path, pool);
SVN_ERR(svn_fs_node_id(&ent->id, root, path, pool));
ent->kind = kind;
*entry = ent;
}
return SVN_NO_ERROR;
}
/* Given REQUESTED_DEPTH, WC_DEPTH and the current entry's KIND,
determine whether we need to send the whole entry, not just deltas.
Please refer to delta_dirs' docstring for an explanation of the
conditionals below. */
static svn_boolean_t
is_depth_upgrade(svn_depth_t wc_depth,
svn_depth_t requested_depth,
svn_node_kind_t kind)
{
if (requested_depth == svn_depth_unknown
|| requested_depth <= wc_depth
|| wc_depth == svn_depth_immediates)
return FALSE;
if (kind == svn_node_file
&& wc_depth == svn_depth_files)
return FALSE;
if (kind == svn_node_dir
&& wc_depth == svn_depth_empty
&& requested_depth == svn_depth_files)
return FALSE;
return TRUE;
}
/* Call the B->editor's add_file() function to create PATH as a child
of PARENT_BATON, returning a new baton in *NEW_FILE_BATON.
However, make an attempt to send 'copyfrom' arguments if they're
available, by examining the closest copy of the original file
O_PATH within B->t_root. If any copyfrom args are discovered,
return those in *COPYFROM_PATH and *COPYFROM_REV; otherwise leave
those return args untouched. */
static svn_error_t *
add_file_smartly(report_baton_t *b,
const char *path,
void *parent_baton,
const char *o_path,
void **new_file_baton,
const char **copyfrom_path,
svn_revnum_t *copyfrom_rev,
apr_pool_t *pool)
{
/* ### TODO: use a subpool to do this work, clear it at the end? */
svn_fs_t *fs = svn_repos_fs(b->repos);
svn_fs_root_t *closest_copy_root = NULL;
const char *closest_copy_path = NULL;
/* Pre-emptively assume no copyfrom args exist. */
*copyfrom_path = NULL;
*copyfrom_rev = SVN_INVALID_REVNUM;
if (b->send_copyfrom_args)
{
/* Find the destination of the nearest 'copy event' which may have
caused o_path@t_root to exist. svn_fs_closest_copy only returns paths
starting with '/', so make sure o_path always starts with a '/'
too. */
if (*o_path != '/')
o_path = apr_pstrcat(pool, "/", o_path, SVN_VA_NULL);
SVN_ERR(svn_fs_closest_copy(&closest_copy_root, &closest_copy_path,
b->t_root, o_path, pool));
if (closest_copy_root != NULL)
{
/* If the destination of the copy event is the same path as
o_path, then we've found something interesting that should
have 'copyfrom' history. */
if (strcmp(closest_copy_path, o_path) == 0)
{
SVN_ERR(svn_fs_copied_from(copyfrom_rev, copyfrom_path,
closest_copy_root, closest_copy_path,
pool));
if (b->authz_read_func)
{
svn_boolean_t allowed;
svn_fs_root_t *copyfrom_root;
SVN_ERR(svn_fs_revision_root(&copyfrom_root, fs,
*copyfrom_rev, pool));
SVN_ERR(b->authz_read_func(&allowed, copyfrom_root,
*copyfrom_path, b->authz_read_baton,
pool));
if (! allowed)
{
*copyfrom_path = NULL;
*copyfrom_rev = SVN_INVALID_REVNUM;
}
}
}
}
}
return svn_error_trace(b->editor->add_file(path, parent_baton,
*copyfrom_path, *copyfrom_rev,
pool, new_file_baton));
}
/* Emit a series of editing operations to transform a source entry to
a target entry.
S_REV and S_PATH specify the source entry. S_ENTRY contains the
already-looked-up information about the node-revision existing at
that location. S_PATH and S_ENTRY may be NULL if the entry does
not exist in the source. S_PATH may be non-NULL and S_ENTRY may be
NULL if the caller expects INFO to modify the source to an existing
location.
B->t_root and T_PATH specify the target entry. T_ENTRY contains
the already-looked-up information about the node-revision existing
at that location. T_PATH and T_ENTRY may be NULL if the entry does
not exist in the target.
DIR_BATON and E_PATH contain the parameters which should be passed
to the editor calls--DIR_BATON for the parent directory baton and
E_PATH for the pathname. (E_PATH is the anchor-relative working
copy pathname, which may differ from the source and target
pathnames if the report contains a link_path.)
INFO contains the report information for this working copy path, or
NULL if there is none. This function will internally modify the
source and target entries as appropriate based on the report
information.
WC_DEPTH and REQUESTED_DEPTH are propagated to delta_dirs() if
necessary. Refer to delta_dirs' docstring to find out what
should happen for various combinations of WC_DEPTH/REQUESTED_DEPTH. */
static svn_error_t *
update_entry(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
const svn_fs_dirent_t *s_entry, const char *t_path,
const svn_fs_dirent_t *t_entry, void *dir_baton,
const char *e_path, path_info_t *info, svn_depth_t wc_depth,
svn_depth_t requested_depth, apr_pool_t *pool)
{
- svn_fs_root_t *s_root;
+ svn_fs_root_t *s_root = NULL;
svn_boolean_t allowed, related;
void *new_baton;
svn_checksum_t *checksum;
const char *hex_digest;
/* For non-switch operations, follow link_path in the target. */
if (info && info->link_path && !b->is_switch)
{
t_path = info->link_path;
SVN_ERR(fake_dirent(&t_entry, b->t_root, t_path, pool));
}
if (info && !SVN_IS_VALID_REVNUM(info->rev))
{
/* Delete this entry in the source. */
s_path = NULL;
s_entry = NULL;
}
else if (info && s_path)
{
/* Follow the rev and possibly path in this entry. */
s_path = (info->link_path) ? info->link_path : s_path;
s_rev = info->rev;
SVN_ERR(get_source_root(b, &s_root, s_rev));
SVN_ERR(fake_dirent(&s_entry, s_root, s_path, pool));
}
/* Don't let the report carry us somewhere nonexistent. */
if (s_path && !s_entry)
return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
_("Working copy path '%s' does not exist in "
"repository"), e_path);
/* If the source and target both exist and are of the same kind,
then find out whether they're related. If they're exactly the
same, then we don't have to do anything (unless the report has
changes to the source). If we're ignoring ancestry, then any two
nodes of the same type are related enough for us. */
related = FALSE;
if (s_entry && t_entry && s_entry->kind == t_entry->kind)
{
int distance = svn_fs_compare_ids(s_entry->id, t_entry->id);
- if (distance == 0 && !any_path_info(b, e_path)
+ svn_boolean_t changed = TRUE;
+
+ /* Check related files for content changes to avoid reporting
+ * unchanged copies of files to the client as an open_file() call
+ * and change_file_prop()/apply_textdelta() calls with no-op changes.
+ * The client will otherwise raise unnecessary tree conflicts. */
+ if (!b->ignore_ancestry && t_entry->kind == svn_node_file &&
+ distance == 1)
+ {
+ if (s_root == NULL)
+ SVN_ERR(get_source_root(b, &s_root, s_rev));
+
+ SVN_ERR(svn_fs_props_different(&changed, s_root, s_path,
+ b->t_root, t_path, pool));
+ if (!changed)
+ SVN_ERR(svn_fs_contents_different(&changed, s_root, s_path,
+ b->t_root, t_path, pool));
+ }
+
+ if ((distance == 0 || !changed) && !any_path_info(b, e_path)
&& (requested_depth <= wc_depth || t_entry->kind == svn_node_file))
{
if (!info)
return SVN_NO_ERROR;
if (!info->start_empty)
{
svn_lock_t *lock;
if (!info->lock_token)
return SVN_NO_ERROR;
SVN_ERR(svn_fs_get_lock(&lock, b->repos->fs, t_path, pool));
if (lock && (strcmp(lock->token, info->lock_token) == 0))
return SVN_NO_ERROR;
}
}
related = (distance != -1 || b->ignore_ancestry);
}
/* If there's a source and it's not related to the target, nuke it. */
if (s_entry && !related)
{
svn_revnum_t deleted_rev;
SVN_ERR(svn_repos_deleted_rev(svn_fs_root_fs(b->t_root), t_path,
s_rev, b->t_rev, &deleted_rev,
pool));
if (!SVN_IS_VALID_REVNUM(deleted_rev))
{
/* Two possibilities: either the thing doesn't exist in S_REV; or
it wasn't deleted between S_REV and B->T_REV. In the first case,
I think we should leave DELETED_REV as SVN_INVALID_REVNUM, but
in the second, it should be set to B->T_REV-1 for the call to
delete_entry() below. */
svn_node_kind_t kind;
SVN_ERR(svn_fs_check_path(&kind, b->t_root, t_path, pool));
if (kind != svn_node_none)
deleted_rev = b->t_rev - 1;
}
SVN_ERR(b->editor->delete_entry(e_path, deleted_rev, dir_baton,
pool));
s_path = NULL;
}
/* If there's no target, we have nothing more to do. */
if (!t_entry)
return svn_error_trace(skip_path_info(b, e_path));
/* Check if the user is authorized to find out about the target. */
SVN_ERR(check_auth(b, &allowed, t_path, pool));
if (!allowed)
{
if (t_entry->kind == svn_node_dir)
SVN_ERR(b->editor->absent_directory(e_path, dir_baton, pool));
else
SVN_ERR(b->editor->absent_file(e_path, dir_baton, pool));
return svn_error_trace(skip_path_info(b, e_path));
}
if (t_entry->kind == svn_node_dir)
{
if (related)
SVN_ERR(b->editor->open_directory(e_path, dir_baton, s_rev, pool,
&new_baton));
else
SVN_ERR(b->editor->add_directory(e_path, dir_baton, NULL,
SVN_INVALID_REVNUM, pool,
&new_baton));
SVN_ERR(delta_dirs(b, s_rev, s_path, t_path, new_baton, e_path,
info ? info->start_empty : FALSE,
wc_depth, requested_depth, pool));
return svn_error_trace(b->editor->close_directory(new_baton, pool));
}
else
{
if (related)
{
SVN_ERR(b->editor->open_file(e_path, dir_baton, s_rev, pool,
&new_baton));
SVN_ERR(delta_files(b, new_baton, s_rev, s_path, t_path,
info ? info->lock_token : NULL, pool));
}
else
{
svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM;
const char *copyfrom_path = NULL;
SVN_ERR(add_file_smartly(b, e_path, dir_baton, t_path, &new_baton,
&copyfrom_path, &copyfrom_rev, pool));
if (! copyfrom_path)
/* Send txdelta between empty file (s_path@s_rev doesn't
exist) and added file (t_path@t_root). */
SVN_ERR(delta_files(b, new_baton, s_rev, s_path, t_path,
info ? info->lock_token : NULL, pool));
else
/* Send txdelta between copied file (copyfrom_path@copyfrom_rev)
and added file (tpath@t_root). */
SVN_ERR(delta_files(b, new_baton, copyfrom_rev, copyfrom_path,
t_path, info ? info->lock_token : NULL, pool));
}
SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, b->t_root,
t_path, TRUE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
return svn_error_trace(b->editor->close_file(new_baton, hex_digest,
pool));
}
}
/* A helper macro for when we have to recurse into subdirectories. */
#define DEPTH_BELOW_HERE(depth) ((depth) == svn_depth_immediates) ? \
svn_depth_empty : (depth)
/* Emit edits within directory DIR_BATON (with corresponding path
E_PATH) with the changes from the directory S_REV/S_PATH to the
directory B->t_rev/T_PATH. S_PATH may be NULL if the entry does
not exist in the source.
WC_DEPTH is this path's depth as reported by set_path/link_path.
REQUESTED_DEPTH is derived from the depth set by
svn_repos_begin_report().
When iterating over this directory's entries, the following tables
describe what happens for all possible combinations
of WC_DEPTH/REQUESTED_DEPTH (rows represent WC_DEPTH, columns
represent REQUESTED_DEPTH):
Legend:
X: ignore this entry (it's either below the requested depth, or
if the requested depth is svn_depth_unknown, below the working
copy depth)
o: handle this entry normally
U: handle the entry as if it were a newly added repository path
(the client is upgrading to a deeper wc and doesn't currently
have this entry, but it should be there after the upgrade, so we
need to send the whole thing, not just deltas)
For files:
______________________________________________________________
| req. depth| unknown | empty | files | immediates | infinity |
|wc. depth | | | | | |
|___________|_________|_______|_______|____________|__________|
|empty | X | X | U | U | U |
|___________|_________|_______|_______|____________|__________|
|files | o | X | o | o | o |
|___________|_________|_______|_______|____________|__________|
|immediates | o | X | o | o | o |
|___________|_________|_______|_______|____________|__________|
|infinity | o | X | o | o | o |
|___________|_________|_______|_______|____________|__________|
For directories:
______________________________________________________________
| req. depth| unknown | empty | files | immediates | infinity |
|wc. depth | | | | | |
|___________|_________|_______|_______|____________|__________|
|empty | X | X | X | U | U |
|___________|_________|_______|_______|____________|__________|
|files | X | X | X | U | U |
|___________|_________|_______|_______|____________|__________|
|immediates | o | X | X | o | o |
|___________|_________|_______|_______|____________|__________|
|infinity | o | X | X | o | o |
|___________|_________|_______|_______|____________|__________|
These rules are enforced by the is_depth_upgrade() function and by
various other checks below.
*/
static svn_error_t *
delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
const char *t_path, void *dir_baton, const char *e_path,
svn_boolean_t start_empty, svn_depth_t wc_depth,
svn_depth_t requested_depth, apr_pool_t *pool)
{
apr_hash_t *s_entries = NULL, *t_entries;
apr_hash_index_t *hi;
apr_pool_t *subpool = svn_pool_create(pool);
apr_array_header_t *t_ordered_entries = NULL;
int i;
/* Compare the property lists. If we're starting empty, pass a NULL
source path so that we add all the properties.
When we support directory locks, we must pass the lock token here. */
SVN_ERR(delta_proplists(b, s_rev, start_empty ? NULL : s_path, t_path,
NULL, change_dir_prop, dir_baton, subpool));
svn_pool_clear(subpool);
if (requested_depth > svn_depth_empty
|| requested_depth == svn_depth_unknown)
{
apr_pool_t *iterpool;
/* Get the list of entries in each of source and target. */
if (s_path && !start_empty)
{
svn_fs_root_t *s_root;
SVN_ERR(get_source_root(b, &s_root, s_rev));
SVN_ERR(svn_fs_dir_entries(&s_entries, s_root, s_path, subpool));
}
SVN_ERR(svn_fs_dir_entries(&t_entries, b->t_root, t_path, subpool));
/* Iterate over the report information for this directory. */
iterpool = svn_pool_create(subpool);
while (1)
{
path_info_t *info;
const char *name, *s_fullpath, *t_fullpath, *e_fullpath;
const svn_fs_dirent_t *s_entry, *t_entry;
svn_pool_clear(iterpool);
SVN_ERR(fetch_path_info(b, &name, &info, e_path, iterpool));
if (!name)
break;
/* Invalid revnum means we should delete, unless this is
just an excluded subpath. */
if (info
&& !SVN_IS_VALID_REVNUM(info->rev)
&& info->depth != svn_depth_exclude)
{
/* We want to perform deletes before non-replacement adds,
for graceful handling of case-only renames on
case-insensitive client filesystems. So, if the report
item is a delete, remove the entry from the source hash,
but don't update the entry yet. */
if (s_entries)
svn_hash_sets(s_entries, name, NULL);
svn_pool_destroy(info->pool);
continue;
}
e_fullpath = svn_relpath_join(e_path, name, iterpool);
t_fullpath = svn_fspath__join(t_path, name, iterpool);
t_entry = svn_hash_gets(t_entries, name);
s_fullpath = s_path ? svn_fspath__join(s_path, name, iterpool) : NULL;
s_entry = s_entries ? svn_hash_gets(s_entries, name) : NULL;
/* The only special cases where we don't process the entry are
- When requested_depth is files but the reported path is
a directory. This is technically a client error, but we
handle it anyway, by skipping the entry.
- When the reported depth is svn_depth_exclude.
*/
if (! ((requested_depth == svn_depth_files
&& ((t_entry && t_entry->kind == svn_node_dir)
|| (s_entry && s_entry->kind == svn_node_dir)))
|| (info && info->depth == svn_depth_exclude)))
SVN_ERR(update_entry(b, s_rev, s_fullpath, s_entry, t_fullpath,
t_entry, dir_baton, e_fullpath, info,
info ? info->depth
: DEPTH_BELOW_HERE(wc_depth),
DEPTH_BELOW_HERE(requested_depth), iterpool));
/* Don't revisit this name in the target or source entries. */
svn_hash_sets(t_entries, name, NULL);
if (s_entries
/* Keep the entry for later process if it is reported as
excluded and got deleted in repos. */
&& (! info || info->depth != svn_depth_exclude || t_entry))
svn_hash_sets(s_entries, name, NULL);
/* pathinfo entries live in their own subpools due to lookahead,
so we need to clear each one out as we finish with it. */
if (info)
svn_pool_destroy(info->pool);
}
/* Remove any deleted entries. Do this before processing the
target, for graceful handling of case-only renames. */
if (s_entries)
{
for (hi = apr_hash_first(subpool, s_entries);
hi;
hi = apr_hash_next(hi))
{
const svn_fs_dirent_t *s_entry = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
if (svn_hash_gets(t_entries, s_entry->name) == NULL)
{
const char *e_fullpath;
svn_revnum_t deleted_rev;
if (s_entry->kind == svn_node_file
&& wc_depth < svn_depth_files)
continue;
if (s_entry->kind == svn_node_dir
&& (wc_depth < svn_depth_immediates
|| requested_depth == svn_depth_files))
continue;
/* There is no corresponding target entry, so delete. */
e_fullpath = svn_relpath_join(e_path, s_entry->name, iterpool);
SVN_ERR(svn_repos_deleted_rev(svn_fs_root_fs(b->t_root),
svn_fspath__join(t_path,
s_entry->name,
iterpool),
s_rev, b->t_rev,
&deleted_rev, iterpool));
SVN_ERR(b->editor->delete_entry(e_fullpath,
deleted_rev,
dir_baton, iterpool));
}
}
}
/* Loop over the dirents in the target. */
SVN_ERR(svn_fs_dir_optimal_order(&t_ordered_entries, b->t_root,
t_entries, subpool, iterpool));
for (i = 0; i < t_ordered_entries->nelts; ++i)
{
const svn_fs_dirent_t *t_entry
= APR_ARRAY_IDX(t_ordered_entries, i, svn_fs_dirent_t *);
const svn_fs_dirent_t *s_entry;
const char *s_fullpath, *t_fullpath, *e_fullpath;
svn_pool_clear(iterpool);
if (is_depth_upgrade(wc_depth, requested_depth, t_entry->kind))
{
/* We're making the working copy deeper, pretend the source
doesn't exist. */
s_entry = NULL;
s_fullpath = NULL;
}
else
{
if (t_entry->kind == svn_node_file
&& requested_depth == svn_depth_unknown
&& wc_depth < svn_depth_files)
continue;
if (t_entry->kind == svn_node_dir
&& (wc_depth < svn_depth_immediates
|| requested_depth == svn_depth_files))
continue;
/* Look for an entry with the same name in the source dirents. */
s_entry = s_entries ?
svn_hash_gets(s_entries, t_entry->name) : NULL;
s_fullpath = s_entry ?
svn_fspath__join(s_path, t_entry->name, iterpool) : NULL;
}
/* Compose the report, editor, and target paths for this entry. */
e_fullpath = svn_relpath_join(e_path, t_entry->name, iterpool);
t_fullpath = svn_fspath__join(t_path, t_entry->name, iterpool);
SVN_ERR(update_entry(b, s_rev, s_fullpath, s_entry, t_fullpath,
t_entry, dir_baton, e_fullpath, NULL,
DEPTH_BELOW_HERE(wc_depth),
DEPTH_BELOW_HERE(requested_depth),
iterpool));
}
/* iterpool is destroyed by destroying its parent (subpool) below */
}
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
static svn_error_t *
drive(report_baton_t *b, svn_revnum_t s_rev, path_info_t *info,
apr_pool_t *pool)
{
const char *t_anchor, *s_fullpath;
svn_boolean_t allowed, info_is_set_path;
svn_fs_root_t *s_root;
const svn_fs_dirent_t *s_entry, *t_entry;
void *root_baton;
/* Compute the target path corresponding to the working copy anchor,
and check its authorization. */
t_anchor = *b->s_operand ? svn_fspath__dirname(b->t_path, pool) : b->t_path;
SVN_ERR(check_auth(b, &allowed, t_anchor, pool));
if (!allowed)
return svn_error_create
(SVN_ERR_AUTHZ_ROOT_UNREADABLE, NULL,
_("Not authorized to open root of edit operation"));
/* Collect information about the source and target nodes. */
s_fullpath = svn_fspath__join(b->fs_base, b->s_operand, pool);
SVN_ERR(get_source_root(b, &s_root, s_rev));
SVN_ERR(fake_dirent(&s_entry, s_root, s_fullpath, pool));
SVN_ERR(fake_dirent(&t_entry, b->t_root, b->t_path, pool));
/* If the operand is a locally added file or directory, it won't
exist in the source, so accept that. */
info_is_set_path = (SVN_IS_VALID_REVNUM(info->rev) && !info->link_path);
if (info_is_set_path && !s_entry)
s_fullpath = NULL;
/* Check if the target path exists first. */
if (!*b->s_operand && !(t_entry))
return svn_error_createf(SVN_ERR_FS_PATH_SYNTAX, NULL,
_("Target path '%s' does not exist"),
b->t_path);
/* If the anchor is the operand, the source and target must be dirs.
Check this before opening the root to avoid modifying the wc. */
else if (!*b->s_operand && (!s_entry || s_entry->kind != svn_node_dir
|| t_entry->kind != svn_node_dir))
return svn_error_create(SVN_ERR_FS_PATH_SYNTAX, NULL,
_("Cannot replace a directory from within"));
SVN_ERR(b->editor->set_target_revision(b->edit_baton, b->t_rev, pool));
SVN_ERR(b->editor->open_root(b->edit_baton, s_rev, pool, &root_baton));
/* If the anchor is the operand, diff the two directories; otherwise
update the operand within the anchor directory. */
if (!*b->s_operand)
SVN_ERR(delta_dirs(b, s_rev, s_fullpath, b->t_path, root_baton,
"", info->start_empty, info->depth, b->requested_depth,
pool));
else
SVN_ERR(update_entry(b, s_rev, s_fullpath, s_entry, b->t_path,
t_entry, root_baton, b->s_operand, info,
info->depth, b->requested_depth, pool));
return svn_error_trace(b->editor->close_directory(root_baton, pool));
}
/* Initialize the baton fields for editor-driving, and drive the editor. */
static svn_error_t *
finish_report(report_baton_t *b, apr_pool_t *pool)
{
path_info_t *info;
apr_pool_t *subpool;
svn_revnum_t s_rev;
int i;
/* Save our pool to manage the lookahead and fs_root cache with. */
b->pool = pool;
/* Add the end marker. */
SVN_ERR(svn_spillbuf__reader_write(b->reader, "-", 1, pool));
/* Read the first pathinfo from the report and verify that it is a top-level
set_path entry. */
SVN_ERR(read_path_info(&info, b->reader, pool));
if (!info || strcmp(info->path, b->s_operand) != 0
|| info->link_path || !SVN_IS_VALID_REVNUM(info->rev))
return svn_error_create(SVN_ERR_REPOS_BAD_REVISION_REPORT, NULL,
_("Invalid report for top level of working copy"));
s_rev = info->rev;
/* Initialize the lookahead pathinfo. */
subpool = svn_pool_create(pool);
SVN_ERR(read_path_info(&b->lookahead, b->reader, subpool));
if (b->lookahead && strcmp(b->lookahead->path, b->s_operand) == 0)
{
/* If the operand of the wc operation is switched or deleted,
then info above is just a place-holder, and the only thing we
have to do is pass the revision it contains to open_root.
The next pathinfo actually describes the target. */
if (!*b->s_operand)
return svn_error_create(SVN_ERR_REPOS_BAD_REVISION_REPORT, NULL,
_("Two top-level reports with no target"));
/* If the client issued a set-path followed by a delete-path, we need
to respect the depth set by the initial set-path. */
if (! SVN_IS_VALID_REVNUM(b->lookahead->rev))
{
b->lookahead->depth = info->depth;
}
info = b->lookahead;
SVN_ERR(read_path_info(&b->lookahead, b->reader, subpool));
}
/* Open the target root and initialize the source root cache. */
SVN_ERR(svn_fs_revision_root(&b->t_root, b->repos->fs, b->t_rev, pool));
for (i = 0; i < NUM_CACHED_SOURCE_ROOTS; i++)
b->s_roots[i] = NULL;
{
svn_error_t *err = svn_error_trace(drive(b, s_rev, info, pool));
if (err == SVN_NO_ERROR)
return svn_error_trace(b->editor->close_edit(b->edit_baton, pool));
return svn_error_trace(
svn_error_compose_create(err,
b->editor->abort_edit(b->edit_baton,
pool)));
}
}
/* --- COLLECTING THE REPORT INFORMATION --- */
/* Record a report operation into the spill buffer. Return an error
if DEPTH is svn_depth_unknown. */
static svn_error_t *
write_path_info(report_baton_t *b, const char *path, const char *lpath,
svn_revnum_t rev, svn_depth_t depth,
svn_boolean_t start_empty,
const char *lock_token, apr_pool_t *pool)
{
const char *lrep, *rrep, *drep, *ltrep, *rep;
/* Munge the path to be anchor-relative, so that we can use edit paths
as report paths. */
path = svn_relpath_join(b->s_operand, path, pool);
lrep = lpath ? apr_psprintf(pool, "+%" APR_SIZE_T_FMT ":%s",
strlen(lpath), lpath) : "-";
rrep = (SVN_IS_VALID_REVNUM(rev)) ?
apr_psprintf(pool, "+%ld:", rev) : "-";
if (depth == svn_depth_exclude)
drep = "+X";
else if (depth == svn_depth_empty)
drep = "+E";
else if (depth == svn_depth_files)
drep = "+F";
else if (depth == svn_depth_immediates)
drep = "+M";
else if (depth == svn_depth_infinity)
drep = "-";
else
return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("Unsupported report depth '%s'"),
svn_depth_to_word(depth));
ltrep = lock_token ? apr_psprintf(pool, "+%" APR_SIZE_T_FMT ":%s",
strlen(lock_token), lock_token) : "-";
rep = apr_psprintf(pool, "+%" APR_SIZE_T_FMT ":%s%s%s%s%c%s",
strlen(path), path, lrep, rrep, drep,
start_empty ? '+' : '-', ltrep);
return svn_error_trace(
svn_spillbuf__reader_write(b->reader, rep, strlen(rep), pool));
}
svn_error_t *
svn_repos_set_path3(void *baton, const char *path, svn_revnum_t rev,
svn_depth_t depth, svn_boolean_t start_empty,
const char *lock_token, apr_pool_t *pool)
{
return svn_error_trace(
write_path_info(baton, path, NULL, rev, depth, start_empty,
lock_token, pool));
}
svn_error_t *
svn_repos_link_path3(void *baton, const char *path, const char *link_path,
svn_revnum_t rev, svn_depth_t depth,
svn_boolean_t start_empty,
const char *lock_token, apr_pool_t *pool)
{
if (depth == svn_depth_exclude)
return svn_error_create(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("Depth 'exclude' not supported for link"));
return svn_error_trace(
write_path_info(baton, path, link_path, rev, depth,
start_empty, lock_token, pool));
}
svn_error_t *
svn_repos_delete_path(void *baton, const char *path, apr_pool_t *pool)
{
/* We pass svn_depth_infinity because deletion of a path always
deletes everything underneath it. */
return svn_error_trace(
write_path_info(baton, path, NULL, SVN_INVALID_REVNUM,
svn_depth_infinity, FALSE, NULL, pool));
}
svn_error_t *
svn_repos_finish_report(void *baton, apr_pool_t *pool)
{
report_baton_t *b = baton;
return svn_error_trace(finish_report(b, pool));
}
svn_error_t *
svn_repos_abort_report(void *baton, apr_pool_t *pool)
{
return SVN_NO_ERROR;
}
/* --- BEGINNING THE REPORT --- */
svn_error_t *
svn_repos_begin_report3(void **report_baton,
svn_revnum_t revnum,
svn_repos_t *repos,
const char *fs_base,
const char *s_operand,
const char *switch_path,
svn_boolean_t text_deltas,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
svn_boolean_t send_copyfrom_args,
const svn_delta_editor_t *editor,
void *edit_baton,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_size_t zero_copy_limit,
apr_pool_t *pool)
{
report_baton_t *b;
const char *uuid;
if (depth == svn_depth_exclude)
return svn_error_create(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("Request depth 'exclude' not supported"));
SVN_ERR(svn_fs_get_uuid(repos->fs, &uuid, pool));
/* Build a reporter baton. Copy strings in case the caller doesn't
keep track of them. */
b = apr_palloc(pool, sizeof(*b));
b->repos = repos;
b->fs_base = svn_fspath__canonicalize(fs_base, pool);
b->s_operand = apr_pstrdup(pool, s_operand);
b->t_rev = revnum;
b->t_path = switch_path ? svn_fspath__canonicalize(switch_path, pool)
: svn_fspath__join(b->fs_base, s_operand, pool);
b->text_deltas = text_deltas;
b->zero_copy_limit = zero_copy_limit;
b->requested_depth = depth;
b->ignore_ancestry = ignore_ancestry;
b->send_copyfrom_args = send_copyfrom_args;
b->is_switch = (switch_path != NULL);
b->editor = editor;
b->edit_baton = edit_baton;
b->authz_read_func = authz_read_func;
b->authz_read_baton = authz_read_baton;
b->revision_infos = apr_hash_make(pool);
b->pool = pool;
b->reader = svn_spillbuf__reader_create(1000 /* blocksize */,
1000000 /* maxsize */,
pool);
b->repos_uuid = svn_string_create(uuid, pool);
/* Hand reporter back to client. */
*report_baton = b;
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_repos/repos.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_repos/repos.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_repos/repos.c (revision 309511)
@@ -1,2124 +1,2124 @@
/* repos.c : repository creation; shared and exclusive repository locking
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <apr_pools.h>
#include <apr_file_io.h>
#include "svn_pools.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_utf.h"
#include "svn_time.h"
#include "svn_fs.h"
#include "svn_ra.h" /* for SVN_RA_CAPABILITY_* */
#include "svn_repos.h"
#include "svn_hash.h"
#include "svn_version.h"
#include "svn_config.h"
#include "private/svn_repos_private.h"
#include "private/svn_subr_private.h"
#include "svn_private_config.h" /* for SVN_TEMPLATE_ROOT_DIR */
#include "repos.h"
/* Used to terminate lines in large multi-line string literals. */
#define NL APR_EOL_STR
/* Path accessor functions. */
const char *
svn_repos_path(svn_repos_t *repos, apr_pool_t *pool)
{
return apr_pstrdup(pool, repos->path);
}
const char *
svn_repos_db_env(svn_repos_t *repos, apr_pool_t *pool)
{
return apr_pstrdup(pool, repos->db_path);
}
const char *
svn_repos_conf_dir(svn_repos_t *repos, apr_pool_t *pool)
{
return apr_pstrdup(pool, repos->conf_path);
}
const char *
svn_repos_svnserve_conf(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->conf_path, SVN_REPOS__CONF_SVNSERVE_CONF, pool);
}
const char *
svn_repos_lock_dir(svn_repos_t *repos, apr_pool_t *pool)
{
return apr_pstrdup(pool, repos->lock_path);
}
const char *
svn_repos_db_lockfile(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->lock_path, SVN_REPOS__DB_LOCKFILE, pool);
}
const char *
svn_repos_db_logs_lockfile(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->lock_path, SVN_REPOS__DB_LOGS_LOCKFILE, pool);
}
const char *
svn_repos_hook_dir(svn_repos_t *repos, apr_pool_t *pool)
{
return apr_pstrdup(pool, repos->hook_path);
}
const char *
svn_repos_start_commit_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_START_COMMIT, pool);
}
const char *
svn_repos_pre_commit_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_PRE_COMMIT, pool);
}
const char *
svn_repos_pre_lock_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_PRE_LOCK, pool);
}
const char *
svn_repos_pre_unlock_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_PRE_UNLOCK, pool);
}
const char *
svn_repos_post_lock_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_POST_LOCK, pool);
}
const char *
svn_repos_post_unlock_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_POST_UNLOCK, pool);
}
const char *
svn_repos_post_commit_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_POST_COMMIT, pool);
}
const char *
svn_repos_pre_revprop_change_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_PRE_REVPROP_CHANGE,
pool);
}
const char *
svn_repos_post_revprop_change_hook(svn_repos_t *repos, apr_pool_t *pool)
{
return svn_dirent_join(repos->hook_path, SVN_REPOS__HOOK_POST_REVPROP_CHANGE,
pool);
}
static svn_error_t *
create_repos_dir(const char *path, apr_pool_t *pool)
{
svn_error_t *err;
err = svn_io_dir_make(path, APR_OS_DEFAULT, pool);
if (err && (APR_STATUS_IS_EEXIST(err->apr_err)))
{
svn_boolean_t is_empty;
svn_error_clear(err);
SVN_ERR(svn_io_dir_empty(&is_empty, path, pool));
if (is_empty)
err = NULL;
else
err = svn_error_createf(SVN_ERR_DIR_NOT_EMPTY, 0,
_("'%s' exists and is non-empty"),
svn_dirent_local_style(path, pool));
}
return svn_error_trace(err);
}
static const char * bdb_lock_file_contents =
"DB lock file, representing locks on the versioned filesystem." NL
"" NL
"All accessors -- both readers and writers -- of the repository's" NL
"Berkeley DB environment take out shared locks on this file, and" NL
"each accessor removes its lock when done. If and when the DB" NL
"recovery procedure is run, the recovery code takes out an" NL
"exclusive lock on this file, so we can be sure no one else is" NL
"using the DB during the recovery." NL
"" NL
"You should never have to edit or remove this file." NL;
static const char * bdb_logs_lock_file_contents =
"DB logs lock file, representing locks on the versioned filesystem logs." NL
"" NL
"All log manipulators of the repository's Berkeley DB environment" NL
"take out exclusive locks on this file to ensure that only one" NL
"accessor manipulates the logs at a time." NL
"" NL
"You should never have to edit or remove this file." NL;
static const char * pre12_compat_unneeded_file_contents =
"This file is not used by Subversion 1.3.x or later." NL
"However, its existence is required for compatibility with" NL
"Subversion 1.2.x or earlier." NL;
/* Create the DB logs lockfile. */
static svn_error_t *
create_db_logs_lock(svn_repos_t *repos, apr_pool_t *pool) {
const char *contents;
const char *lockfile_path;
lockfile_path = svn_repos_db_logs_lockfile(repos, pool);
if (strcmp(repos->fs_type, SVN_FS_TYPE_BDB) == 0)
contents = bdb_logs_lock_file_contents;
else
contents = pre12_compat_unneeded_file_contents;
SVN_ERR_W(svn_io_file_create(lockfile_path, contents, pool),
_("Creating db logs lock file"));
return SVN_NO_ERROR;
}
/* Create the DB lockfile. */
static svn_error_t *
create_db_lock(svn_repos_t *repos, apr_pool_t *pool) {
const char *contents;
const char *lockfile_path;
lockfile_path = svn_repos_db_lockfile(repos, pool);
if (strcmp(repos->fs_type, SVN_FS_TYPE_BDB) == 0)
contents = bdb_lock_file_contents;
else
contents = pre12_compat_unneeded_file_contents;
SVN_ERR_W(svn_io_file_create(lockfile_path, contents, pool),
_("Creating db lock file"));
return SVN_NO_ERROR;
}
static svn_error_t *
create_locks(svn_repos_t *repos, apr_pool_t *pool)
{
/* Create the locks directory. */
SVN_ERR_W(create_repos_dir(repos->lock_path, pool),
_("Creating lock dir"));
SVN_ERR(create_db_lock(repos, pool));
return create_db_logs_lock(repos, pool);
}
#define HOOKS_ENVIRONMENT_TEXT \
"# The hook program runs in an empty environment, unless the server is" NL \
"# explicitly configured otherwise. For example, a common problem is for" NL \
"# the PATH environment variable to not be set to its usual value, so" NL \
"# that subprograms fail to launch unless invoked via absolute path." NL \
"# If you're having unexpected problems with a hook program, the" NL \
"# culprit may be unusual (or missing) environment variables." NL
#define PREWRITTEN_HOOKS_TEXT \
"# For more examples and pre-written hooks, see those in" NL \
"# the Subversion repository at" NL \
"# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and" NL \
"# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/" NL
#define HOOKS_QUOTE_ARGUMENTS_TEXT \
"# CAUTION:" NL \
"# For security reasons, you MUST always properly quote arguments when" NL \
"# you use them, as those arguments could contain whitespace or other" NL \
"# problematic characters. Additionally, you should delimit the list" NL \
"# of options with \"--\" before passing the arguments, so malicious" NL \
"# clients cannot bootleg unexpected options to the commands your" NL \
"# script aims to execute." NL \
"# For similar reasons, you should also add a trailing @ to URLs which" NL \
"# are passed to SVN commands accepting URLs with peg revisions." NL
/* Return template text for a hook script named SCRIPT_NAME. Include
* DESCRIPTION and SCRIPT in the template text.
*/
static const char *
hook_template_text(const char *script_name,
const char *description,
const char *script,
apr_pool_t *result_pool)
{
return apr_pstrcat(result_pool,
"#!/bin/sh" NL
"" NL,
description,
"#" NL
"# The default working directory for the invocation is undefined, so" NL
"# the program should set one explicitly if it cares." NL
"#" NL
"# On a Unix system, the normal procedure is to have '", script_name, "'" NL
"# invoke other programs to do the real work, though it may do the" NL
"# work itself too." NL
"#" NL
"# Note that '", script_name, "' must be executable by the user(s) who will" NL
"# invoke it (typically the user httpd runs as), and that user must" NL
"# have filesystem-level permission to access the repository." NL
"#" NL
"# On a Windows system, you should name the hook program" NL
"# '", script_name, ".bat' or '", script_name, ".exe'," NL
"# but the basic idea is the same." NL
"#" NL
HOOKS_ENVIRONMENT_TEXT
"#" NL
HOOKS_QUOTE_ARGUMENTS_TEXT
"#" NL
"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
PREWRITTEN_HOOKS_TEXT
"" NL
"" NL,
script,
SVN_VA_NULL);
}
/* Write a template file for a hook script named SCRIPT_NAME (appending
* '.tmpl' to that name) in REPOS. Include DESCRIPTION and SCRIPT in the
* template text.
*/
static svn_error_t *
write_hook_template_file(svn_repos_t *repos, const char *script_name,
const char *description,
const char *script,
apr_pool_t *pool)
{
const char *template_path
= svn_dirent_join(repos->hook_path,
apr_psprintf(pool, "%s%s",
script_name, SVN_REPOS__HOOK_DESC_EXT),
pool);
const char *contents
= hook_template_text(script_name, description, script, pool);
SVN_ERR(svn_io_file_create(template_path, contents, pool));
SVN_ERR(svn_io_set_file_executable(template_path, TRUE, FALSE, pool));
return SVN_NO_ERROR;
}
/* Write the hook template files in REPOS.
*/
static svn_error_t *
create_hooks(svn_repos_t *repos, apr_pool_t *pool)
{
const char *description, *script;
/* Create the hook directory. */
SVN_ERR_W(create_repos_dir(repos->hook_path, pool),
_("Creating hook directory"));
/*** Write a default template for each standard hook file. */
/* Start-commit hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_START_COMMIT
description =
"# START-COMMIT HOOK" NL
"#" NL
"# The start-commit hook is invoked immediately after a Subversion txn is" NL
"# created and populated with initial revprops in the process of doing a" NL
"# commit. Subversion runs this hook by invoking a program (script, " NL
"# executable, binary, etc.) named '"SCRIPT_NAME"' (for which this file" NL
"# is a template) with the following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] USER (the authenticated user attempting to commit)" NL
"# [3] CAPABILITIES (a colon-separated list of capabilities reported" NL
"# by the client; see note below)" NL
"# [4] TXN-NAME (the name of the commit txn just created)" NL
"#" NL
"# Note: The CAPABILITIES parameter is new in Subversion 1.5, and 1.5" NL
"# clients will typically report at least the \"" \
SVN_RA_CAPABILITY_MERGEINFO "\" capability." NL
"# If there are other capabilities, then the list is colon-separated," NL
"# e.g.: \"" SVN_RA_CAPABILITY_MERGEINFO ":some-other-capability\" " \
"(the order is undefined)." NL
"#" NL
"# Note: The TXN-NAME parameter is new in Subversion 1.8. Prior to version" NL
"# 1.8, the start-commit hook was invoked before the commit txn was even" NL
"# created, so the ability to inspect the commit txn and its metadata from" NL
"# within the start-commit hook was not possible." NL
"# " NL
"# The list is self-reported by the client. Therefore, you should not" NL
"# make security assumptions based on the capabilities list, nor should" NL
"# you assume that clients reliably report every capability they have." NL
"#" NL
"# If the hook program exits with success, the commit continues; but" NL
"# if it exits with failure (non-zero), the commit is stopped before" NL
"# a Subversion txn is created, and STDERR is returned to the client." NL;
script =
"REPOS=\"$1\"" NL
"USER=\"$2\"" NL
"" NL
"commit-allower.pl --repository \"$REPOS\" --user \"$USER\" || exit 1" NL
"special-auth-check.py --user \"$USER\" --auth-level 3 || exit 1" NL
"" NL
"# All checks passed, so allow the commit." NL
"exit 0" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating start-commit hook"));
#undef SCRIPT_NAME
/* Pre-commit hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_COMMIT
description =
"# PRE-COMMIT HOOK" NL
"#" NL
"# The pre-commit hook is invoked before a Subversion txn is" NL
"# committed. Subversion runs this hook by invoking a program" NL
"# (script, executable, binary, etc.) named '"SCRIPT_NAME"' (for which" NL
"# this file is a template), with the following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] TXN-NAME (the name of the txn about to be committed)" NL
"#" NL
"# [STDIN] LOCK-TOKENS ** the lock tokens are passed via STDIN." NL
"#" NL
"# If STDIN contains the line \"LOCK-TOKENS:\\n\" (the \"\\n\" denotes a" NL
"# single newline), the lines following it are the lock tokens for" NL
"# this commit. The end of the list is marked by a line containing" NL
"# only a newline character." NL
"#" NL
"# Each lock token line consists of a URI-escaped path, followed" NL
"# by the separator character '|', followed by the lock token string," NL
"# followed by a newline." NL
"#" NL
"# If the hook program exits with success, the txn is committed; but" NL
"# if it exits with failure (non-zero), the txn is aborted, no commit" NL
"# takes place, and STDERR is returned to the client. The hook" NL
"# program can use the 'svnlook' utility to help it examine the txn." NL
"#" NL
"# *** NOTE: THE HOOK PROGRAM MUST NOT MODIFY THE TXN, EXCEPT ***" NL
"# *** FOR REVISION PROPERTIES (like svn:log or svn:author). ***" NL
"#" NL
"# This is why we recommend using the read-only 'svnlook' utility." NL
"# In the future, Subversion may enforce the rule that pre-commit" NL
"# hooks should not modify the versioned data in txns, or else come" NL
"# up with a mechanism to make it safe to do so (by informing the" NL
"# committing client of the changes). However, right now neither" NL
"# mechanism is implemented, so hook writers just have to be careful." NL;
script =
"REPOS=\"$1\"" NL
"TXN=\"$2\"" NL
"" NL
"# Make sure that the log message contains some text." NL
"SVNLOOK=" SVN_BINDIR "/svnlook" NL
"$SVNLOOK log -t \"$TXN\" \"$REPOS\" | \\" NL
" grep \"[a-zA-Z0-9]\" > /dev/null || exit 1" NL
"" NL
"# Check that the author of this commit has the rights to perform" NL
"# the commit on the files and directories being modified." NL
"commit-access-control.pl \"$REPOS\" \"$TXN\" commit-access-control.cfg || exit 1"
NL
"" NL
"# All checks passed, so allow the commit." NL
"exit 0" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating pre-commit hook"));
#undef SCRIPT_NAME
/* Pre-revprop-change hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_REVPROP_CHANGE
description =
"# PRE-REVPROP-CHANGE HOOK" NL
"#" NL
"# The pre-revprop-change hook is invoked before a revision property" NL
"# is added, modified or deleted. Subversion runs this hook by invoking" NL
"# a program (script, executable, binary, etc.) named '"SCRIPT_NAME"'" NL
"# (for which this file is a template), with the following ordered" NL
"# arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] REV (the revision being tweaked)" NL
"# [3] USER (the username of the person tweaking the property)" NL
"# [4] PROPNAME (the property being set on the revision)" NL
"# [5] ACTION (the property is being 'A'dded, 'M'odified, or 'D'eleted)"
NL
"#" NL
"# [STDIN] PROPVAL ** the new property value is passed via STDIN." NL
"#" NL
"# If the hook program exits with success, the propchange happens; but" NL
"# if it exits with failure (non-zero), the propchange doesn't happen." NL
"# The hook program can use the 'svnlook' utility to examine the " NL
"# existing value of the revision property." NL
"#" NL
"# WARNING: unlike other hooks, this hook MUST exist for revision" NL
"# properties to be changed. If the hook does not exist, Subversion " NL
"# will behave as if the hook were present, but failed. The reason" NL
"# for this is that revision properties are UNVERSIONED, meaning that" NL
"# a successful propchange is destructive; the old value is gone" NL
"# forever. We recommend the hook back up the old value somewhere." NL;
script =
"REPOS=\"$1\"" NL
"REV=\"$2\"" NL
"USER=\"$3\"" NL
"PROPNAME=\"$4\"" NL
"ACTION=\"$5\"" NL
"" NL
"if [ \"$ACTION\" = \"M\" -a \"$PROPNAME\" = \"svn:log\" ]; then exit 0; fi" NL
"" NL
"echo \"Changing revision properties other than svn:log is prohibited\" >&2" NL
"exit 1" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating pre-revprop-change hook"));
#undef SCRIPT_NAME
/* Pre-lock hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_LOCK
description =
"# PRE-LOCK HOOK" NL
"#" NL
"# The pre-lock hook is invoked before an exclusive lock is" NL
"# created. Subversion runs this hook by invoking a program " NL
"# (script, executable, binary, etc.) named '"SCRIPT_NAME"' (for which" NL
"# this file is a template), with the following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] PATH (the path in the repository about to be locked)" NL
"# [3] USER (the user creating the lock)" NL
"# [4] COMMENT (the comment of the lock)" NL
"# [5] STEAL-LOCK (1 if the user is trying to steal the lock, else 0)" NL
"#" NL
"# If the hook program outputs anything on stdout, the output string will" NL
"# be used as the lock token for this lock operation. If you choose to use" NL
"# this feature, you must guarantee the tokens generated are unique across" NL
"# the repository each time." NL
"#" NL
"# If the hook program exits with success, the lock is created; but" NL
"# if it exits with failure (non-zero), the lock action is aborted" NL
"# and STDERR is returned to the client." NL;
script =
"REPOS=\"$1\"" NL
"PATH=\"$2\"" NL
"USER=\"$3\"" NL
"COMMENT=\"$4\"" NL
"STEAL=\"$5\"" NL
"" NL
"# If a lock exists and is owned by a different person, don't allow it" NL
"# to be stolen (e.g., with 'svn lock --force ...')." NL
"" NL
"# (Maybe this script could send email to the lock owner?)" NL
"SVNLOOK=" SVN_BINDIR "/svnlook" NL
"GREP=/bin/grep" NL
"SED=/bin/sed" NL
"" NL
"LOCK_OWNER=`$SVNLOOK lock \"$REPOS\" \"$PATH\" | \\" NL
" $GREP '^Owner: ' | $SED 's/Owner: //'`" NL
"" NL
"# If we get no result from svnlook, there's no lock, allow the lock to" NL
"# happen:" NL
"if [ \"$LOCK_OWNER\" = \"\" ]; then" NL
" exit 0" NL
"fi" NL
"" NL
"# If the person locking matches the lock's owner, allow the lock to" NL
"# happen:" NL
"if [ \"$LOCK_OWNER\" = \"$USER\" ]; then" NL
" exit 0" NL
"fi" NL
"" NL
"# Otherwise, we've got an owner mismatch, so return failure:" NL
"echo \"Error: $PATH already locked by ${LOCK_OWNER}.\" 1>&2" NL
"exit 1" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating pre-lock hook"));
#undef SCRIPT_NAME
/* Pre-unlock hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_UNLOCK
description =
"# PRE-UNLOCK HOOK" NL
"#" NL
"# The pre-unlock hook is invoked before an exclusive lock is" NL
"# destroyed. Subversion runs this hook by invoking a program " NL
"# (script, executable, binary, etc.) named '"SCRIPT_NAME"' (for which" NL
"# this file is a template), with the following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] PATH (the path in the repository about to be unlocked)" NL
"# [3] USER (the user destroying the lock)" NL
"# [4] TOKEN (the lock token to be destroyed)" NL
"# [5] BREAK-UNLOCK (1 if the user is breaking the lock, else 0)" NL
"#" NL
"# If the hook program exits with success, the lock is destroyed; but" NL
"# if it exits with failure (non-zero), the unlock action is aborted" NL
"# and STDERR is returned to the client." NL;
script =
"REPOS=\"$1\"" NL
"PATH=\"$2\"" NL
"USER=\"$3\"" NL
"TOKEN=\"$4\"" NL
"BREAK=\"$5\"" NL
"" NL
"# If a lock is owned by a different person, don't allow it be broken." NL
"# (Maybe this script could send email to the lock owner?)" NL
"" NL
"SVNLOOK=" SVN_BINDIR "/svnlook" NL
"GREP=/bin/grep" NL
"SED=/bin/sed" NL
"" NL
"LOCK_OWNER=`$SVNLOOK lock \"$REPOS\" \"$PATH\" | \\" NL
" $GREP '^Owner: ' | $SED 's/Owner: //'`" NL
"" NL
"# If we get no result from svnlook, there's no lock, return success:" NL
"if [ \"$LOCK_OWNER\" = \"\" ]; then" NL
" exit 0" NL
"fi" NL
"" NL
"# If the person unlocking matches the lock's owner, return success:" NL
"if [ \"$LOCK_OWNER\" = \"$USER\" ]; then" NL
" exit 0" NL
"fi" NL
"" NL
"# Otherwise, we've got an owner mismatch, so return failure:" NL
"echo \"Error: $PATH locked by ${LOCK_OWNER}.\" 1>&2" NL
"exit 1" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating pre-unlock hook"));
#undef SCRIPT_NAME
/* Post-commit hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_COMMIT
description =
"# POST-COMMIT HOOK" NL
"#" NL
"# The post-commit hook is invoked after a commit. Subversion runs" NL
"# this hook by invoking a program (script, executable, binary, etc.)" NL
"# named '"SCRIPT_NAME"' (for which this file is a template) with the " NL
"# following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] REV (the number of the revision just committed)" NL
"# [3] TXN-NAME (the name of the transaction that has become REV)" NL
"#" NL
"# Because the commit has already completed and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
"# can use the 'svnlook' utility to help it examine the" NL
"# newly-committed tree." NL;
script =
"REPOS=\"$1\"" NL
"REV=\"$2\"" NL
"TXN_NAME=\"$3\"" NL
NL
"mailer.py commit \"$REPOS\" \"$REV\" /path/to/mailer.conf" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating post-commit hook"));
#undef SCRIPT_NAME
/* Post-lock hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_LOCK
description =
"# POST-LOCK HOOK" NL
"#" NL
"# The post-lock hook is run after a path is locked. Subversion runs" NL
"# this hook by invoking a program (script, executable, binary, etc.)" NL
"# named '"SCRIPT_NAME"' (for which this file is a template) with the " NL
"# following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] USER (the user who created the lock)" NL
"#" NL
"# The paths that were just locked are passed to the hook via STDIN." NL
"#" NL
"# Because the locks have already been created and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
"# can use the 'svnlook' utility to examine the paths in the repository" NL
-"# but since the hook is invoked asyncronously the newly-created locks" NL
+"# but since the hook is invoked asynchronously the newly-created locks" NL
"# may no longer be present." NL;
script =
"REPOS=\"$1\"" NL
"USER=\"$2\"" NL
"" NL
"# Send email to interested parties, let them know a lock was created:" NL
"mailer.py lock \"$REPOS\" \"$USER\" /path/to/mailer.conf" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating post-lock hook"));
#undef SCRIPT_NAME
/* Post-unlock hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_UNLOCK
description =
"# POST-UNLOCK HOOK" NL
"#" NL
"# The post-unlock hook runs after a path is unlocked. Subversion runs" NL
"# this hook by invoking a program (script, executable, binary, etc.)" NL
"# named '"SCRIPT_NAME"' (for which this file is a template) with the " NL
"# following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] USER (the user who destroyed the lock)" NL
"#" NL
"# The paths that were just unlocked are passed to the hook via STDIN." NL
"#" NL
"# Because the lock has already been destroyed and cannot be undone," NL
"# the exit code of the hook program is ignored." NL;
script =
"REPOS=\"$1\"" NL
"USER=\"$2\"" NL
"" NL
"# Send email to interested parties, let them know a lock was removed:" NL
"mailer.py unlock \"$REPOS\" \"$USER\" /path/to/mailer.conf" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating post-unlock hook"));
#undef SCRIPT_NAME
/* Post-revprop-change hook. */
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_REVPROP_CHANGE
description =
"# POST-REVPROP-CHANGE HOOK" NL
"#" NL
"# The post-revprop-change hook is invoked after a revision property" NL
"# has been added, modified or deleted. Subversion runs this hook by" NL
"# invoking a program (script, executable, binary, etc.) named" NL
"# '"SCRIPT_NAME"' (for which this file is a template), with the" NL
"# following ordered arguments:" NL
"#" NL
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] REV (the revision that was tweaked)" NL
"# [3] USER (the username of the person tweaking the property)" NL
"# [4] PROPNAME (the property that was changed)" NL
"# [5] ACTION (the property was 'A'dded, 'M'odified, or 'D'eleted)" NL
"#" NL
"# [STDIN] PROPVAL ** the old property value is passed via STDIN." NL
"#" NL
"# Because the propchange has already completed and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
"# can use the 'svnlook' utility to help it examine the" NL
"# new property value." NL;
script =
"REPOS=\"$1\"" NL
"REV=\"$2\"" NL
"USER=\"$3\"" NL
"PROPNAME=\"$4\"" NL
"ACTION=\"$5\"" NL
"" NL
"mailer.py propchange2 \"$REPOS\" \"$REV\" \"$USER\" \"$PROPNAME\" "
"\"$ACTION\" /path/to/mailer.conf" NL;
SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
description, script, pool),
_("Creating post-revprop-change hook"));
#undef SCRIPT_NAME
return SVN_NO_ERROR;
}
static svn_error_t *
create_conf(svn_repos_t *repos, apr_pool_t *pool)
{
SVN_ERR_W(create_repos_dir(repos->conf_path, pool),
_("Creating conf directory"));
/* Write a default template for svnserve.conf. */
{
static const char * const svnserve_conf_contents =
"### This file controls the configuration of the svnserve daemon, if you" NL
"### use it to allow access to this repository. (If you only allow" NL
"### access through http: and/or file: URLs, then this file is" NL
"### irrelevant.)" NL
"" NL
"### Visit http://subversion.apache.org/ for more information." NL
"" NL
"[general]" NL
"### The anon-access and auth-access options control access to the" NL
"### repository for unauthenticated (a.k.a. anonymous) users and" NL
"### authenticated users, respectively." NL
"### Valid values are \"write\", \"read\", and \"none\"." NL
"### Setting the value to \"none\" prohibits both reading and writing;" NL
"### \"read\" allows read-only access, and \"write\" allows complete " NL
"### read/write access to the repository." NL
"### The sample settings below are the defaults and specify that anonymous" NL
"### users have read-only access to the repository, while authenticated" NL
"### users have read and write access to the repository." NL
"# anon-access = read" NL
"# auth-access = write" NL
"### The password-db option controls the location of the password" NL
"### database file. Unless you specify a path starting with a /," NL
"### the file's location is relative to the directory containing" NL
"### this configuration file." NL
"### If SASL is enabled (see below), this file will NOT be used." NL
"### Uncomment the line below to use the default password file." NL
"# password-db = passwd" NL
"### The authz-db option controls the location of the authorization" NL
"### rules for path-based access control. Unless you specify a path" NL
"### starting with a /, the file's location is relative to the" NL
"### directory containing this file. The specified path may be a" NL
"### repository relative URL (^/) or an absolute file:// URL to a text" NL
"### file in a Subversion repository. If you don't specify an authz-db," NL
"### no path-based access control is done." NL
"### Uncomment the line below to use the default authorization file." NL
"# authz-db = " SVN_REPOS__CONF_AUTHZ NL
"### The groups-db option controls the location of the file with the" NL
"### group definitions and allows maintaining groups separately from the" NL
"### authorization rules. The groups-db file is of the same format as the" NL
"### authz-db file and should contain a single [groups] section with the" NL
"### group definitions. If the option is enabled, the authz-db file cannot" NL
"### contain a [groups] section. Unless you specify a path starting with" NL
"### a /, the file's location is relative to the directory containing this" NL
"### file. The specified path may be a repository relative URL (^/) or an" NL
"### absolute file:// URL to a text file in a Subversion repository." NL
"### This option is not being used by default." NL
"# groups-db = " SVN_REPOS__CONF_GROUPS NL
"### This option specifies the authentication realm of the repository." NL
"### If two repositories have the same authentication realm, they should" NL
"### have the same password database, and vice versa. The default realm" NL
"### is repository's uuid." NL
"# realm = My First Repository" NL
"### The force-username-case option causes svnserve to case-normalize" NL
"### usernames before comparing them against the authorization rules in the" NL
"### authz-db file configured above. Valid values are \"upper\" (to upper-" NL
"### case the usernames), \"lower\" (to lowercase the usernames), and" NL
"### \"none\" (to compare usernames as-is without case conversion, which" NL
"### is the default behavior)." NL
"# force-username-case = none" NL
"### The hooks-env options specifies a path to the hook script environment " NL
"### configuration file. This option overrides the per-repository default" NL
"### and can be used to configure the hook script environment for multiple " NL
"### repositories in a single file, if an absolute path is specified." NL
"### Unless you specify an absolute path, the file's location is relative" NL
"### to the directory containing this file." NL
"# hooks-env = " SVN_REPOS__CONF_HOOKS_ENV NL
"" NL
"[sasl]" NL
"### This option specifies whether you want to use the Cyrus SASL" NL
"### library for authentication. Default is false." NL
"### This section will be ignored if svnserve is not built with Cyrus" NL
"### SASL support; to check, run 'svnserve --version' and look for a line" NL
"### reading 'Cyrus SASL authentication is available.'" NL
"# use-sasl = true" NL
"### These options specify the desired strength of the security layer" NL
"### that you want SASL to provide. 0 means no encryption, 1 means" NL
"### integrity-checking only, values larger than 1 are correlated" NL
"### to the effective key length for encryption (e.g. 128 means 128-bit" NL
"### encryption). The values below are the defaults." NL
"# min-encryption = 0" NL
"# max-encryption = 256" NL;
SVN_ERR_W(svn_io_file_create(svn_repos_svnserve_conf(repos, pool),
svnserve_conf_contents, pool),
_("Creating svnserve.conf file"));
}
{
static const char * const passwd_contents =
"### This file is an example password file for svnserve." NL
"### Its format is similar to that of svnserve.conf. As shown in the" NL
"### example below it contains one section labelled [users]." NL
"### The name and password for each user follow, one account per line." NL
"" NL
"[users]" NL
"# harry = harryssecret" NL
"# sally = sallyssecret" NL;
SVN_ERR_W(svn_io_file_create(svn_dirent_join(repos->conf_path,
SVN_REPOS__CONF_PASSWD,
pool),
passwd_contents, pool),
_("Creating passwd file"));
}
{
static const char * const authz_contents =
"### This file is an example authorization file for svnserve." NL
"### Its format is identical to that of mod_authz_svn authorization" NL
"### files." NL
"### As shown below each section defines authorizations for the path and" NL
"### (optional) repository specified by the section name." NL
"### The authorizations follow. An authorization line can refer to:" NL
"### - a single user," NL
"### - a group of users defined in a special [groups] section," NL
"### - an alias defined in a special [aliases] section," NL
"### - all authenticated users, using the '$authenticated' token," NL
"### - only anonymous users, using the '$anonymous' token," NL
"### - anyone, using the '*' wildcard." NL
"###" NL
"### A match can be inverted by prefixing the rule with '~'. Rules can" NL
"### grant read ('r') access, read-write ('rw') access, or no access" NL
"### ('')." NL
"" NL
"[aliases]" NL
"# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average" NL
"" NL
"[groups]" NL
"# harry_and_sally = harry,sally" NL
"# harry_sally_and_joe = harry,sally,&joe" NL
"" NL
"# [/foo/bar]" NL
"# harry = rw" NL
"# &joe = r" NL
"# * =" NL
"" NL
"# [repository:/baz/fuz]" NL
"# @harry_and_sally = rw" NL
"# * = r" NL;
SVN_ERR_W(svn_io_file_create(svn_dirent_join(repos->conf_path,
SVN_REPOS__CONF_AUTHZ,
pool),
authz_contents, pool),
_("Creating authz file"));
}
{
static const char * const hooks_env_contents =
"### This file is an example hook script environment configuration file." NL
"### Hook scripts run in an empty environment by default." NL
"### As shown below each section defines environment variables for a" NL
"### particular hook script. The [default] section defines environment" NL
"### variables for all hook scripts, unless overridden by a hook-specific" NL
"### section." NL
"" NL
"### This example configures a UTF-8 locale for all hook scripts, so that " NL
"### special characters, such as umlauts, may be printed to stderr." NL
"### If UTF-8 is used with a mod_dav_svn server, the SVNUseUTF8 option must" NL
"### also be set to 'yes' in httpd.conf." NL
"### With svnserve, the LANG environment variable of the svnserve process" NL
"### must be set to the same value as given here." NL
"[default]" NL
"LANG = en_US.UTF-8" NL
"" NL
"### This sets the PATH environment variable for the pre-commit hook." NL
"[pre-commit]" NL
"PATH = /usr/local/bin:/usr/bin:/usr/sbin" NL;
SVN_ERR_W(svn_io_file_create(svn_dirent_join(repos->conf_path,
SVN_REPOS__CONF_HOOKS_ENV \
SVN_REPOS__HOOK_DESC_EXT,
pool),
hooks_env_contents, pool),
_("Creating hooks-env file"));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_hooks_setenv(svn_repos_t *repos,
const char *hooks_env_path,
apr_pool_t *scratch_pool)
{
if (hooks_env_path == NULL)
repos->hooks_env_path = svn_dirent_join(repos->conf_path,
SVN_REPOS__CONF_HOOKS_ENV,
repos->pool);
else if (!svn_dirent_is_absolute(hooks_env_path))
repos->hooks_env_path = svn_dirent_join(repos->conf_path,
hooks_env_path,
repos->pool);
else
repos->hooks_env_path = apr_pstrdup(repos->pool, hooks_env_path);
return SVN_NO_ERROR;
}
/* Allocate and return a new svn_repos_t * object, initializing the
directory pathname members based on PATH, and initializing the
REPOSITORY_CAPABILITIES member.
The members FS, FORMAT, and FS_TYPE are *not* initialized (they are null),
and it is the caller's responsibility to fill them in if needed. */
static svn_repos_t *
create_svn_repos_t(const char *path, apr_pool_t *pool)
{
svn_repos_t *repos = apr_pcalloc(pool, sizeof(*repos));
repos->path = apr_pstrdup(pool, path);
repos->db_path = svn_dirent_join(path, SVN_REPOS__DB_DIR, pool);
repos->conf_path = svn_dirent_join(path, SVN_REPOS__CONF_DIR, pool);
repos->hook_path = svn_dirent_join(path, SVN_REPOS__HOOK_DIR, pool);
repos->lock_path = svn_dirent_join(path, SVN_REPOS__LOCK_DIR, pool);
repos->hooks_env_path = NULL;
repos->repository_capabilities = apr_hash_make(pool);
repos->pool = pool;
return repos;
}
static svn_error_t *
create_repos_structure(svn_repos_t *repos,
const char *path,
apr_hash_t *fs_config,
apr_pool_t *pool)
{
/* Create the top-level repository directory. */
SVN_ERR_W(create_repos_dir(path, pool),
_("Could not create top-level directory"));
/* Create the DAV sandbox directory if pre-1.4 or pre-1.5-compatible. */
if (fs_config
&& (svn_hash_gets(fs_config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE)
|| svn_hash_gets(fs_config, SVN_FS_CONFIG_PRE_1_5_COMPATIBLE)))
{
const char *dav_path = svn_dirent_join(repos->path,
SVN_REPOS__DAV_DIR, pool);
SVN_ERR_W(create_repos_dir(dav_path, pool),
_("Creating DAV sandbox dir"));
}
/* Create the lock directory. */
SVN_ERR(create_locks(repos, pool));
/* Create the hooks directory. */
SVN_ERR(create_hooks(repos, pool));
/* Create the conf directory. */
SVN_ERR(create_conf(repos, pool));
/* Write the top-level README file. */
{
const char * const readme_header =
"This is a Subversion repository; use the 'svnadmin' and 'svnlook' " NL
"tools to examine it. Do not add, delete, or modify files here " NL
"unless you know how to avoid corrupting the repository." NL
"" NL;
const char * const readme_bdb_insert =
"The directory \"" SVN_REPOS__DB_DIR "\" contains a Berkeley DB environment." NL
"you may need to tweak the values in \"" SVN_REPOS__DB_DIR "/DB_CONFIG\" to match the" NL
"requirements of your site." NL
"" NL;
const char * const readme_footer =
"Visit http://subversion.apache.org/ for more information." NL;
apr_file_t *f;
apr_size_t written;
SVN_ERR(svn_io_file_open(&f,
svn_dirent_join(path, SVN_REPOS__README, pool),
(APR_WRITE | APR_CREATE | APR_EXCL),
APR_OS_DEFAULT, pool));
SVN_ERR(svn_io_file_write_full(f, readme_header, strlen(readme_header),
&written, pool));
if (strcmp(repos->fs_type, SVN_FS_TYPE_BDB) == 0)
SVN_ERR(svn_io_file_write_full(f, readme_bdb_insert,
strlen(readme_bdb_insert),
&written, pool));
SVN_ERR(svn_io_file_write_full(f, readme_footer, strlen(readme_footer),
&written, pool));
return svn_io_file_close(f, pool);
}
}
/* There is, at present, nothing within the direct responsibility
of libsvn_repos which requires locking. For historical compatibility
reasons, the BDB libsvn_fs backend does not do its own locking, expecting
libsvn_repos to do the locking for it. Here we take care of that
backend-specific requirement.
The kind of lock is controlled by EXCLUSIVE and NONBLOCKING.
The lock is scoped to POOL. */
static svn_error_t *
lock_repos(svn_repos_t *repos,
svn_boolean_t exclusive,
svn_boolean_t nonblocking,
apr_pool_t *pool)
{
if (strcmp(repos->fs_type, SVN_FS_TYPE_BDB) == 0)
{
svn_error_t *err;
const char *lockfile_path = svn_repos_db_lockfile(repos, pool);
err = svn_io_file_lock2(lockfile_path, exclusive, nonblocking, pool);
if (err != NULL && APR_STATUS_IS_EAGAIN(err->apr_err))
return svn_error_trace(err);
SVN_ERR_W(err, _("Error opening db lockfile"));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_create(svn_repos_t **repos_p,
const char *path,
const char *unused_1,
const char *unused_2,
apr_hash_t *config,
apr_hash_t *fs_config,
apr_pool_t *result_pool)
{
svn_repos_t *repos;
svn_error_t *err;
apr_pool_t *scratch_pool = svn_pool_create(result_pool);
const char *root_path;
const char *local_abspath;
/* Allocate a repository object, filling in the format we will create. */
repos = create_svn_repos_t(path, result_pool);
repos->format = SVN_REPOS__FORMAT_NUMBER;
/* Discover the type of the filesystem we are about to create. */
repos->fs_type = svn_hash__get_cstring(fs_config, SVN_FS_CONFIG_FS_TYPE,
DEFAULT_FS_TYPE);
if (svn_hash__get_bool(fs_config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE, FALSE))
repos->format = SVN_REPOS__FORMAT_NUMBER_LEGACY;
/* Don't create a repository inside another repository. */
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
root_path = svn_repos_find_root_path(local_abspath, scratch_pool);
if (root_path != NULL)
{
if (strcmp(root_path, local_abspath) == 0)
return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("'%s' is an existing repository"),
svn_dirent_local_style(root_path,
scratch_pool));
else
return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("'%s' is a subdirectory of an existing "
"repository " "rooted at '%s'"),
svn_dirent_local_style(local_abspath,
scratch_pool),
svn_dirent_local_style(root_path,
scratch_pool));
}
/* Create the various files and subdirectories for the repository. */
SVN_ERR_W(create_repos_structure(repos, path, fs_config, scratch_pool),
_("Repository creation failed"));
/* Lock if needed. */
SVN_ERR(lock_repos(repos, FALSE, FALSE, scratch_pool));
/* Create an environment for the filesystem. */
if ((err = svn_fs_create(&repos->fs, repos->db_path, fs_config,
result_pool)))
{
/* If there was an error making the filesytem, e.g. unknown/supported
* filesystem type. Clean up after ourselves. Yes this is safe because
* create_repos_structure will fail if the path existed before we started
* so we can't accidentally remove a directory that previously existed.
*/
svn_pool_destroy(scratch_pool); /* Release lock to allow deleting dir */
return svn_error_trace(
svn_error_compose_create(
err,
svn_io_remove_dir2(path, FALSE, NULL, NULL,
result_pool)));
}
/* This repository is ready. Stamp it with a format number. */
SVN_ERR(svn_io_write_version_file
(svn_dirent_join(path, SVN_REPOS__FORMAT, scratch_pool),
repos->format, scratch_pool));
svn_pool_destroy(scratch_pool); /* Release lock */
*repos_p = repos;
return SVN_NO_ERROR;
}
/* Check if @a path is the root of a repository by checking if the
* path contains the expected files and directories. Return TRUE
* on errors (which would be permission errors, probably) so that
* we the user will see them after we try to open the repository
* for real. */
static svn_boolean_t
check_repos_path(const char *path,
apr_pool_t *pool)
{
svn_node_kind_t kind;
svn_error_t *err;
err = svn_io_check_path(svn_dirent_join(path, SVN_REPOS__FORMAT, pool),
&kind, pool);
if (err)
{
svn_error_clear(err);
return TRUE;
}
if (kind != svn_node_file)
return FALSE;
/* Check the db/ subdir, but allow it to be a symlink (Subversion
works just fine if it's a symlink). */
err = svn_io_check_resolved_path
(svn_dirent_join(path, SVN_REPOS__DB_DIR, pool), &kind, pool);
if (err)
{
svn_error_clear(err);
return TRUE;
}
if (kind != svn_node_dir)
return FALSE;
return TRUE;
}
/* Verify that REPOS's format is suitable.
Use POOL for temporary allocation. */
static svn_error_t *
check_repos_format(svn_repos_t *repos,
apr_pool_t *pool)
{
int format;
const char *format_path;
format_path = svn_dirent_join(repos->path, SVN_REPOS__FORMAT, pool);
SVN_ERR(svn_io_read_version_file(&format, format_path, pool));
if (format != SVN_REPOS__FORMAT_NUMBER &&
format != SVN_REPOS__FORMAT_NUMBER_LEGACY)
{
return svn_error_createf
(SVN_ERR_REPOS_UNSUPPORTED_VERSION, NULL,
_("Expected repository format '%d' or '%d'; found format '%d'"),
SVN_REPOS__FORMAT_NUMBER_LEGACY, SVN_REPOS__FORMAT_NUMBER,
format);
}
repos->format = format;
return SVN_NO_ERROR;
}
/* Set *REPOS_P to a repository at PATH which has been opened.
See lock_repos() above regarding EXCLUSIVE and NONBLOCKING.
OPEN_FS indicates whether the Subversion filesystem should be opened,
the handle being placed into repos->fs.
Do all allocation in POOL. */
static svn_error_t *
get_repos(svn_repos_t **repos_p,
const char *path,
svn_boolean_t exclusive,
svn_boolean_t nonblocking,
svn_boolean_t open_fs,
apr_hash_t *fs_config,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_repos_t *repos;
const char *fs_type;
/* Allocate a repository object. */
repos = create_svn_repos_t(path, result_pool);
/* Verify the validity of our repository format. */
SVN_ERR(check_repos_format(repos, scratch_pool));
/* Discover the FS type. */
SVN_ERR(svn_fs_type(&fs_type, repos->db_path, scratch_pool));
repos->fs_type = apr_pstrdup(result_pool, fs_type);
/* Lock if needed. */
SVN_ERR(lock_repos(repos, exclusive, nonblocking, result_pool));
/* Open up the filesystem only after obtaining the lock. */
if (open_fs)
SVN_ERR(svn_fs_open2(&repos->fs, repos->db_path, fs_config,
result_pool, scratch_pool));
#ifdef SVN_DEBUG_CRASH_AT_REPOS_OPEN
/* If $PATH/config/debug-abort exists, crash the server here.
This debugging feature can be used to test client recovery
when the server crashes.
See: Issue #4274 */
{
svn_node_kind_t kind;
svn_error_t *err = svn_io_check_path(
svn_dirent_join(repos->conf_path, "debug-abort", scratch_pool),
&kind, scratch_pool);
svn_error_clear(err);
if (!err && kind == svn_node_file)
SVN_ERR_MALFUNCTION_NO_RETURN();
}
#endif /* SVN_DEBUG_CRASH_AT_REPOS_OPEN */
*repos_p = repos;
return SVN_NO_ERROR;
}
const char *
svn_repos_find_root_path(const char *path,
apr_pool_t *pool)
{
const char *candidate = path;
const char *decoded;
svn_error_t *err;
while (1)
{
/* Try to decode the path, so we don't fail if it contains characters
that aren't supported by the OS filesystem. The subversion fs
isn't restricted by the OS filesystem character set. */
err = svn_path_cstring_from_utf8(&decoded, candidate, pool);
if (!err && check_repos_path(candidate, pool))
break;
svn_error_clear(err);
if (svn_path_is_empty(candidate) ||
svn_dirent_is_root(candidate, strlen(candidate)))
return NULL;
candidate = svn_dirent_dirname(candidate, pool);
}
return candidate;
}
svn_error_t *
svn_repos_open3(svn_repos_t **repos_p,
const char *path,
apr_hash_t *fs_config,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* Fetch a repository object initialized with a shared read/write
lock on the database. */
return get_repos(repos_p, path, FALSE, FALSE, TRUE, fs_config,
result_pool, scratch_pool);
}
/* Baton used with fs_upgrade_notify, specifying the svn_repos layer
* notification parameters.
*/
struct fs_upgrade_notify_baton_t
{
svn_repos_notify_func_t notify_func;
void *notify_baton;
};
/* Implements svn_fs_upgrade_notify_t as forwarding to a
* svn_repos_notify_func_t passed in a fs_upgrade_notify_baton_t* BATON.
*/
static svn_error_t *
fs_upgrade_notify(void *baton,
apr_uint64_t number,
svn_fs_upgrade_notify_action_t action,
apr_pool_t *pool)
{
struct fs_upgrade_notify_baton_t *fs_baton = baton;
svn_repos_notify_t *notify = svn_repos_notify_create(
svn_repos_notify_mutex_acquired, pool);
switch(action)
{
case svn_fs_upgrade_pack_revprops:
notify->shard = number;
notify->action = svn_repos_notify_pack_revprops;
break;
case svn_fs_upgrade_cleanup_revprops:
notify->shard = number;
notify->action = svn_repos_notify_cleanup_revprops;
break;
case svn_fs_upgrade_format_bumped:
notify->revision = number;
notify->action = svn_repos_notify_format_bumped;
break;
default:
/* unknown notification */
SVN_ERR_MALFUNCTION();
}
fs_baton->notify_func(fs_baton->notify_baton, notify, pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_upgrade2(const char *path,
svn_boolean_t nonblocking,
svn_repos_notify_func_t notify_func,
void *notify_baton,
apr_pool_t *pool)
{
svn_repos_t *repos;
const char *format_path;
int format;
apr_pool_t *subpool = svn_pool_create(pool);
struct fs_upgrade_notify_baton_t fs_notify_baton;
fs_notify_baton.notify_func = notify_func;
fs_notify_baton.notify_baton = notify_baton;
/* Fetch a repository object; for the Berkeley DB backend, it is
initialized with an EXCLUSIVE lock on the database. This will at
least prevent others from trying to read or write to it while we
run recovery. (Other backends should do their own locking; see
lock_repos.) */
SVN_ERR(get_repos(&repos, path, TRUE, nonblocking, FALSE, NULL, subpool,
subpool));
if (notify_func)
{
/* We notify *twice* here, because there are two different logistical
actions occuring. */
svn_repos_notify_t *notify = svn_repos_notify_create(
svn_repos_notify_mutex_acquired, subpool);
notify_func(notify_baton, notify, subpool);
notify->action = svn_repos_notify_upgrade_start;
notify_func(notify_baton, notify, subpool);
}
/* Try to overwrite with its own contents. We do this only to
verify that we can, because we don't want to actually bump the
format of the repository until our underlying filesystem claims
to have been upgraded correctly. */
format_path = svn_dirent_join(repos->path, SVN_REPOS__FORMAT, subpool);
SVN_ERR(svn_io_read_version_file(&format, format_path, subpool));
SVN_ERR(svn_io_write_version_file(format_path, format, subpool));
/* Try to upgrade the filesystem. */
SVN_ERR(svn_fs_upgrade2(repos->db_path,
notify_func ? fs_upgrade_notify : NULL,
&fs_notify_baton, NULL, NULL, subpool));
/* Now overwrite our format file with the latest version. */
SVN_ERR(svn_io_write_version_file(format_path, SVN_REPOS__FORMAT_NUMBER,
subpool));
/* Close shop and free the subpool, to release the exclusive lock. */
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_delete(const char *path,
apr_pool_t *pool)
{
const char *db_path = svn_dirent_join(path, SVN_REPOS__DB_DIR, pool);
/* Delete the filesystem environment... */
SVN_ERR(svn_fs_delete_fs(db_path, pool));
/* ...then blow away everything else. */
return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
}
/* Repository supports the capability. */
static const char *capability_yes = "yes";
/* Repository does not support the capability. */
static const char *capability_no = "no";
svn_error_t *
svn_repos_has_capability(svn_repos_t *repos,
svn_boolean_t *has,
const char *capability,
apr_pool_t *pool)
{
const char *val = svn_hash_gets(repos->repository_capabilities, capability);
if (val == capability_yes)
{
*has = TRUE;
}
else if (val == capability_no)
{
*has = FALSE;
}
/* Else don't know, so investigate. */
else if (strcmp(capability, SVN_REPOS_CAPABILITY_MERGEINFO) == 0)
{
svn_error_t *err;
svn_fs_root_t *root;
svn_mergeinfo_catalog_t ignored;
apr_array_header_t *paths = apr_array_make(pool, 1,
sizeof(char *));
SVN_ERR(svn_fs_revision_root(&root, repos->fs, 0, pool));
APR_ARRAY_PUSH(paths, const char *) = "";
err = svn_fs_get_mergeinfo2(&ignored, root, paths, FALSE, FALSE,
TRUE, pool, pool);
if (err)
{
if (err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
{
svn_error_clear(err);
svn_hash_sets(repos->repository_capabilities,
SVN_REPOS_CAPABILITY_MERGEINFO, capability_no);
*has = FALSE;
}
else if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
{
/* Mergeinfo requests use relative paths, and anyway we're
in r0, so we're likely to get this error -- but it
means the repository supports mergeinfo! */
svn_error_clear(err);
svn_hash_sets(repos->repository_capabilities,
SVN_REPOS_CAPABILITY_MERGEINFO, capability_yes);
*has = TRUE;
}
else
{
return svn_error_trace(err);
}
}
else
{
svn_hash_sets(repos->repository_capabilities,
SVN_REPOS_CAPABILITY_MERGEINFO, capability_yes);
*has = TRUE;
}
}
else
{
return svn_error_createf(SVN_ERR_UNKNOWN_CAPABILITY, 0,
_("unknown capability '%s'"), capability);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_capabilities(apr_hash_t **capabilities,
svn_repos_t *repos,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
static const char *const queries[] = {
SVN_REPOS_CAPABILITY_MERGEINFO,
NULL
};
const char *const *i;
*capabilities = apr_hash_make(result_pool);
for (i = queries; *i; i++)
{
svn_boolean_t has;
SVN_ERR(svn_repos_has_capability(repos, &has, *i, scratch_pool));
if (has)
svn_hash_sets(*capabilities, *i, *i);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_info_format(int *repos_format,
svn_version_t **supports_version,
svn_repos_t *repos,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
*repos_format = repos->format;
*supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
(*supports_version)->major = SVN_VER_MAJOR;
(*supports_version)->minor = 0;
(*supports_version)->patch = 0;
(*supports_version)->tag = "";
switch (repos->format)
{
case SVN_REPOS__FORMAT_NUMBER_LEGACY:
break;
case SVN_REPOS__FORMAT_NUMBER_1_4:
(*supports_version)->minor = 4;
break;
#ifdef SVN_DEBUG
# if SVN_REPOS__FORMAT_NUMBER != SVN_REPOS__FORMAT_NUMBER_1_4
# error "Need to add a 'case' statement here"
# endif
#endif
}
return SVN_NO_ERROR;
}
svn_fs_t *
svn_repos_fs(svn_repos_t *repos)
{
if (! repos)
return NULL;
return repos->fs;
}
const char *
svn_repos_fs_type(svn_repos_t *repos,
apr_pool_t *result_pool)
{
return apr_pstrdup(result_pool, repos->fs_type);
}
/* For historical reasons, for the Berkeley DB backend, this code uses
* repository locking, which is motivated by the need to support the
* Berkeley DB error DB_RUN_RECOVERY. (FSFS takes care of locking
* itself, inside its implementation of svn_fs_recover.) Here's how
* it works:
*
* Every accessor of a repository's database takes out a shared lock
* on the repository -- both readers and writers get shared locks, and
* there can be an unlimited number of shared locks simultaneously.
*
* Sometimes, a db access returns the error DB_RUN_RECOVERY. When
* this happens, we need to run svn_fs_recover() on the db
* with no other accessors present. So we take out an exclusive lock
* on the repository. From the moment we request the exclusive lock,
* no more shared locks are granted, and when the last shared lock
* disappears, the exclusive lock is granted. As soon as we get it,
* we can run recovery.
*
* We assume that once any berkeley call returns DB_RUN_RECOVERY, they
* all do, until recovery is run.
*/
svn_error_t *
svn_repos_recover4(const char *path,
svn_boolean_t nonblocking,
svn_repos_notify_func_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void * cancel_baton,
apr_pool_t *pool)
{
svn_repos_t *repos;
apr_pool_t *subpool = svn_pool_create(pool);
/* Fetch a repository object; for the Berkeley DB backend, it is
initialized with an EXCLUSIVE lock on the database. This will at
least prevent others from trying to read or write to it while we
run recovery. (Other backends should do their own locking; see
lock_repos.) */
SVN_ERR(get_repos(&repos, path, TRUE, nonblocking,
FALSE, /* don't try to open the db yet. */
NULL,
subpool, subpool));
if (notify_func)
{
/* We notify *twice* here, because there are two different logistical
actions occuring. */
svn_repos_notify_t *notify = svn_repos_notify_create(
svn_repos_notify_mutex_acquired, subpool);
notify_func(notify_baton, notify, subpool);
notify->action = svn_repos_notify_recover_start;
notify_func(notify_baton, notify, subpool);
}
/* Recover the database to a consistent state. */
SVN_ERR(svn_fs_recover(repos->db_path, cancel_func, cancel_baton, subpool));
/* Close shop and free the subpool, to release the exclusive lock. */
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
struct freeze_baton_t {
apr_array_header_t *paths;
int counter;
svn_repos_freeze_func_t freeze_func;
void *freeze_baton;
/* Scratch pool used for every freeze callback invocation. */
apr_pool_t *scratch_pool;
};
static svn_error_t *
multi_freeze(void *baton,
apr_pool_t *pool)
{
struct freeze_baton_t *fb = baton;
svn_pool_clear(fb->scratch_pool);
if (fb->counter == fb->paths->nelts)
{
SVN_ERR(fb->freeze_func(fb->freeze_baton, pool));
return SVN_NO_ERROR;
}
else
{
/* Using a subpool as the only way to unlock the repos lock used
by BDB is to clear the pool used to take the lock. */
apr_pool_t *subpool = svn_pool_create(pool);
const char *path = APR_ARRAY_IDX(fb->paths, fb->counter, const char *);
svn_repos_t *repos;
++fb->counter;
SVN_ERR(get_repos(&repos, path,
TRUE /* exclusive (only applies to BDB) */,
FALSE /* non-blocking */,
FALSE /* open-fs */,
NULL, subpool, fb->scratch_pool));
if (strcmp(repos->fs_type, SVN_FS_TYPE_BDB) == 0)
{
svn_error_t *err = multi_freeze(fb, subpool);
svn_pool_destroy(subpool);
return err;
}
else
{
SVN_ERR(svn_fs_open2(&repos->fs, repos->db_path, NULL, subpool,
fb->scratch_pool));
SVN_ERR(svn_fs_freeze(svn_repos_fs(repos), multi_freeze, fb,
subpool));
}
svn_pool_destroy(subpool);
}
return SVN_NO_ERROR;
}
/* For BDB we fall back on BDB's repos layer lock which means that the
repository is unreadable while frozen.
For FSFS we delegate to the FS layer which uses the FSFS write-lock
and an SQLite reserved lock which means the repository is readable
while frozen. */
svn_error_t *
svn_repos_freeze(apr_array_header_t *paths,
svn_repos_freeze_func_t freeze_func,
void *freeze_baton,
apr_pool_t *pool)
{
struct freeze_baton_t fb;
fb.paths = paths;
fb.counter = 0;
fb.freeze_func = freeze_func;
fb.freeze_baton = freeze_baton;
fb.scratch_pool = svn_pool_create(pool);
SVN_ERR(multi_freeze(&fb, pool));
svn_pool_destroy(fb.scratch_pool);
return SVN_NO_ERROR;
}
svn_error_t *svn_repos_db_logfiles(apr_array_header_t **logfiles,
const char *path,
svn_boolean_t only_unused,
apr_pool_t *pool)
{
svn_repos_t *repos;
int i;
SVN_ERR(get_repos(&repos, path,
FALSE, FALSE,
FALSE, /* Do not open fs. */
NULL,
pool, pool));
SVN_ERR(svn_fs_berkeley_logfiles(logfiles,
svn_repos_db_env(repos, pool),
only_unused,
pool));
/* Loop, printing log files. */
for (i = 0; i < (*logfiles)->nelts; i++)
{
const char ** log_file = &(APR_ARRAY_IDX(*logfiles, i, const char *));
*log_file = svn_dirent_join(SVN_REPOS__DB_DIR, *log_file, pool);
}
return SVN_NO_ERROR;
}
/* Baton for hotcopy_structure(). */
struct hotcopy_ctx_t {
const char *dest; /* target location to construct */
size_t src_len; /* len of the source path*/
/* As in svn_repos_hotcopy2() */
svn_boolean_t incremental;
svn_cancel_func_t cancel_func;
void *cancel_baton;
};
/* Copy the repository structure of PATH to BATON->DEST, with exception of
* @c SVN_REPOS__DB_DIR, @c SVN_REPOS__LOCK_DIR and @c SVN_REPOS__FORMAT;
* those directories and files are handled separately.
*
* BATON is a (struct hotcopy_ctx_t *). BATON->SRC_LEN is the length
* of PATH.
*
* Implements svn_io_walk_func_t.
*/
static svn_error_t *hotcopy_structure(void *baton,
const char *path,
const apr_finfo_t *finfo,
apr_pool_t *pool)
{
const struct hotcopy_ctx_t *ctx = baton;
const char *sub_path;
const char *target;
if (ctx->cancel_func)
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
if (strlen(path) == ctx->src_len)
{
sub_path = "";
}
else
{
sub_path = &path[ctx->src_len+1];
/* Check if we are inside db directory and if so skip it */
if (svn_path_compare_paths
(svn_dirent_get_longest_ancestor(SVN_REPOS__DB_DIR, sub_path, pool),
SVN_REPOS__DB_DIR) == 0)
return SVN_NO_ERROR;
if (svn_path_compare_paths
(svn_dirent_get_longest_ancestor(SVN_REPOS__LOCK_DIR, sub_path,
pool),
SVN_REPOS__LOCK_DIR) == 0)
return SVN_NO_ERROR;
if (svn_path_compare_paths
(svn_dirent_get_longest_ancestor(SVN_REPOS__FORMAT, sub_path, pool),
SVN_REPOS__FORMAT) == 0)
return SVN_NO_ERROR;
}
target = svn_dirent_join(ctx->dest, sub_path, pool);
if (finfo->filetype == APR_DIR)
{
svn_error_t *err;
err = create_repos_dir(target, pool);
if (ctx->incremental && err && err->apr_err == SVN_ERR_DIR_NOT_EMPTY)
{
svn_error_clear(err);
err = SVN_NO_ERROR;
}
return svn_error_trace(err);
}
else if (finfo->filetype == APR_REG)
return svn_io_copy_file(path, target, TRUE, pool);
else if (finfo->filetype == APR_LNK)
return svn_io_copy_link(path, target, pool);
else
return SVN_NO_ERROR;
}
/** Obtain a lock on db logs lock file. Create one if it does not exist.
*/
static svn_error_t *
lock_db_logs_file(svn_repos_t *repos,
svn_boolean_t exclusive,
apr_pool_t *pool)
{
const char * lock_file = svn_repos_db_logs_lockfile(repos, pool);
/* Try to create a lock file, in case if it is missing. As in case of the
repositories created before hotcopy functionality. */
svn_error_clear(create_db_logs_lock(repos, pool));
return svn_io_file_lock2(lock_file, exclusive, FALSE, pool);
}
/* Baton used with fs_hotcopy_notify(), specifying the svn_repos layer
* notification parameters.
*/
struct fs_hotcopy_notify_baton_t
{
svn_repos_notify_func_t notify_func;
void *notify_baton;
};
/* Implements svn_fs_hotcopy_notify_t as forwarding to a
* svn_repos_notify_func_t passed in a fs_hotcopy_notify_baton_t* BATON.
*/
static void
fs_hotcopy_notify(void *baton,
svn_revnum_t start_revision,
svn_revnum_t end_revision,
apr_pool_t *pool)
{
struct fs_hotcopy_notify_baton_t *fs_baton = baton;
svn_repos_notify_t *notify;
notify = svn_repos_notify_create(svn_repos_notify_hotcopy_rev_range, pool);
notify->start_revision = start_revision;
notify->end_revision = end_revision;
fs_baton->notify_func(fs_baton->notify_baton, notify, pool);
}
/* Make a copy of a repository with hot backup of fs. */
svn_error_t *
svn_repos_hotcopy3(const char *src_path,
const char *dst_path,
svn_boolean_t clean_logs,
svn_boolean_t incremental,
svn_repos_notify_func_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_fs_hotcopy_notify_t fs_notify_func;
struct fs_hotcopy_notify_baton_t fs_notify_baton;
struct hotcopy_ctx_t hotcopy_context;
const char *src_abspath;
const char *dst_abspath;
svn_repos_t *src_repos;
svn_repos_t *dst_repos;
svn_error_t *err;
SVN_ERR(svn_dirent_get_absolute(&src_abspath, src_path, scratch_pool));
SVN_ERR(svn_dirent_get_absolute(&dst_abspath, dst_path, scratch_pool));
if (strcmp(src_abspath, dst_abspath) == 0)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Hotcopy source and destination are equal"));
/* Try to open original repository */
SVN_ERR(get_repos(&src_repos, src_abspath,
FALSE, FALSE,
FALSE, /* don't try to open the db yet. */
NULL,
scratch_pool, scratch_pool));
/* If we are going to clean logs, then get an exclusive lock on
db-logs.lock, to ensure that no one else will work with logs.
If we are just copying, then get a shared lock to ensure that
no one else will clean logs while we copying them */
SVN_ERR(lock_db_logs_file(src_repos, clean_logs, scratch_pool));
/* Copy the repository to a new path, with exception of
specially handled directories */
hotcopy_context.dest = dst_abspath;
hotcopy_context.src_len = strlen(src_abspath);
hotcopy_context.incremental = incremental;
hotcopy_context.cancel_func = cancel_func;
hotcopy_context.cancel_baton = cancel_baton;
SVN_ERR(svn_io_dir_walk2(src_abspath,
0,
hotcopy_structure,
&hotcopy_context,
scratch_pool));
/* Prepare dst_repos object so that we may create locks,
so that we may open repository */
dst_repos = create_svn_repos_t(dst_abspath, scratch_pool);
dst_repos->fs_type = src_repos->fs_type;
dst_repos->format = src_repos->format;
err = create_locks(dst_repos, scratch_pool);
if (err)
{
if (incremental && err->apr_err == SVN_ERR_DIR_NOT_EMPTY)
svn_error_clear(err);
else
return svn_error_trace(err);
}
err = svn_io_dir_make_sgid(dst_repos->db_path, APR_OS_DEFAULT,
scratch_pool);
if (err)
{
if (incremental && APR_STATUS_IS_EEXIST(err->apr_err))
svn_error_clear(err);
else
return svn_error_trace(err);
}
/* Exclusively lock the new repository.
No one should be accessing it at the moment */
SVN_ERR(lock_repos(dst_repos, TRUE, FALSE, scratch_pool));
fs_notify_func = notify_func ? fs_hotcopy_notify : NULL;
fs_notify_baton.notify_func = notify_func;
fs_notify_baton.notify_baton = notify_baton;
SVN_ERR(svn_fs_hotcopy3(src_repos->db_path, dst_repos->db_path,
clean_logs, incremental,
fs_notify_func, &fs_notify_baton,
cancel_func, cancel_baton, scratch_pool));
/* Destination repository is ready. Stamp it with a format number. */
return svn_io_write_version_file
(svn_dirent_join(dst_repos->path, SVN_REPOS__FORMAT, scratch_pool),
dst_repos->format, scratch_pool);
}
/* Return the library version number. */
const svn_version_t *
svn_repos_version(void)
{
SVN_VERSION_BODY;
}
svn_error_t *
svn_repos_stat(svn_dirent_t **dirent,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
svn_node_kind_t kind;
svn_dirent_t *ent;
const char *datestring;
SVN_ERR(svn_fs_check_path(&kind, root, path, pool));
if (kind == svn_node_none)
{
*dirent = NULL;
return SVN_NO_ERROR;
}
ent = svn_dirent_create(pool);
ent->kind = kind;
if (kind == svn_node_file)
SVN_ERR(svn_fs_file_length(&(ent->size), root, path, pool));
SVN_ERR(svn_fs_node_has_props(&ent->has_props, root, path, pool));
SVN_ERR(svn_repos_get_committed_info(&(ent->created_rev),
&datestring,
&(ent->last_author),
root, path, pool));
if (datestring)
SVN_ERR(svn_time_from_cstring(&(ent->time), datestring, pool));
*dirent = ent;
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos_remember_client_capabilities(svn_repos_t *repos,
const apr_array_header_t *capabilities)
{
repos->client_capabilities = capabilities;
return SVN_NO_ERROR;
}
svn_error_t *
svn_repos__fs_type(const char **fs_type,
const char *repos_path,
apr_pool_t *pool)
{
svn_repos_t repos;
repos.path = (char*)repos_path;
SVN_ERR(check_repos_format(&repos, pool));
return svn_fs_type(fs_type,
svn_dirent_join(repos_path, SVN_REPOS__DB_DIR, pool),
pool);
}
Index: stable/11/contrib/subversion/subversion/libsvn_subr/config_file.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/config_file.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/config_file.c (revision 309511)
@@ -1,1421 +1,1431 @@
/*
* config_file.c : parsing configuration files
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <apr_lib.h>
#include <apr_env.h>
#include "config_impl.h"
#include "svn_io.h"
#include "svn_types.h"
#include "svn_dirent_uri.h"
#include "svn_auth.h"
#include "svn_hash.h"
#include "svn_subst.h"
#include "svn_utf.h"
#include "svn_pools.h"
#include "svn_user.h"
#include "svn_ctype.h"
#include "svn_private_config.h"
#include "private/svn_subr_private.h"
#ifdef __HAIKU__
# include <FindDirectory.h>
# include <StorageDefs.h>
#endif
/* Used to terminate lines in large multi-line string literals. */
#define NL APR_EOL_STR
/* File parsing context */
typedef struct parse_context_t
{
/* This config struct */
svn_config_t *cfg;
/* The stream struct */
svn_stream_t *stream;
/* The current line in the file */
int line;
/* Emulate an ungetc */
int ungotten_char;
/* Temporary strings */
svn_stringbuf_t *section;
svn_stringbuf_t *option;
svn_stringbuf_t *value;
/* Parser buffer for getc() to avoid call overhead into several libraries
for every character */
char parser_buffer[SVN__STREAM_CHUNK_SIZE]; /* Larger than most config files */
size_t buffer_pos; /* Current position within parser_buffer */
size_t buffer_size; /* parser_buffer contains this many bytes */
+
+ /* Non-zero if we hit EOF on the stream. */
+ svn_boolean_t hit_stream_eof;
} parse_context_t;
/* Emulate getc() because streams don't support it.
*
* In order to be able to ungetc(), use the CXT instead of the stream
* to be able to store the 'ungotton' character.
*
*/
static APR_INLINE svn_error_t *
parser_getc(parse_context_t *ctx, int *c)
{
do
{
if (ctx->ungotten_char != EOF)
{
*c = ctx->ungotten_char;
ctx->ungotten_char = EOF;
}
else if (ctx->buffer_pos < ctx->buffer_size)
{
*c = (unsigned char)ctx->parser_buffer[ctx->buffer_pos];
ctx->buffer_pos++;
}
else
{
- ctx->buffer_pos = 0;
- ctx->buffer_size = sizeof(ctx->parser_buffer);
+ if (!ctx->hit_stream_eof)
+ {
+ ctx->buffer_pos = 0;
+ ctx->buffer_size = sizeof(ctx->parser_buffer);
- SVN_ERR(svn_stream_read_full(ctx->stream, ctx->parser_buffer,
- &(ctx->buffer_size)));
+ SVN_ERR(svn_stream_read_full(ctx->stream, ctx->parser_buffer,
+ &(ctx->buffer_size)));
+ ctx->hit_stream_eof = (ctx->buffer_size != sizeof(ctx->parser_buffer));
+ }
if (ctx->buffer_pos < ctx->buffer_size)
{
*c = (unsigned char)ctx->parser_buffer[ctx->buffer_pos];
ctx->buffer_pos++;
}
else
*c = EOF;
}
}
while (*c == '\r');
return SVN_NO_ERROR;
}
/* Simplified version of parser_getc() to be used inside skipping loops.
* It will not check for 'ungotton' chars and may or may not ignore '\r'.
*
* In a 'while(cond) getc();' loop, the first iteration must call
* parser_getc to handle all the special cases. Later iterations should
* use parser_getc_plain for maximum performance.
*/
static APR_INLINE svn_error_t *
parser_getc_plain(parse_context_t *ctx, int *c)
{
if (ctx->buffer_pos < ctx->buffer_size)
{
*c = (unsigned char)ctx->parser_buffer[ctx->buffer_pos];
ctx->buffer_pos++;
return SVN_NO_ERROR;
}
return parser_getc(ctx, c);
}
/* Emulate ungetc() because streams don't support it.
*
* Use CTX to store the ungotten character C.
*/
static APR_INLINE svn_error_t *
parser_ungetc(parse_context_t *ctx, int c)
{
ctx->ungotten_char = c;
return SVN_NO_ERROR;
}
/* Eat chars from STREAM until encounter non-whitespace, newline, or EOF.
Set *PCOUNT to the number of characters eaten, not counting the
last one, and return the last char read (the one that caused the
break). */
static APR_INLINE svn_error_t *
skip_whitespace(parse_context_t *ctx, int *c, int *pcount)
{
int ch = 0;
int count = 0;
SVN_ERR(parser_getc(ctx, &ch));
while (svn_ctype_isspace(ch) && ch != '\n' && ch != EOF)
{
++count;
SVN_ERR(parser_getc_plain(ctx, &ch));
}
*pcount = count;
*c = ch;
return SVN_NO_ERROR;
}
/* Skip to the end of the line (or file). Returns the char that ended
the line; the char is either EOF or newline. */
static APR_INLINE svn_error_t *
skip_to_eoln(parse_context_t *ctx, int *c)
{
int ch;
SVN_ERR(parser_getc(ctx, &ch));
while (ch != '\n' && ch != EOF)
{
/* This is much faster than checking individual bytes.
* We use this function a lot when skipping comment lines.
*
* This assumes that the ungetc buffer is empty, but that is a
* safe assumption right after reading a character (which would
* clear the buffer. */
const char *newline = memchr(ctx->parser_buffer + ctx->buffer_pos, '\n',
ctx->buffer_size - ctx->buffer_pos);
if (newline)
{
ch = '\n';
ctx->buffer_pos = newline - ctx->parser_buffer + 1;
break;
}
/* refill buffer, check for EOF */
SVN_ERR(parser_getc_plain(ctx, &ch));
}
*c = ch;
return SVN_NO_ERROR;
}
/* Skip a UTF-8 Byte Order Mark if found. */
static APR_INLINE svn_error_t *
skip_bom(parse_context_t *ctx)
{
int ch;
SVN_ERR(parser_getc(ctx, &ch));
if (ch == 0xEF)
{
const unsigned char *buf = (unsigned char *)ctx->parser_buffer;
/* This makes assumptions about the implementation of parser_getc and
* the use of skip_bom. Specifically that parser_getc() will get all
* of the BOM characters into the parse_context_t buffer. This can
* safely be assumed as long as we only try to use skip_bom() at the
* start of the stream and the buffer is longer than 3 characters. */
- SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1);
- if (buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
+ SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1 ||
+ ctx->hit_stream_eof);
+ if (ctx->buffer_size > ctx->buffer_pos + 1 &&
+ buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
ctx->buffer_pos += 2;
else
SVN_ERR(parser_ungetc(ctx, ch));
}
else
SVN_ERR(parser_ungetc(ctx, ch));
return SVN_NO_ERROR;
}
/* Parse a single option value */
static svn_error_t *
parse_value(int *pch, parse_context_t *ctx)
{
svn_boolean_t end_of_val = FALSE;
int ch;
/* Read the first line of the value */
svn_stringbuf_setempty(ctx->value);
SVN_ERR(parser_getc(ctx, &ch));
while (ch != EOF && ch != '\n')
/* last ch seen was ':' or '=' in parse_option. */
{
const char char_from_int = (char)ch;
svn_stringbuf_appendbyte(ctx->value, char_from_int);
SVN_ERR(parser_getc(ctx, &ch));
}
/* Leading and trailing whitespace is ignored. */
svn_stringbuf_strip_whitespace(ctx->value);
/* Look for any continuation lines. */
for (;;)
{
if (ch == EOF || end_of_val)
{
/* At end of file. The value is complete, there can't be
any continuation lines. */
svn_config_set(ctx->cfg, ctx->section->data,
ctx->option->data, ctx->value->data);
break;
}
else
{
int count;
++ctx->line;
SVN_ERR(skip_whitespace(ctx, &ch, &count));
switch (ch)
{
case '\n':
/* The next line was empty. Ergo, it can't be a
continuation line. */
++ctx->line;
end_of_val = TRUE;
continue;
case EOF:
/* This is also an empty line. */
end_of_val = TRUE;
continue;
default:
if (count == 0)
{
/* This line starts in the first column. That means
it's either a section, option or comment. Put
the char back into the stream, because it doesn't
belong to us. */
SVN_ERR(parser_ungetc(ctx, ch));
end_of_val = TRUE;
}
else
{
/* This is a continuation line. Read it. */
svn_stringbuf_appendbyte(ctx->value, ' ');
while (ch != EOF && ch != '\n')
{
const char char_from_int = (char)ch;
svn_stringbuf_appendbyte(ctx->value, char_from_int);
SVN_ERR(parser_getc(ctx, &ch));
}
/* Trailing whitespace is ignored. */
svn_stringbuf_strip_whitespace(ctx->value);
}
}
}
}
*pch = ch;
return SVN_NO_ERROR;
}
/* Parse a single option */
static svn_error_t *
parse_option(int *pch, parse_context_t *ctx, apr_pool_t *scratch_pool)
{
svn_error_t *err = SVN_NO_ERROR;
int ch;
svn_stringbuf_setempty(ctx->option);
ch = *pch; /* Yes, the first char is relevant. */
while (ch != EOF && ch != ':' && ch != '=' && ch != '\n')
{
const char char_from_int = (char)ch;
svn_stringbuf_appendbyte(ctx->option, char_from_int);
SVN_ERR(parser_getc(ctx, &ch));
}
if (ch != ':' && ch != '=')
{
ch = EOF;
err = svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
_("line %d: Option must end with ':' or '='"),
ctx->line);
}
else
{
/* Whitespace around the name separator is ignored. */
svn_stringbuf_strip_whitespace(ctx->option);
err = parse_value(&ch, ctx);
}
*pch = ch;
return err;
}
/* Read chars until enounter ']', then skip everything to the end of
* the line. Set *PCH to the character that ended the line (either
* newline or EOF), and set CTX->section to the string of characters
* seen before ']'.
*
* This is meant to be called immediately after reading the '[' that
* starts a section name.
*/
static svn_error_t *
parse_section_name(int *pch, parse_context_t *ctx,
apr_pool_t *scratch_pool)
{
svn_error_t *err = SVN_NO_ERROR;
int ch;
svn_stringbuf_setempty(ctx->section);
SVN_ERR(parser_getc(ctx, &ch));
while (ch != EOF && ch != ']' && ch != '\n')
{
const char char_from_int = (char)ch;
svn_stringbuf_appendbyte(ctx->section, char_from_int);
SVN_ERR(parser_getc(ctx, &ch));
}
if (ch != ']')
{
ch = EOF;
err = svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
_("line %d: Section header must end with ']'"),
ctx->line);
}
else
{
/* Everything from the ']' to the end of the line is ignored. */
SVN_ERR(skip_to_eoln(ctx, &ch));
if (ch != EOF)
++ctx->line;
}
*pch = ch;
return err;
}
svn_error_t *
svn_config__sys_config_path(const char **path_p,
const char *fname,
apr_pool_t *pool)
{
*path_p = NULL;
/* Note that even if fname is null, svn_dirent_join_many will DTRT. */
#ifdef WIN32
{
const char *folder;
SVN_ERR(svn_config__win_config_path(&folder, TRUE, pool, pool));
*path_p = svn_dirent_join_many(pool, folder,
SVN_CONFIG__SUBDIRECTORY, fname,
SVN_VA_NULL);
}
#elif defined(__HAIKU__)
{
char folder[B_PATH_NAME_LENGTH];
status_t error = find_directory(B_COMMON_SETTINGS_DIRECTORY, -1, false,
folder, sizeof(folder));
if (error)
return SVN_NO_ERROR;
*path_p = svn_dirent_join_many(pool, folder,
SVN_CONFIG__SYS_DIRECTORY, fname,
SVN_VA_NULL);
}
#else /* ! WIN32 && !__HAIKU__ */
*path_p = svn_dirent_join_many(pool, SVN_CONFIG__SYS_DIRECTORY, fname,
SVN_VA_NULL);
#endif /* WIN32 */
return SVN_NO_ERROR;
}
/* Callback for svn_config_enumerate2: Continue to next value. */
static svn_boolean_t
expand_value(const char *name,
const char *value,
void *baton,
apr_pool_t *pool)
{
return TRUE;
}
/* Callback for svn_config_enumerate_sections2:
* Enumerate and implicitly expand all values in this section.
*/
static svn_boolean_t
expand_values_in_section(const char *name,
void *baton,
apr_pool_t *pool)
{
svn_config_t *cfg = baton;
svn_config_enumerate2(cfg, name, expand_value, NULL, pool);
return TRUE;
}
/*** Exported interfaces. ***/
void
svn_config__set_read_only(svn_config_t *cfg,
apr_pool_t *scratch_pool)
{
/* expand all items such that later calls to getters won't need to
* change internal state */
svn_config_enumerate_sections2(cfg, expand_values_in_section,
cfg, scratch_pool);
/* now, any modification attempt will be ignored / trigger an assertion
* in debug mode */
cfg->read_only = TRUE;
}
svn_boolean_t
svn_config__is_read_only(svn_config_t *cfg)
{
return cfg->read_only;
}
svn_config_t *
svn_config__shallow_copy(svn_config_t *src,
apr_pool_t *pool)
{
svn_config_t *cfg = apr_palloc(pool, sizeof(*cfg));
cfg->sections = src->sections;
cfg->pool = pool;
/* r/o configs are fully expanded and don't need the x_pool anymore */
cfg->x_pool = src->read_only ? NULL : svn_pool_create(pool);
cfg->x_values = src->x_values;
cfg->tmp_key = svn_stringbuf_create_empty(pool);
cfg->tmp_value = svn_stringbuf_create_empty(pool);
cfg->section_names_case_sensitive = src->section_names_case_sensitive;
cfg->option_names_case_sensitive = src->option_names_case_sensitive;
cfg->read_only = src->read_only;
return cfg;
}
void
svn_config__shallow_replace_section(svn_config_t *target,
svn_config_t *source,
const char *section)
{
if (target->read_only)
target->sections = apr_hash_copy(target->pool, target->sections);
svn_hash_sets(target->sections, section,
svn_hash_gets(source->sections, section));
}
svn_error_t *
svn_config__parse_file(svn_config_t *cfg, const char *file,
svn_boolean_t must_exist, apr_pool_t *result_pool)
{
svn_error_t *err = SVN_NO_ERROR;
apr_file_t *apr_file;
svn_stream_t *stream;
apr_pool_t *scratch_pool = svn_pool_create(result_pool);
/* Use unbuffered IO since we use our own buffering. */
err = svn_io_file_open(&apr_file, file, APR_READ, APR_OS_DEFAULT,
scratch_pool);
if (! must_exist && err && APR_STATUS_IS_ENOENT(err->apr_err))
{
svn_error_clear(err);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else
SVN_ERR(err);
stream = svn_stream_from_aprfile2(apr_file, FALSE, scratch_pool);
err = svn_config__parse_stream(cfg, stream, result_pool, scratch_pool);
if (err != SVN_NO_ERROR)
{
/* Add the filename to the error stack. */
err = svn_error_createf(err->apr_err, err,
_("Error while parsing config file: %s:"),
svn_dirent_local_style(file, scratch_pool));
}
/* Close the streams (and other cleanup): */
svn_pool_destroy(scratch_pool);
return err;
}
svn_error_t *
svn_config__parse_stream(svn_config_t *cfg, svn_stream_t *stream,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
parse_context_t *ctx;
int ch, count;
ctx = apr_palloc(scratch_pool, sizeof(*ctx));
ctx->cfg = cfg;
ctx->stream = stream;
ctx->line = 1;
ctx->ungotten_char = EOF;
ctx->section = svn_stringbuf_create_empty(scratch_pool);
ctx->option = svn_stringbuf_create_empty(scratch_pool);
ctx->value = svn_stringbuf_create_empty(scratch_pool);
ctx->buffer_pos = 0;
ctx->buffer_size = 0;
+ ctx->hit_stream_eof = FALSE;
SVN_ERR(skip_bom(ctx));
do
{
SVN_ERR(skip_whitespace(ctx, &ch, &count));
switch (ch)
{
case '[': /* Start of section header */
if (count == 0)
SVN_ERR(parse_section_name(&ch, ctx, scratch_pool));
else
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
_("line %d: Section header"
" must start in the first column"),
ctx->line);
break;
case '#': /* Comment */
if (count == 0)
{
SVN_ERR(skip_to_eoln(ctx, &ch));
++(ctx->line);
}
else
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
_("line %d: Comment"
" must start in the first column"),
ctx->line);
break;
case '\n': /* Empty line */
++(ctx->line);
break;
case EOF: /* End of file or read error */
break;
default:
if (svn_stringbuf_isempty(ctx->section))
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
_("line %d: Section header expected"),
ctx->line);
else if (count != 0)
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
_("line %d: Option expected"),
ctx->line);
else
SVN_ERR(parse_option(&ch, ctx, scratch_pool));
break;
}
}
while (ch != EOF);
return SVN_NO_ERROR;
}
/* Helper for ensure_auth_dirs: create SUBDIR under AUTH_DIR, iff
SUBDIR does not already exist, but ignore any errors. Use POOL for
temporary allocation. */
static void
ensure_auth_subdir(const char *auth_dir,
const char *subdir,
apr_pool_t *pool)
{
svn_error_t *err;
const char *subdir_full_path;
svn_node_kind_t kind;
subdir_full_path = svn_dirent_join(auth_dir, subdir, pool);
err = svn_io_check_path(subdir_full_path, &kind, pool);
if (err || kind == svn_node_none)
{
svn_error_clear(err);
svn_error_clear(svn_io_dir_make(subdir_full_path, APR_OS_DEFAULT, pool));
}
}
/* Helper for svn_config_ensure: see if ~/.subversion/auth/ and its
subdirs exist, try to create them, but don't throw errors on
failure. PATH is assumed to be a path to the user's private config
directory. */
static void
ensure_auth_dirs(const char *path,
apr_pool_t *pool)
{
svn_node_kind_t kind;
const char *auth_dir;
svn_error_t *err;
/* Ensure ~/.subversion/auth/ */
auth_dir = svn_dirent_join(path, SVN_CONFIG__AUTH_SUBDIR, pool);
err = svn_io_check_path(auth_dir, &kind, pool);
if (err || kind == svn_node_none)
{
svn_error_clear(err);
/* 'chmod 700' permissions: */
err = svn_io_dir_make(auth_dir,
(APR_UREAD | APR_UWRITE | APR_UEXECUTE),
pool);
if (err)
{
/* Don't try making subdirs if we can't make the top-level dir. */
svn_error_clear(err);
return;
}
}
/* If a provider exists that wants to store credentials in
~/.subversion, a subdirectory for the cred_kind must exist. */
ensure_auth_subdir(auth_dir, SVN_AUTH_CRED_SIMPLE, pool);
ensure_auth_subdir(auth_dir, SVN_AUTH_CRED_USERNAME, pool);
ensure_auth_subdir(auth_dir, SVN_AUTH_CRED_SSL_SERVER_TRUST, pool);
ensure_auth_subdir(auth_dir, SVN_AUTH_CRED_SSL_CLIENT_CERT_PW, pool);
}
svn_error_t *
svn_config_ensure(const char *config_dir, apr_pool_t *pool)
{
const char *path;
svn_node_kind_t kind;
svn_error_t *err;
/* Ensure that the user-specific config directory exists. */
SVN_ERR(svn_config_get_user_config_path(&path, config_dir, NULL, pool));
if (! path)
return SVN_NO_ERROR;
err = svn_io_check_resolved_path(path, &kind, pool);
if (err)
{
/* Don't throw an error, but don't continue. */
svn_error_clear(err);
return SVN_NO_ERROR;
}
if (kind == svn_node_none)
{
err = svn_io_dir_make(path, APR_OS_DEFAULT, pool);
if (err)
{
/* Don't throw an error, but don't continue. */
svn_error_clear(err);
return SVN_NO_ERROR;
}
}
else if (kind == svn_node_file)
{
/* Somebody put a file where the config directory should be.
Wacky. Let's bail. */
return SVN_NO_ERROR;
}
/* Else, there's a configuration directory. */
/* If we get errors trying to do things below, just stop and return
success. There's no _need_ to init a config directory if
something's preventing it. */
/** If non-existent, try to create a number of auth/ subdirectories. */
ensure_auth_dirs(path, pool);
/** Ensure that the `README.txt' file exists. **/
SVN_ERR(svn_config_get_user_config_path
(&path, config_dir, SVN_CONFIG__USR_README_FILE, pool));
if (! path) /* highly unlikely, since a previous call succeeded */
return SVN_NO_ERROR;
err = svn_io_check_path(path, &kind, pool);
if (err)
{
svn_error_clear(err);
return SVN_NO_ERROR;
}
if (kind == svn_node_none)
{
apr_file_t *f;
const char *contents =
"This directory holds run-time configuration information for Subversion" NL
"clients. The configuration files all share the same syntax, but you" NL
"should examine a particular file to learn what configuration" NL
"directives are valid for that file." NL
"" NL
"The syntax is standard INI format:" NL
"" NL
" - Empty lines, and lines starting with '#', are ignored." NL
" The first significant line in a file must be a section header." NL
"" NL
" - A section starts with a section header, which must start in" NL
" the first column:" NL
"" NL
" [section-name]" NL
"" NL
" - An option, which must always appear within a section, is a pair" NL
" (name, value). There are two valid forms for defining an" NL
" option, both of which must start in the first column:" NL
"" NL
" name: value" NL
" name = value" NL
"" NL
" Whitespace around the separator (:, =) is optional." NL
"" NL
" - Section and option names are case-insensitive, but case is" NL
" preserved." NL
"" NL
" - An option's value may be broken into several lines. The value" NL
" continuation lines must start with at least one whitespace." NL
" Trailing whitespace in the previous line, the newline character" NL
" and the leading whitespace in the continuation line is compressed" NL
" into a single space character." NL
"" NL
" - All leading and trailing whitespace around a value is trimmed," NL
" but the whitespace within a value is preserved, with the" NL
" exception of whitespace around line continuations, as" NL
" described above." NL
"" NL
" - When a value is a boolean, any of the following strings are" NL
" recognised as truth values (case does not matter):" NL
"" NL
" true false" NL
" yes no" NL
" on off" NL
" 1 0" NL
"" NL
" - When a value is a list, it is comma-separated. Again, the" NL
" whitespace around each element of the list is trimmed." NL
"" NL
" - Option values may be expanded within a value by enclosing the" NL
" option name in parentheses, preceded by a percent sign and" NL
" followed by an 's':" NL
"" NL
" %(name)s" NL
"" NL
" The expansion is performed recursively and on demand, during" NL
" svn_option_get. The name is first searched for in the same" NL
" section, then in the special [DEFAULT] section. If the name" NL
" is not found, the whole '%(name)s' placeholder is left" NL
" unchanged." NL
"" NL
" Any modifications to the configuration data invalidate all" NL
" previously expanded values, so that the next svn_option_get" NL
" will take the modifications into account." NL
"" NL
"The syntax of the configuration files is a subset of the one used by" NL
"Python's ConfigParser module; see" NL
"" NL
" http://www.python.org/doc/current/lib/module-ConfigParser.html" NL
"" NL
"Configuration data in the Windows registry" NL
"==========================================" NL
"" NL
"On Windows, configuration data may also be stored in the registry. The" NL
"functions svn_config_read and svn_config_merge will read from the" NL
"registry when passed file names of the form:" NL
"" NL
" REGISTRY:<hive>/path/to/config-key" NL
"" NL
"The REGISTRY: prefix must be in upper case. The <hive> part must be" NL
"one of:" NL
"" NL
" HKLM for HKEY_LOCAL_MACHINE" NL
" HKCU for HKEY_CURRENT_USER" NL
"" NL
"The values in config-key represent the options in the [DEFAULT] section."NL
"The keys below config-key represent other sections, and their values" NL
"represent the options. Only values of type REG_SZ whose name doesn't" NL
"start with a '#' will be used; other values, as well as the keys'" NL
"default values, will be ignored." NL
"" NL
"" NL
"File locations" NL
"==============" NL
"" NL
"Typically, Subversion uses two config directories, one for site-wide" NL
"configuration," NL
"" NL
" Unix:" NL
" /etc/subversion/servers" NL
" /etc/subversion/config" NL
" /etc/subversion/hairstyles" NL
" Windows:" NL
" %ALLUSERSPROFILE%\\Application Data\\Subversion\\servers" NL
" %ALLUSERSPROFILE%\\Application Data\\Subversion\\config" NL
" %ALLUSERSPROFILE%\\Application Data\\Subversion\\hairstyles" NL
" REGISTRY:HKLM\\Software\\Tigris.org\\Subversion\\Servers" NL
" REGISTRY:HKLM\\Software\\Tigris.org\\Subversion\\Config" NL
" REGISTRY:HKLM\\Software\\Tigris.org\\Subversion\\Hairstyles" NL
"" NL
"and one for per-user configuration:" NL
"" NL
" Unix:" NL
" ~/.subversion/servers" NL
" ~/.subversion/config" NL
" ~/.subversion/hairstyles" NL
" Windows:" NL
" %APPDATA%\\Subversion\\servers" NL
" %APPDATA%\\Subversion\\config" NL
" %APPDATA%\\Subversion\\hairstyles" NL
" REGISTRY:HKCU\\Software\\Tigris.org\\Subversion\\Servers" NL
" REGISTRY:HKCU\\Software\\Tigris.org\\Subversion\\Config" NL
" REGISTRY:HKCU\\Software\\Tigris.org\\Subversion\\Hairstyles" NL
"" NL;
err = svn_io_file_open(&f, path,
(APR_WRITE | APR_CREATE | APR_EXCL),
APR_OS_DEFAULT,
pool);
if (! err)
{
SVN_ERR(svn_io_file_write_full(f, contents,
strlen(contents), NULL, pool));
SVN_ERR(svn_io_file_close(f, pool));
}
svn_error_clear(err);
}
/** Ensure that the `servers' file exists. **/
SVN_ERR(svn_config_get_user_config_path
(&path, config_dir, SVN_CONFIG_CATEGORY_SERVERS, pool));
if (! path) /* highly unlikely, since a previous call succeeded */
return SVN_NO_ERROR;
err = svn_io_check_path(path, &kind, pool);
if (err)
{
svn_error_clear(err);
return SVN_NO_ERROR;
}
if (kind == svn_node_none)
{
apr_file_t *f;
const char *contents =
"### This file specifies server-specific parameters," NL
"### including HTTP proxy information, HTTP timeout settings," NL
"### and authentication settings." NL
"###" NL
"### The currently defined server options are:" NL
"### http-proxy-host Proxy host for HTTP connection" NL
"### http-proxy-port Port number of proxy host service" NL
"### http-proxy-username Username for auth to proxy service"NL
"### http-proxy-password Password for auth to proxy service"NL
"### http-proxy-exceptions List of sites that do not use proxy"
NL
"### http-timeout Timeout for HTTP requests in seconds"
NL
"### http-compression Whether to compress HTTP requests" NL
"### http-max-connections Maximum number of parallel server" NL
"### connections to use for any given" NL
"### HTTP operation." NL
"### http-chunked-requests Whether to use chunked transfer" NL
"### encoding for HTTP requests body." NL
"### neon-debug-mask Debug mask for Neon HTTP library" NL
"### ssl-authority-files List of files, each of a trusted CA"
NL
"### ssl-trust-default-ca Trust the system 'default' CAs" NL
"### ssl-client-cert-file PKCS#12 format client certificate file"
NL
"### ssl-client-cert-password Client Key password, if needed." NL
"### ssl-pkcs11-provider Name of PKCS#11 provider to use." NL
"### http-library Which library to use for http/https"
NL
"### connections." NL
"### http-bulk-updates Whether to request bulk update" NL
"### responses or to fetch each file" NL
"### in an individual request. " NL
"### store-passwords Specifies whether passwords used" NL
"### to authenticate against a" NL
"### Subversion server may be cached" NL
"### to disk in any way." NL
#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
"### store-plaintext-passwords Specifies whether passwords may" NL
"### be cached on disk unencrypted." NL
#endif
"### store-ssl-client-cert-pp Specifies whether passphrase used" NL
"### to authenticate against a client" NL
"### certificate may be cached to disk" NL
"### in any way" NL
#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
"### store-ssl-client-cert-pp-plaintext" NL
"### Specifies whether client cert" NL
"### passphrases may be cached on disk" NL
"### unencrypted (i.e., as plaintext)." NL
#endif
"### store-auth-creds Specifies whether any auth info" NL
"### (passwords, server certs, etc.)" NL
"### may be cached to disk." NL
"### username Specifies the default username." NL
"###" NL
"### Set store-passwords to 'no' to avoid storing passwords on disk" NL
"### in any way, including in password stores. It defaults to" NL
"### 'yes', but Subversion will never save your password to disk in" NL
"### plaintext unless explicitly configured to do so." NL
"### Note that this option only prevents saving of *new* passwords;" NL
"### it doesn't invalidate existing passwords. (To do that, remove" NL
"### the cache files by hand as described in the Subversion book.)" NL
"###" NL
#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
"### Set store-plaintext-passwords to 'no' to avoid storing" NL
"### passwords in unencrypted form in the auth/ area of your config" NL
"### directory. Set it to 'yes' to allow Subversion to store" NL
"### unencrypted passwords in the auth/ area. The default is" NL
"### 'ask', which means that Subversion will ask you before" NL
"### saving a password to disk in unencrypted form. Note that" NL
"### this option has no effect if either 'store-passwords' or " NL
"### 'store-auth-creds' is set to 'no'." NL
"###" NL
#endif
"### Set store-ssl-client-cert-pp to 'no' to avoid storing ssl" NL
"### client certificate passphrases in the auth/ area of your" NL
"### config directory. It defaults to 'yes', but Subversion will" NL
"### never save your passphrase to disk in plaintext unless" NL
"### explicitly configured to do so." NL
"###" NL
"### Note store-ssl-client-cert-pp only prevents the saving of *new*"NL
"### passphrases; it doesn't invalidate existing passphrases. To do"NL
"### that, remove the cache files by hand as described in the" NL
"### Subversion book at http://svnbook.red-bean.com/nightly/en/\\" NL
"### svn.serverconfig.netmodel.html\\" NL
"### #svn.serverconfig.netmodel.credcache" NL
"###" NL
#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
"### Set store-ssl-client-cert-pp-plaintext to 'no' to avoid storing"NL
"### passphrases in unencrypted form in the auth/ area of your" NL
"### config directory. Set it to 'yes' to allow Subversion to" NL
"### store unencrypted passphrases in the auth/ area. The default" NL
"### is 'ask', which means that Subversion will prompt before" NL
"### saving a passphrase to disk in unencrypted form. Note that" NL
"### this option has no effect if either 'store-auth-creds' or " NL
"### 'store-ssl-client-cert-pp' is set to 'no'." NL
"###" NL
#endif
"### Set store-auth-creds to 'no' to avoid storing any Subversion" NL
"### credentials in the auth/ area of your config directory." NL
"### Note that this includes SSL server certificates." NL
"### It defaults to 'yes'. Note that this option only prevents" NL
"### saving of *new* credentials; it doesn't invalidate existing" NL
"### caches. (To do that, remove the cache files by hand.)" NL
"###" NL
"### HTTP timeouts, if given, are specified in seconds. A timeout" NL
"### of 0, i.e. zero, causes a builtin default to be used." NL
"###" NL
"### Most users will not need to explicitly set the http-library" NL
"### option, but valid values for the option include:" NL
"### 'serf': Serf-based module (Subversion 1.5 - present)" NL
"### 'neon': Neon-based module (Subversion 1.0 - 1.7)" NL
"### Availability of these modules may depend on your specific" NL
"### Subversion distribution." NL
"###" NL
"### The commented-out examples below are intended only to" NL
"### demonstrate how to use this file; any resemblance to actual" NL
"### servers, living or dead, is entirely coincidental." NL
"" NL
"### In the 'groups' section, the URL of the repository you're" NL
"### trying to access is matched against the patterns on the right." NL
"### If a match is found, the server options are taken from the" NL
"### section with the corresponding name on the left." NL
"" NL
"[groups]" NL
"# group1 = *.collab.net" NL
"# othergroup = repository.blarggitywhoomph.com" NL
"# thirdgroup = *.example.com" NL
"" NL
"### Information for the first group:" NL
"# [group1]" NL
"# http-proxy-host = proxy1.some-domain-name.com" NL
"# http-proxy-port = 80" NL
"# http-proxy-username = blah" NL
"# http-proxy-password = doubleblah" NL
"# http-timeout = 60" NL
"# neon-debug-mask = 130" NL
#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
"# store-plaintext-passwords = no" NL
#endif
"# username = harry" NL
"" NL
"### Information for the second group:" NL
"# [othergroup]" NL
"# http-proxy-host = proxy2.some-domain-name.com" NL
"# http-proxy-port = 9000" NL
"# No username and password for the proxy, so use the defaults below."
NL
"" NL
"### You can set default parameters in the 'global' section." NL
"### These parameters apply if no corresponding parameter is set in" NL
"### a specifically matched group as shown above. Thus, if you go" NL
"### through the same proxy server to reach every site on the" NL
"### Internet, you probably just want to put that server's" NL
"### information in the 'global' section and not bother with" NL
"### 'groups' or any other sections." NL
"###" NL
"### Most people might want to configure password caching" NL
"### parameters here, but you can also configure them per server" NL
"### group (per-group settings override global settings)." NL
"###" NL
"### If you go through a proxy for all but a few sites, you can" NL
"### list those exceptions under 'http-proxy-exceptions'. This only"NL
"### overrides defaults, not explicitly matched server names." NL
"###" NL
"### 'ssl-authority-files' is a semicolon-delimited list of files," NL
"### each pointing to a PEM-encoded Certificate Authority (CA) " NL
"### SSL certificate. See details above for overriding security " NL
"### due to SSL." NL
"[global]" NL
"# http-proxy-exceptions = *.exception.com, www.internal-site.org" NL
"# http-proxy-host = defaultproxy.whatever.com" NL
"# http-proxy-port = 7000" NL
"# http-proxy-username = defaultusername" NL
"# http-proxy-password = defaultpassword" NL
"# http-compression = no" NL
"# No http-timeout, so just use the builtin default." NL
"# No neon-debug-mask, so neon debugging is disabled." NL
"# ssl-authority-files = /path/to/CAcert.pem;/path/to/CAcert2.pem" NL
"#" NL
"# Password / passphrase caching parameters:" NL
"# store-passwords = no" NL
"# store-ssl-client-cert-pp = no" NL
#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
"# store-plaintext-passwords = no" NL
"# store-ssl-client-cert-pp-plaintext = no" NL
#endif
;
err = svn_io_file_open(&f, path,
(APR_WRITE | APR_CREATE | APR_EXCL),
APR_OS_DEFAULT,
pool);
if (! err)
{
SVN_ERR(svn_io_file_write_full(f, contents,
strlen(contents), NULL, pool));
SVN_ERR(svn_io_file_close(f, pool));
}
svn_error_clear(err);
}
/** Ensure that the `config' file exists. **/
SVN_ERR(svn_config_get_user_config_path
(&path, config_dir, SVN_CONFIG_CATEGORY_CONFIG, pool));
if (! path) /* highly unlikely, since a previous call succeeded */
return SVN_NO_ERROR;
err = svn_io_check_path(path, &kind, pool);
if (err)
{
svn_error_clear(err);
return SVN_NO_ERROR;
}
if (kind == svn_node_none)
{
apr_file_t *f;
const char *contents =
"### This file configures various client-side behaviors." NL
"###" NL
"### The commented-out examples below are intended to demonstrate" NL
"### how to use this file." NL
"" NL
"### Section for authentication and authorization customizations." NL
"[auth]" NL
"### Set password stores used by Subversion. They should be" NL
"### delimited by spaces or commas. The order of values determines" NL
"### the order in which password stores are used." NL
"### Valid password stores:" NL
"### gnome-keyring (Unix-like systems)" NL
"### kwallet (Unix-like systems)" NL
"### gpg-agent (Unix-like systems)" NL
"### keychain (Mac OS X)" NL
"### windows-cryptoapi (Windows)" NL
#ifdef SVN_HAVE_KEYCHAIN_SERVICES
"# password-stores = keychain" NL
#elif defined(WIN32) && !defined(__MINGW32__)
"# password-stores = windows-cryptoapi" NL
#else
"# password-stores = gpg-agent,gnome-keyring,kwallet" NL
#endif
"### To disable all password stores, use an empty list:" NL
"# password-stores =" NL
#ifdef SVN_HAVE_KWALLET
"###" NL
"### Set KWallet wallet used by Subversion. If empty or unset," NL
"### then the default network wallet will be used." NL
"# kwallet-wallet =" NL
"###" NL
"### Include PID (Process ID) in Subversion application name when" NL
"### using KWallet. It defaults to 'no'." NL
"# kwallet-svn-application-name-with-pid = yes" NL
#endif
"###" NL
"### Set ssl-client-cert-file-prompt to 'yes' to cause the client" NL
"### to prompt for a path to a client cert file when the server" NL
"### requests a client cert but no client cert file is found in the" NL
"### expected place (see the 'ssl-client-cert-file' option in the" NL
"### 'servers' configuration file). Defaults to 'no'." NL
"# ssl-client-cert-file-prompt = no" NL
"###" NL
"### The rest of the [auth] section in this file has been deprecated."
NL
"### Both 'store-passwords' and 'store-auth-creds' can now be" NL
"### specified in the 'servers' file in your config directory" NL
"### and are documented there. Anything specified in this section " NL
"### is overridden by settings specified in the 'servers' file." NL
"# store-passwords = no" NL
"# store-auth-creds = no" NL
"" NL
"### Section for configuring external helper applications." NL
"[helpers]" NL
"### Set editor-cmd to the command used to invoke your text editor." NL
"### This will override the environment variables that Subversion" NL
"### examines by default to find this information ($EDITOR, " NL
"### et al)." NL
"# editor-cmd = editor (vi, emacs, notepad, etc.)" NL
"### Set diff-cmd to the absolute path of your 'diff' program." NL
"### This will override the compile-time default, which is to use" NL
"### Subversion's internal diff implementation." NL
"# diff-cmd = diff_program (diff, gdiff, etc.)" NL
"### Diff-extensions are arguments passed to an external diff" NL
"### program or to Subversion's internal diff implementation." NL
"### Set diff-extensions to override the default arguments ('-u')." NL
"# diff-extensions = -u -p" NL
"### Set diff3-cmd to the absolute path of your 'diff3' program." NL
"### This will override the compile-time default, which is to use" NL
"### Subversion's internal diff3 implementation." NL
"# diff3-cmd = diff3_program (diff3, gdiff3, etc.)" NL
"### Set diff3-has-program-arg to 'yes' if your 'diff3' program" NL
"### accepts the '--diff-program' option." NL
"# diff3-has-program-arg = [yes | no]" NL
"### Set merge-tool-cmd to the command used to invoke your external" NL
"### merging tool of choice. Subversion will pass 5 arguments to" NL
"### the specified command: base theirs mine merged wcfile" NL
"# merge-tool-cmd = merge_command" NL
"" NL
"### Section for configuring tunnel agents." NL
"[tunnels]" NL
"### Configure svn protocol tunnel schemes here. By default, only" NL
"### the 'ssh' scheme is defined. You can define other schemes to" NL
"### be used with 'svn+scheme://hostname/path' URLs. A scheme" NL
"### definition is simply a command, optionally prefixed by an" NL
"### environment variable name which can override the command if it" NL
"### is defined. The command (or environment variable) may contain" NL
"### arguments, using standard shell quoting for arguments with" NL
"### spaces. The command will be invoked as:" NL
"### <command> <hostname> svnserve -t" NL
"### (If the URL includes a username, then the hostname will be" NL
"### passed to the tunnel agent as <user>@<hostname>.) If the" NL
"### built-in ssh scheme were not predefined, it could be defined" NL
"### as:" NL
"# ssh = $SVN_SSH ssh -q" NL
"### If you wanted to define a new 'rsh' scheme, to be used with" NL
"### 'svn+rsh:' URLs, you could do so as follows:" NL
"# rsh = rsh" NL
"### Or, if you wanted to specify a full path and arguments:" NL
"# rsh = /path/to/rsh -l myusername" NL
"### On Windows, if you are specifying a full path to a command," NL
"### use a forward slash (/) or a paired backslash (\\\\) as the" NL
"### path separator. A single backslash will be treated as an" NL
"### escape for the following character." NL
"" NL
"### Section for configuring miscellaneous Subversion options." NL
"[miscellany]" NL
"### Set global-ignores to a set of whitespace-delimited globs" NL
"### which Subversion will ignore in its 'status' output, and" NL
"### while importing or adding files and directories." NL
"### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'." NL
"# global-ignores = " SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_1 NL
"# " SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2 NL
"### Set log-encoding to the default encoding for log messages" NL
"# log-encoding = latin1" NL
"### Set use-commit-times to make checkout/update/switch/revert" NL
"### put last-committed timestamps on every file touched." NL
"# use-commit-times = yes" NL
"### Set no-unlock to prevent 'svn commit' from automatically" NL
"### releasing locks on files." NL
"# no-unlock = yes" NL
"### Set mime-types-file to a MIME type registry file, used to" NL
"### provide hints to Subversion's MIME type auto-detection" NL
"### algorithm." NL
"# mime-types-file = /path/to/mime.types" NL
"### Set preserved-conflict-file-exts to a whitespace-delimited" NL
"### list of patterns matching file extensions which should be" NL
"### preserved in generated conflict file names. By default," NL
"### conflict files use custom extensions." NL
"# preserved-conflict-file-exts = doc ppt xls od?" NL
"### Set enable-auto-props to 'yes' to enable automatic properties" NL
"### for 'svn add' and 'svn import', it defaults to 'no'." NL
"### Automatic properties are defined in the section 'auto-props'." NL
"# enable-auto-props = yes" NL
#ifdef SVN_HAVE_LIBMAGIC
"### Set enable-magic-file to 'no' to disable magic file detection" NL
"### of the file type when automatically setting svn:mime-type. It" NL
"### defaults to 'yes' if magic file support is possible." NL
"# enable-magic-file = yes" NL
#endif
"### Set interactive-conflicts to 'no' to disable interactive" NL
"### conflict resolution prompting. It defaults to 'yes'." NL
"# interactive-conflicts = no" NL
"### Set memory-cache-size to define the size of the memory cache" NL
"### used by the client when accessing a FSFS repository via" NL
"### ra_local (the file:// scheme). The value represents the number" NL
"### of MB used by the cache." NL
"# memory-cache-size = 16" NL
"### Set diff-ignore-content-type to 'yes' to cause 'svn diff' to" NL
"### attempt to show differences of all modified files regardless" NL
"### of their MIME content type. By default, Subversion will only" NL
"### attempt to show differences for files believed to have human-" NL
"### readable (non-binary) content. This option is especially" NL
"### useful when Subversion is configured (via the 'diff-cmd'" NL
"### option) to employ an external differencing tool which is able" NL
"### to show meaningful differences for binary file formats. [New" NL
"### in 1.9]" NL
"# diff-ignore-content-type = no" NL
"" NL
"### Section for configuring automatic properties." NL
"[auto-props]" NL
"### The format of the entries is:" NL
"### file-name-pattern = propname[=value][;propname[=value]...]" NL
"### The file-name-pattern can contain wildcards (such as '*' and" NL
"### '?'). All entries which match (case-insensitively) will be" NL
"### applied to the file. Note that auto-props functionality" NL
"### must be enabled, which is typically done by setting the" NL
"### 'enable-auto-props' option." NL
"# *.c = svn:eol-style=native" NL
"# *.cpp = svn:eol-style=native" NL
"# *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native" NL
"# *.dsp = svn:eol-style=CRLF" NL
"# *.dsw = svn:eol-style=CRLF" NL
"# *.sh = svn:eol-style=native;svn:executable" NL
"# *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;"NL
"# *.png = svn:mime-type=image/png" NL
"# *.jpg = svn:mime-type=image/jpeg" NL
"# Makefile = svn:eol-style=native" NL
"" NL
"### Section for configuring working copies." NL
"[working-copy]" NL
"### Set to a list of the names of specific clients that should use" NL
"### exclusive SQLite locking of working copies. This increases the"NL
"### performance of the client but prevents concurrent access by" NL
"### other clients. Third-party clients may also support this" NL
"### option." NL
"### Possible values:" NL
"### svn (the command line client)" NL
"# exclusive-locking-clients =" NL
"### Set to true to enable exclusive SQLite locking of working" NL
"### copies by all clients using the 1.8 APIs. Enabling this may" NL
"### cause some clients to fail to work properly. This does not have"NL
"### to be set for exclusive-locking-clients to work." NL
"# exclusive-locking = false" NL
"### Set the SQLite busy timeout in milliseconds: the maximum time" NL
"### the client waits to get access to the SQLite database before" NL
"### returning an error. The default is 10000, i.e. 10 seconds." NL
"### Longer values may be useful when exclusive locking is enabled." NL
"# busy-timeout = 10000" NL
;
err = svn_io_file_open(&f, path,
(APR_WRITE | APR_CREATE | APR_EXCL),
APR_OS_DEFAULT,
pool);
if (! err)
{
SVN_ERR(svn_io_file_write_full(f, contents,
strlen(contents), NULL, pool));
SVN_ERR(svn_io_file_close(f, pool));
}
svn_error_clear(err);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_config_get_user_config_path(const char **path,
const char *config_dir,
const char *fname,
apr_pool_t *pool)
{
*path= NULL;
/* Note that even if fname is null, svn_dirent_join_many will DTRT. */
if (config_dir)
{
*path = svn_dirent_join_many(pool, config_dir, fname, SVN_VA_NULL);
return SVN_NO_ERROR;
}
#ifdef WIN32
{
const char *folder;
SVN_ERR(svn_config__win_config_path(&folder, FALSE, pool, pool));
if (! folder)
return SVN_NO_ERROR;
*path = svn_dirent_join_many(pool, folder,
SVN_CONFIG__SUBDIRECTORY, fname, SVN_VA_NULL);
}
#elif defined(__HAIKU__)
{
char folder[B_PATH_NAME_LENGTH];
status_t error = find_directory(B_USER_SETTINGS_DIRECTORY, -1, false,
folder, sizeof(folder));
if (error)
return SVN_NO_ERROR;
*path = svn_dirent_join_many(pool, folder,
SVN_CONFIG__USR_DIRECTORY, fname,
SVN_VA_NULL);
}
#else /* ! WIN32 && !__HAIKU__ */
{
const char *homedir = svn_user_get_homedir(pool);
if (! homedir)
return SVN_NO_ERROR;
*path = svn_dirent_join_many(pool,
svn_dirent_canonicalize(homedir, pool),
SVN_CONFIG__USR_DIRECTORY, fname, SVN_VA_NULL);
}
#endif /* WIN32 */
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/libsvn_subr/deprecated.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/deprecated.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/deprecated.c (revision 309511)
@@ -1,1540 +1,1550 @@
/*
* deprecated.c: holding file for all deprecated APIs.
* "we can't lose 'em, but we can shun 'em!"
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* ==================================================================== */
#include <assert.h>
#include <apr_md5.h>
/* We define this here to remove any further warnings about the usage of
deprecated functions in this file. */
#define SVN_DEPRECATED
#include "svn_hash.h"
#include "svn_subst.h"
#include "svn_path.h"
#include "svn_opt.h"
#include "svn_cmdline.h"
#include "svn_version.h"
#include "svn_pools.h"
#include "svn_dso.h"
#include "svn_mergeinfo.h"
#include "svn_utf.h"
#include "svn_xml.h"
#include "svn_auth.h"
#include "opt.h"
#include "auth.h"
#include "private/svn_opt_private.h"
#include "private/svn_mergeinfo_private.h"
#include "svn_private_config.h"
/*** Code. ***/
/*** From subst.c ***/
/* Convert an old-style svn_subst_keywords_t struct * into a new-style
* keywords hash. Keyword values are shallow copies, so the produced
* hash must not be assumed to have lifetime longer than the struct it
* is based on. A NULL input causes a NULL output. */
static apr_hash_t *
kwstruct_to_kwhash(const svn_subst_keywords_t *kwstruct,
apr_pool_t *pool)
{
apr_hash_t *kwhash;
if (kwstruct == NULL)
return NULL;
kwhash = apr_hash_make(pool);
if (kwstruct->revision)
{
svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_LONG, kwstruct->revision);
svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_MEDIUM, kwstruct->revision);
svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_SHORT, kwstruct->revision);
}
if (kwstruct->date)
{
svn_hash_sets(kwhash, SVN_KEYWORD_DATE_LONG, kwstruct->date);
svn_hash_sets(kwhash, SVN_KEYWORD_DATE_SHORT, kwstruct->date);
}
if (kwstruct->author)
{
svn_hash_sets(kwhash, SVN_KEYWORD_AUTHOR_LONG, kwstruct->author);
svn_hash_sets(kwhash, SVN_KEYWORD_AUTHOR_SHORT, kwstruct->author);
}
if (kwstruct->url)
{
svn_hash_sets(kwhash, SVN_KEYWORD_URL_LONG, kwstruct->url);
svn_hash_sets(kwhash, SVN_KEYWORD_URL_SHORT, kwstruct->url);
}
if (kwstruct->id)
{
svn_hash_sets(kwhash, SVN_KEYWORD_ID, kwstruct->id);
}
return kwhash;
}
svn_error_t *
svn_subst_translate_stream3(svn_stream_t *src_stream,
svn_stream_t *dst_stream,
const char *eol_str,
svn_boolean_t repair,
apr_hash_t *keywords,
svn_boolean_t expand,
apr_pool_t *pool)
{
/* The docstring requires that *some* translation be requested. */
SVN_ERR_ASSERT(eol_str || keywords);
/* We don't want the copy3 to close the provided streams. */
src_stream = svn_stream_disown(src_stream, pool);
dst_stream = svn_stream_disown(dst_stream, pool);
/* Wrap the destination stream with our translation stream. It is more
efficient than wrapping the source stream. */
dst_stream = svn_subst_stream_translated(dst_stream, eol_str, repair,
keywords, expand, pool);
return svn_error_trace(svn_stream_copy3(src_stream, dst_stream,
NULL, NULL, pool));
}
svn_error_t *
svn_subst_translate_stream2(svn_stream_t *s, /* src stream */
svn_stream_t *d, /* dst stream */
const char *eol_str,
svn_boolean_t repair,
const svn_subst_keywords_t *keywords,
svn_boolean_t expand,
apr_pool_t *pool)
{
apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
return svn_error_trace(svn_subst_translate_stream3(s, d, eol_str, repair,
kh, expand, pool));
}
svn_error_t *
svn_subst_translate_stream(svn_stream_t *s, /* src stream */
svn_stream_t *d, /* dst stream */
const char *eol_str,
svn_boolean_t repair,
const svn_subst_keywords_t *keywords,
svn_boolean_t expand)
{
apr_pool_t *pool = svn_pool_create(NULL);
svn_error_t *err = svn_subst_translate_stream2(s, d, eol_str, repair,
keywords, expand, pool);
svn_pool_destroy(pool);
return svn_error_trace(err);
}
svn_error_t *
svn_subst_translate_cstring(const char *src,
const char **dst,
const char *eol_str,
svn_boolean_t repair,
const svn_subst_keywords_t *keywords,
svn_boolean_t expand,
apr_pool_t *pool)
{
apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
return svn_error_trace(svn_subst_translate_cstring2(src, dst, eol_str,
repair, kh, expand,
pool));
}
svn_error_t *
svn_subst_copy_and_translate(const char *src,
const char *dst,
const char *eol_str,
svn_boolean_t repair,
const svn_subst_keywords_t *keywords,
svn_boolean_t expand,
apr_pool_t *pool)
{
return svn_error_trace(svn_subst_copy_and_translate2(src, dst, eol_str,
repair, keywords,
expand, FALSE, pool));
}
svn_error_t *
svn_subst_copy_and_translate2(const char *src,
const char *dst,
const char *eol_str,
svn_boolean_t repair,
const svn_subst_keywords_t *keywords,
svn_boolean_t expand,
svn_boolean_t special,
apr_pool_t *pool)
{
apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
return svn_error_trace(svn_subst_copy_and_translate3(src, dst, eol_str,
repair, kh, expand,
special, pool));
}
svn_error_t *
svn_subst_copy_and_translate3(const char *src,
const char *dst,
const char *eol_str,
svn_boolean_t repair,
apr_hash_t *keywords,
svn_boolean_t expand,
svn_boolean_t special,
apr_pool_t *pool)
{
return svn_error_trace(svn_subst_copy_and_translate4(src, dst, eol_str,
repair, keywords,
expand, special,
NULL, NULL,
pool));
}
svn_error_t *
svn_subst_stream_translated_to_normal_form(svn_stream_t **stream,
svn_stream_t *source,
svn_subst_eol_style_t eol_style,
const char *eol_str,
svn_boolean_t always_repair_eols,
apr_hash_t *keywords,
apr_pool_t *pool)
{
if (eol_style == svn_subst_eol_style_native)
eol_str = SVN_SUBST_NATIVE_EOL_STR;
else if (! (eol_style == svn_subst_eol_style_fixed
|| eol_style == svn_subst_eol_style_none))
return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
*stream = svn_subst_stream_translated(source, eol_str,
eol_style == svn_subst_eol_style_fixed
|| always_repair_eols,
keywords, FALSE, pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_subst_translate_string(svn_string_t **new_value,
const svn_string_t *value,
const char *encoding,
apr_pool_t *pool)
{
return svn_subst_translate_string2(new_value, NULL, NULL, value,
encoding, FALSE, pool, pool);
}
svn_error_t *
svn_subst_stream_detranslated(svn_stream_t **stream_p,
const char *src,
svn_subst_eol_style_t eol_style,
const char *eol_str,
svn_boolean_t always_repair_eols,
apr_hash_t *keywords,
svn_boolean_t special,
apr_pool_t *pool)
{
svn_stream_t *src_stream;
if (special)
return svn_subst_read_specialfile(stream_p, src, pool, pool);
/* This will be closed by svn_subst_stream_translated_to_normal_form
when the returned stream is closed. */
SVN_ERR(svn_stream_open_readonly(&src_stream, src, pool, pool));
return svn_error_trace(svn_subst_stream_translated_to_normal_form(
stream_p, src_stream,
eol_style, eol_str,
always_repair_eols,
keywords, pool));
}
svn_error_t *
svn_subst_translate_to_normal_form(const char *src,
const char *dst,
svn_subst_eol_style_t eol_style,
const char *eol_str,
svn_boolean_t always_repair_eols,
apr_hash_t *keywords,
svn_boolean_t special,
apr_pool_t *pool)
{
if (eol_style == svn_subst_eol_style_native)
eol_str = SVN_SUBST_NATIVE_EOL_STR;
else if (! (eol_style == svn_subst_eol_style_fixed
|| eol_style == svn_subst_eol_style_none))
return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
return svn_error_trace(svn_subst_copy_and_translate3(
src, dst, eol_str,
eol_style == svn_subst_eol_style_fixed
|| always_repair_eols,
keywords,
FALSE /* contract keywords */,
special,
pool));
}
/*** From opt.c ***/
/* Same as print_command_info2(), but with deprecated struct revision. */
static svn_error_t *
print_command_info(const svn_opt_subcommand_desc_t *cmd,
const apr_getopt_option_t *options_table,
svn_boolean_t help,
apr_pool_t *pool,
FILE *stream)
{
svn_boolean_t first_time;
apr_size_t i;
/* Print the canonical command name. */
SVN_ERR(svn_cmdline_fputs(cmd->name, stream, pool));
/* Print the list of aliases. */
first_time = TRUE;
for (i = 0; i < SVN_OPT_MAX_ALIASES; i++)
{
if (cmd->aliases[i] == NULL)
break;
if (first_time) {
SVN_ERR(svn_cmdline_fputs(" (", stream, pool));
first_time = FALSE;
}
else
SVN_ERR(svn_cmdline_fputs(", ", stream, pool));
SVN_ERR(svn_cmdline_fputs(cmd->aliases[i], stream, pool));
}
if (! first_time)
SVN_ERR(svn_cmdline_fputs(")", stream, pool));
if (help)
{
const apr_getopt_option_t *option;
svn_boolean_t have_options = FALSE;
SVN_ERR(svn_cmdline_fprintf(stream, pool, ": %s", _(cmd->help)));
/* Loop over all valid option codes attached to the subcommand */
for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
{
if (cmd->valid_options[i])
{
if (!have_options)
{
SVN_ERR(svn_cmdline_fputs(_("\nValid options:\n"),
stream, pool));
have_options = TRUE;
}
/* convert each option code into an option */
option =
svn_opt_get_option_from_code2(cmd->valid_options[i],
options_table, NULL, pool);
/* print the option's docstring */
if (option && option->description)
{
const char *optstr;
svn_opt_format_option(&optstr, option, TRUE, pool);
SVN_ERR(svn_cmdline_fprintf(stream, pool, " %s\n",
optstr));
}
}
}
if (have_options)
SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
}
return SVN_NO_ERROR;
}
const svn_opt_subcommand_desc_t *
svn_opt_get_canonical_subcommand(const svn_opt_subcommand_desc_t *table,
const char *cmd_name)
{
int i = 0;
if (cmd_name == NULL)
return NULL;
while (table[i].name) {
int j;
if (strcmp(cmd_name, table[i].name) == 0)
return table + i;
for (j = 0; (j < SVN_OPT_MAX_ALIASES) && table[i].aliases[j]; j++)
if (strcmp(cmd_name, table[i].aliases[j]) == 0)
return table + i;
i++;
}
/* If we get here, there was no matching subcommand name or alias. */
return NULL;
}
void
svn_opt_subcommand_help2(const char *subcommand,
const svn_opt_subcommand_desc2_t *table,
const apr_getopt_option_t *options_table,
apr_pool_t *pool)
{
svn_opt_subcommand_help3(subcommand, table, options_table,
NULL, pool);
}
void
svn_opt_subcommand_help(const char *subcommand,
const svn_opt_subcommand_desc_t *table,
const apr_getopt_option_t *options_table,
apr_pool_t *pool)
{
const svn_opt_subcommand_desc_t *cmd =
svn_opt_get_canonical_subcommand(table, subcommand);
svn_error_t *err;
if (cmd)
err = print_command_info(cmd, options_table, TRUE, pool, stdout);
else
err = svn_cmdline_fprintf(stderr, pool,
_("\"%s\": unknown command.\n\n"), subcommand);
if (err) {
svn_handle_error2(err, stderr, FALSE, "svn: ");
svn_error_clear(err);
}
}
svn_error_t *
svn_opt_args_to_target_array3(apr_array_header_t **targets_p,
apr_getopt_t *os,
const apr_array_header_t *known_targets,
apr_pool_t *pool)
{
return svn_error_trace(svn_opt__args_to_target_array(targets_p, os,
known_targets, pool));
}
svn_error_t *
svn_opt_args_to_target_array2(apr_array_header_t **targets_p,
apr_getopt_t *os,
const apr_array_header_t *known_targets,
apr_pool_t *pool)
{
svn_error_t *err = svn_opt_args_to_target_array3(targets_p, os,
known_targets, pool);
if (err && err->apr_err == SVN_ERR_RESERVED_FILENAME_SPECIFIED)
{
svn_error_clear(err);
return SVN_NO_ERROR;
}
return err;
}
svn_error_t *
svn_opt_args_to_target_array(apr_array_header_t **targets_p,
apr_getopt_t *os,
const apr_array_header_t *known_targets,
svn_opt_revision_t *start_revision,
svn_opt_revision_t *end_revision,
svn_boolean_t extract_revisions,
apr_pool_t *pool)
{
apr_array_header_t *output_targets;
SVN_ERR(svn_opt_args_to_target_array2(&output_targets, os,
known_targets, pool));
if (extract_revisions)
{
svn_opt_revision_t temprev;
const char *path;
if (output_targets->nelts > 0)
{
path = APR_ARRAY_IDX(output_targets, 0, const char *);
SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool));
if (temprev.kind != svn_opt_revision_unspecified)
{
APR_ARRAY_IDX(output_targets, 0, const char *) = path;
start_revision->kind = temprev.kind;
start_revision->value = temprev.value;
}
}
if (output_targets->nelts > 1)
{
path = APR_ARRAY_IDX(output_targets, 1, const char *);
SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool));
if (temprev.kind != svn_opt_revision_unspecified)
{
APR_ARRAY_IDX(output_targets, 1, const char *) = path;
end_revision->kind = temprev.kind;
end_revision->value = temprev.value;
}
}
}
*targets_p = output_targets;
return SVN_NO_ERROR;
}
svn_error_t *
svn_opt_print_help3(apr_getopt_t *os,
const char *pgm_name,
svn_boolean_t print_version,
svn_boolean_t quiet,
const char *version_footer,
const char *header,
const svn_opt_subcommand_desc2_t *cmd_table,
const apr_getopt_option_t *option_table,
const int *global_options,
const char *footer,
apr_pool_t *pool)
{
return svn_error_trace(svn_opt_print_help4(os,
pgm_name,
print_version,
quiet,
FALSE,
version_footer,
header,
cmd_table,
option_table,
global_options,
footer,
pool));
}
svn_error_t *
svn_opt_print_help2(apr_getopt_t *os,
const char *pgm_name,
svn_boolean_t print_version,
svn_boolean_t quiet,
const char *version_footer,
const char *header,
const svn_opt_subcommand_desc2_t *cmd_table,
const apr_getopt_option_t *option_table,
const char *footer,
apr_pool_t *pool)
{
return svn_error_trace(svn_opt_print_help4(os,
pgm_name,
print_version,
quiet,
FALSE,
version_footer,
header,
cmd_table,
option_table,
NULL,
footer,
pool));
}
svn_error_t *
svn_opt_print_help(apr_getopt_t *os,
const char *pgm_name,
svn_boolean_t print_version,
svn_boolean_t quiet,
const char *version_footer,
const char *header,
const svn_opt_subcommand_desc_t *cmd_table,
const apr_getopt_option_t *option_table,
const char *footer,
apr_pool_t *pool)
{
apr_array_header_t *targets = NULL;
if (os)
SVN_ERR(svn_opt_parse_all_args(&targets, os, pool));
if (os && targets->nelts) /* help on subcommand(s) requested */
{
int i;
for (i = 0; i < targets->nelts; i++)
{
svn_opt_subcommand_help(APR_ARRAY_IDX(targets, i, const char *),
cmd_table, option_table, pool);
}
}
else if (print_version) /* just --version */
{
SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
svn_version_extended(FALSE, pool),
quiet, FALSE, pool));
}
else if (os && !targets->nelts) /* `-h', `--help', or `help' */
svn_opt_print_generic_help(header,
cmd_table,
option_table,
footer,
pool,
stdout);
else /* unknown option or cmd */
SVN_ERR(svn_cmdline_fprintf(stderr, pool,
_("Type '%s help' for usage.\n"), pgm_name));
return SVN_NO_ERROR;
}
void
svn_opt_print_generic_help(const char *header,
const svn_opt_subcommand_desc_t *cmd_table,
const apr_getopt_option_t *opt_table,
const char *footer,
apr_pool_t *pool, FILE *stream)
{
int i = 0;
svn_error_t *err;
if (header)
if ((err = svn_cmdline_fputs(header, stream, pool)))
goto print_error;
while (cmd_table[i].name)
{
if ((err = svn_cmdline_fputs(" ", stream, pool))
|| (err = print_command_info(cmd_table + i, opt_table, FALSE,
pool, stream))
|| (err = svn_cmdline_fputs("\n", stream, pool)))
goto print_error;
i++;
}
if ((err = svn_cmdline_fputs("\n", stream, pool)))
goto print_error;
if (footer)
if ((err = svn_cmdline_fputs(footer, stream, pool)))
goto print_error;
return;
print_error:
svn_handle_error2(err, stderr, FALSE, "svn: ");
svn_error_clear(err);
}
/*** From io.c ***/
svn_error_t *
svn_io_open_unique_file2(apr_file_t **file,
const char **temp_path,
const char *path,
const char *suffix,
svn_io_file_del_t delete_when,
apr_pool_t *pool)
{
const char *dirpath;
const char *filename;
svn_path_split(path, &dirpath, &filename, pool);
return svn_error_trace(svn_io_open_uniquely_named(file, temp_path,
dirpath, filename, suffix,
delete_when,
pool, pool));
}
svn_error_t *
svn_io_open_unique_file(apr_file_t **file,
const char **temp_path,
const char *path,
const char *suffix,
svn_boolean_t delete_on_close,
apr_pool_t *pool)
{
return svn_error_trace(svn_io_open_unique_file2(file, temp_path,
path, suffix,
delete_on_close
? svn_io_file_del_on_close
: svn_io_file_del_none,
pool));
}
svn_error_t *
svn_io_run_diff(const char *dir,
const char *const *user_args,
int num_user_args,
const char *label1,
const char *label2,
const char *from,
const char *to,
int *pexitcode,
apr_file_t *outfile,
apr_file_t *errfile,
const char *diff_cmd,
apr_pool_t *pool)
{
SVN_ERR(svn_path_cstring_to_utf8(&diff_cmd, diff_cmd, pool));
return svn_error_trace(svn_io_run_diff2(dir, user_args, num_user_args,
label1, label2,
from, to, pexitcode,
outfile, errfile, diff_cmd,
pool));
}
svn_error_t *
svn_io_run_diff3_2(int *exitcode,
const char *dir,
const char *mine,
const char *older,
const char *yours,
const char *mine_label,
const char *older_label,
const char *yours_label,
apr_file_t *merged,
const char *diff3_cmd,
const apr_array_header_t *user_args,
apr_pool_t *pool)
{
SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
return svn_error_trace(svn_io_run_diff3_3(exitcode, dir,
mine, older, yours,
mine_label, older_label,
yours_label, merged,
diff3_cmd, user_args, pool));
}
svn_error_t *
svn_io_run_diff3(const char *dir,
const char *mine,
const char *older,
const char *yours,
const char *mine_label,
const char *older_label,
const char *yours_label,
apr_file_t *merged,
int *exitcode,
const char *diff3_cmd,
apr_pool_t *pool)
{
return svn_error_trace(svn_io_run_diff3_2(exitcode, dir, mine, older, yours,
mine_label, older_label,
yours_label,
merged, diff3_cmd, NULL, pool));
}
svn_error_t *
svn_io_remove_file(const char *path,
apr_pool_t *scratch_pool)
{
return svn_error_trace(svn_io_remove_file2(path, FALSE, scratch_pool));
}
svn_error_t *svn_io_file_lock(const char *lock_file,
svn_boolean_t exclusive,
apr_pool_t *pool)
{
return svn_io_file_lock2(lock_file, exclusive, FALSE, pool);
}
svn_error_t *
svn_io_get_dirents2(apr_hash_t **dirents,
const char *path,
apr_pool_t *pool)
{
/* Note that the first part of svn_io_dirent2_t is identical
to svn_io_dirent_t to allow this construct */
return svn_error_trace(
svn_io_get_dirents3(dirents, path, FALSE, pool, pool));
}
svn_error_t *
svn_io_get_dirents(apr_hash_t **dirents,
const char *path,
apr_pool_t *pool)
{
/* Note that in C, padding is not allowed at the beginning of structs,
so this is actually portable, since the kind field of svn_io_dirent_t
is first in that struct. */
return svn_io_get_dirents2(dirents, path, pool);
}
svn_error_t *
svn_io_start_cmd2(apr_proc_t *cmd_proc,
const char *path,
const char *cmd,
const char *const *args,
svn_boolean_t inherit,
svn_boolean_t infile_pipe,
apr_file_t *infile,
svn_boolean_t outfile_pipe,
apr_file_t *outfile,
svn_boolean_t errfile_pipe,
apr_file_t *errfile,
apr_pool_t *pool)
{
return svn_io_start_cmd3(cmd_proc, path, cmd, args, NULL, inherit,
infile_pipe, infile, outfile_pipe, outfile,
errfile_pipe, errfile, pool);
}
svn_error_t *
svn_io_start_cmd(apr_proc_t *cmd_proc,
const char *path,
const char *cmd,
const char *const *args,
svn_boolean_t inherit,
apr_file_t *infile,
apr_file_t *outfile,
apr_file_t *errfile,
apr_pool_t *pool)
{
return svn_io_start_cmd2(cmd_proc, path, cmd, args, inherit, FALSE,
infile, FALSE, outfile, FALSE, errfile, pool);
}
svn_error_t *
svn_io_file_read_full(apr_file_t *file, void *buf,
apr_size_t nbytes, apr_size_t *bytes_read,
apr_pool_t *pool)
{
return svn_io_file_read_full2(file, buf, nbytes, bytes_read, NULL, pool);
}
struct walk_func_filter_baton_t
{
svn_io_walk_func_t walk_func;
void *walk_baton;
};
/* Implements svn_io_walk_func_t, but only allows APR_DIR and APR_REG
finfo types through to the wrapped function/baton. */
static svn_error_t *
walk_func_filter_func(void *baton,
const char *path,
const apr_finfo_t *finfo,
apr_pool_t *pool)
{
struct walk_func_filter_baton_t *b = baton;
if (finfo->filetype == APR_DIR || finfo->filetype == APR_REG)
SVN_ERR(b->walk_func(b->walk_baton, path, finfo, pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_io_dir_walk(const char *dirname,
apr_int32_t wanted,
svn_io_walk_func_t walk_func,
void *walk_baton,
apr_pool_t *pool)
{
struct walk_func_filter_baton_t baton;
baton.walk_func = walk_func;
baton.walk_baton = walk_baton;
return svn_error_trace(svn_io_dir_walk2(dirname, wanted,
walk_func_filter_func,
&baton, pool));
}
svn_error_t *
svn_io_stat_dirent(const svn_io_dirent2_t **dirent_p,
const char *path,
svn_boolean_t ignore_enoent,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
return svn_error_trace(
svn_io_stat_dirent2(dirent_p,
path,
FALSE,
ignore_enoent,
result_pool,
scratch_pool));
}
/*** From constructors.c ***/
svn_log_changed_path_t *
svn_log_changed_path_dup(const svn_log_changed_path_t *changed_path,
apr_pool_t *pool)
{
svn_log_changed_path_t *new_changed_path
= apr_palloc(pool, sizeof(*new_changed_path));
*new_changed_path = *changed_path;
if (new_changed_path->copyfrom_path)
new_changed_path->copyfrom_path =
apr_pstrdup(pool, new_changed_path->copyfrom_path);
return new_changed_path;
}
/*** From cmdline.c ***/
svn_error_t *
svn_cmdline_prompt_user(const char **result,
const char *prompt_str,
apr_pool_t *pool)
{
return svn_error_trace(svn_cmdline_prompt_user2(result, prompt_str, NULL,
pool));
}
svn_error_t *
svn_cmdline_setup_auth_baton(svn_auth_baton_t **ab,
svn_boolean_t non_interactive,
const char *auth_username,
const char *auth_password,
const char *config_dir,
svn_boolean_t no_auth_cache,
svn_config_t *cfg,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
return svn_error_trace(svn_cmdline_create_auth_baton(
ab, non_interactive,
auth_username, auth_password,
config_dir, no_auth_cache, FALSE,
cfg, cancel_func, cancel_baton, pool));
}
/*** From dso.c ***/
void
svn_dso_initialize(void)
{
svn_error_t *err = svn_dso_initialize2();
if (err)
{
svn_error_clear(err);
abort();
}
}
/*** From simple_providers.c ***/
void
svn_auth_get_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth_get_simple_provider2(provider, NULL, NULL, pool);
}
/*** From ssl_client_cert_pw_providers.c ***/
void
svn_auth_get_ssl_client_cert_pw_file_provider
(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth_get_ssl_client_cert_pw_file_provider2(provider, NULL, NULL, pool);
}
/*** From path.c ***/
#define SVN_EMPTY_PATH ""
const char *
svn_path_url_add_component(const char *url,
const char *component,
apr_pool_t *pool)
{
/* URL can have trailing '/' */
url = svn_path_canonicalize(url, pool);
return svn_path_url_add_component2(url, component, pool);
}
void
svn_path_split(const char *path,
const char **dirpath,
const char **base_name,
apr_pool_t *pool)
{
assert(dirpath != base_name);
if (dirpath)
*dirpath = svn_path_dirname(path, pool);
if (base_name)
*base_name = svn_path_basename(path, pool);
}
svn_error_t *
svn_path_split_if_file(const char *path,
const char **pdirectory,
const char **pfile,
apr_pool_t *pool)
{
apr_finfo_t finfo;
svn_error_t *err;
SVN_ERR_ASSERT(svn_path_is_canonical(path, pool));
err = svn_io_stat(&finfo, path, APR_FINFO_TYPE, pool);
if (err && ! APR_STATUS_IS_ENOENT(err->apr_err))
return err;
if (err || finfo.filetype == APR_REG)
{
svn_error_clear(err);
svn_path_split(path, pdirectory, pfile, pool);
}
else if (finfo.filetype == APR_DIR)
{
*pdirectory = path;
*pfile = SVN_EMPTY_PATH;
}
else
{
return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
_("'%s' is neither a file nor a directory name"),
svn_path_local_style(path, pool));
}
return SVN_NO_ERROR;
}
/*** From stream.c ***/
svn_error_t *svn_stream_copy2(svn_stream_t *from, svn_stream_t *to,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
return svn_error_trace(svn_stream_copy3(
svn_stream_disown(from, scratch_pool),
svn_stream_disown(to, scratch_pool),
cancel_func, cancel_baton, scratch_pool));
}
svn_error_t *svn_stream_copy(svn_stream_t *from, svn_stream_t *to,
apr_pool_t *scratch_pool)
{
return svn_error_trace(svn_stream_copy3(
svn_stream_disown(from, scratch_pool),
svn_stream_disown(to, scratch_pool),
NULL, NULL, scratch_pool));
}
svn_stream_t *
svn_stream_from_aprfile(apr_file_t *file, apr_pool_t *pool)
{
return svn_stream_from_aprfile2(file, TRUE, pool);
}
svn_error_t *
svn_stream_contents_same(svn_boolean_t *same,
svn_stream_t *stream1,
svn_stream_t *stream2,
apr_pool_t *pool)
{
return svn_error_trace(svn_stream_contents_same2(
same,
svn_stream_disown(stream1, pool),
svn_stream_disown(stream2, pool),
pool));
}
void
svn_stream_set_read(svn_stream_t *stream,
svn_read_fn_t read_fn)
{
svn_stream_set_read2(stream, NULL /* only full read support */,
read_fn);
}
svn_error_t *
svn_stream_read(svn_stream_t *stream,
char *buffer,
apr_size_t *len)
{
return svn_error_trace(svn_stream_read_full(stream, buffer, len));
}
struct md5_stream_baton
{
const unsigned char **read_digest;
const unsigned char **write_digest;
svn_checksum_t *read_checksum;
svn_checksum_t *write_checksum;
svn_stream_t *proxy;
apr_pool_t *pool;
};
static svn_error_t *
read_handler_md5(void *baton, char *buffer, apr_size_t *len)
{
struct md5_stream_baton *btn = baton;
return svn_error_trace(svn_stream_read2(btn->proxy, buffer, len));
}
static svn_error_t *
read_full_handler_md5(void *baton, char *buffer, apr_size_t *len)
{
struct md5_stream_baton *btn = baton;
return svn_error_trace(svn_stream_read_full(btn->proxy, buffer, len));
}
static svn_error_t *
skip_handler_md5(void *baton, apr_size_t len)
{
struct md5_stream_baton *btn = baton;
return svn_error_trace(svn_stream_skip(btn->proxy, len));
}
static svn_error_t *
write_handler_md5(void *baton, const char *buffer, apr_size_t *len)
{
struct md5_stream_baton *btn = baton;
return svn_error_trace(svn_stream_write(btn->proxy, buffer, len));
}
static svn_error_t *
close_handler_md5(void *baton)
{
struct md5_stream_baton *btn = baton;
SVN_ERR(svn_stream_close(btn->proxy));
if (btn->read_digest)
*btn->read_digest
= apr_pmemdup(btn->pool, btn->read_checksum->digest,
APR_MD5_DIGESTSIZE);
if (btn->write_digest)
*btn->write_digest
= apr_pmemdup(btn->pool, btn->write_checksum->digest,
APR_MD5_DIGESTSIZE);
return SVN_NO_ERROR;
}
svn_stream_t *
svn_stream_checksummed(svn_stream_t *stream,
const unsigned char **read_digest,
const unsigned char **write_digest,
svn_boolean_t read_all,
apr_pool_t *pool)
{
svn_stream_t *s;
struct md5_stream_baton *baton;
if (! read_digest && ! write_digest)
return stream;
baton = apr_palloc(pool, sizeof(*baton));
baton->read_digest = read_digest;
baton->write_digest = write_digest;
baton->pool = pool;
/* Set BATON->proxy to a stream that will fill in BATON->read_checksum
* and BATON->write_checksum (if we want them) when it is closed. */
baton->proxy
= svn_stream_checksummed2(stream,
read_digest ? &baton->read_checksum : NULL,
write_digest ? &baton->write_checksum : NULL,
svn_checksum_md5,
read_all, pool);
/* Create a stream that will forward its read/write/close operations to
* BATON->proxy and will fill in *READ_DIGEST and *WRITE_DIGEST (if we
* want them) after it closes BATON->proxy. */
s = svn_stream_create(baton, pool);
svn_stream_set_read2(s, read_handler_md5, read_full_handler_md5);
svn_stream_set_skip(s, skip_handler_md5);
svn_stream_set_write(s, write_handler_md5);
svn_stream_set_close(s, close_handler_md5);
return s;
}
/*** From path.c ***/
const char *
svn_path_internal_style(const char *path, apr_pool_t *pool)
{
if (svn_path_is_url(path))
return svn_uri_canonicalize(path, pool);
else
return svn_dirent_internal_style(path, pool);
}
const char *
svn_path_local_style(const char *path, apr_pool_t *pool)
{
if (svn_path_is_url(path))
return apr_pstrdup(pool, path);
else
return svn_dirent_local_style(path, pool);
}
const char *
svn_path_canonicalize(const char *path, apr_pool_t *pool)
{
if (svn_path_is_url(path))
return svn_uri_canonicalize(path, pool);
else
return svn_dirent_canonicalize(path, pool);
}
/*** From mergeinfo.c ***/
svn_error_t *
svn_mergeinfo_inheritable(svn_mergeinfo_t *output,
svn_mergeinfo_t mergeinfo,
const char *path,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool)
{
return svn_error_trace(svn_mergeinfo_inheritable2(output, mergeinfo, path,
start, end,
TRUE, pool, pool));
}
svn_error_t *
svn_rangelist_inheritable(svn_rangelist_t **inheritable_rangelist,
const svn_rangelist_t *rangelist,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool)
{
return svn_error_trace(svn_rangelist_inheritable2(inheritable_rangelist,
rangelist,
start, end, TRUE,
pool, pool));
}
svn_error_t *
svn_rangelist_merge(svn_rangelist_t **rangelist,
const svn_rangelist_t *changes,
apr_pool_t *pool)
{
SVN_ERR(svn_rangelist_merge2(*rangelist, changes,
pool, pool));
return svn_error_trace(
svn_rangelist__combine_adjacent_ranges(*rangelist, pool));
}
svn_error_t *
svn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added,
svn_mergeinfo_t from, svn_mergeinfo_t to,
svn_boolean_t consider_inheritance,
apr_pool_t *pool)
{
return svn_error_trace(svn_mergeinfo_diff2(deleted, added, from, to,
consider_inheritance, pool,
pool));
}
svn_error_t *
svn_mergeinfo_merge(svn_mergeinfo_t mergeinfo,
svn_mergeinfo_t changes,
apr_pool_t *pool)
{
return svn_error_trace(svn_mergeinfo_merge2(mergeinfo, changes, pool,
pool));
}
svn_error_t *
svn_mergeinfo_remove(svn_mergeinfo_t *mergeinfo, svn_mergeinfo_t eraser,
svn_mergeinfo_t whiteboard, apr_pool_t *pool)
{
return svn_mergeinfo_remove2(mergeinfo, eraser, whiteboard, TRUE, pool,
pool);
}
svn_error_t *
svn_mergeinfo_intersect(svn_mergeinfo_t *mergeinfo,
svn_mergeinfo_t mergeinfo1,
svn_mergeinfo_t mergeinfo2,
apr_pool_t *pool)
{
return svn_mergeinfo_intersect2(mergeinfo, mergeinfo1, mergeinfo2,
TRUE, pool, pool);
}
/*** From config.c ***/
svn_error_t *
svn_config_create(svn_config_t **cfgp,
svn_boolean_t section_names_case_sensitive,
apr_pool_t *result_pool)
{
return svn_error_trace(svn_config_create2(cfgp,
section_names_case_sensitive,
FALSE,
result_pool));
}
svn_error_t *
svn_config_read2(svn_config_t **cfgp, const char *file,
svn_boolean_t must_exist,
svn_boolean_t section_names_case_sensitive,
apr_pool_t *result_pool)
{
return svn_error_trace(svn_config_read3(cfgp, file,
must_exist,
section_names_case_sensitive,
FALSE,
result_pool));
}
svn_error_t *
svn_config_read(svn_config_t **cfgp, const char *file,
svn_boolean_t must_exist,
apr_pool_t *result_pool)
{
return svn_error_trace(svn_config_read3(cfgp, file,
must_exist,
FALSE, FALSE,
result_pool));
}
#ifdef SVN_DISABLE_FULL_VERSION_MATCH
/* This double underscore name is used by the 1.6 command line client.
Keeping this name is sufficient for the 1.6 client to use the 1.7
libraries at runtime. */
svn_error_t *
svn_opt__eat_peg_revisions(apr_array_header_t **true_targets_p,
apr_array_header_t *targets,
apr_pool_t *pool);
svn_error_t *
svn_opt__eat_peg_revisions(apr_array_header_t **true_targets_p,
apr_array_header_t *targets,
apr_pool_t *pool)
{
unsigned int i;
apr_array_header_t *true_targets;
true_targets = apr_array_make(pool, 5, sizeof(const char *));
for (i = 0; i < targets->nelts; i++)
{
const char *target = APR_ARRAY_IDX(targets, i, const char *);
const char *true_target;
SVN_ERR(svn_opt__split_arg_at_peg_revision(&true_target, NULL,
target, pool));
APR_ARRAY_PUSH(true_targets, const char *) = true_target;
}
SVN_ERR_ASSERT(true_targets_p);
*true_targets_p = true_targets;
return SVN_NO_ERROR;
}
#endif
void
svn_xml_make_header(svn_stringbuf_t **str, apr_pool_t *pool)
{
svn_xml_make_header2(str, NULL, pool);
}
/*** From utf.c ***/
void
svn_utf_initialize(apr_pool_t *pool)
{
svn_utf_initialize2(FALSE, pool);
}
svn_error_t *
svn_utf_cstring_from_utf8_ex(const char **dest,
const char *src,
const char *topage,
const char *convset_key,
apr_pool_t *pool)
{
return svn_utf_cstring_from_utf8_ex2(dest, src, topage, pool);
}
/*** From error.c ***/
void
svn_handle_error(svn_error_t *err, FILE *stream, svn_boolean_t fatal)
{
svn_handle_error2(err, stream, fatal, "svn: ");
}
void
svn_handle_warning(FILE *stream, svn_error_t *err)
{
svn_handle_warning2(stream, err, "svn: ");
}
/*** From subst.c ***/
svn_error_t *
svn_subst_build_keywords(svn_subst_keywords_t *kw,
const char *keywords_val,
const char *rev,
const char *url,
apr_time_t date,
const char *author,
apr_pool_t *pool)
{
apr_hash_t *kwhash;
const svn_string_t *val;
SVN_ERR(svn_subst_build_keywords2(&kwhash, keywords_val, rev,
url, date, author, pool));
/* The behaviour of pre-1.3 svn_subst_build_keywords, which we are
* replicating here, is to write to a slot in the svn_subst_keywords_t
* only if the relevant keyword was present in keywords_val, otherwise
* leaving that slot untouched. */
val = svn_hash_gets(kwhash, SVN_KEYWORD_REVISION_LONG);
if (val)
kw->revision = val;
val = svn_hash_gets(kwhash, SVN_KEYWORD_DATE_LONG);
if (val)
kw->date = val;
val = svn_hash_gets(kwhash, SVN_KEYWORD_AUTHOR_LONG);
if (val)
kw->author = val;
val = svn_hash_gets(kwhash, SVN_KEYWORD_URL_LONG);
if (val)
kw->url = val;
val = svn_hash_gets(kwhash, SVN_KEYWORD_ID);
if (val)
kw->id = val;
return SVN_NO_ERROR;
}
/*** From version.c ***/
svn_error_t *
svn_ver_check_list(const svn_version_t *my_version,
const svn_version_checklist_t *checklist)
{
return svn_ver_check_list2(my_version, checklist, svn_ver_compatible);
}
/*** From win32_crypto.c ***/
#if defined(WIN32) && !defined(__MINGW32__)
void
svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth__get_windows_simple_provider(provider, pool);
}
void
svn_auth_get_windows_ssl_client_cert_pw_provider
(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth__get_windows_ssl_client_cert_pw_provider(provider, pool);
}
void
svn_auth_get_windows_ssl_server_trust_provider
(svn_auth_provider_object_t **provider, apr_pool_t *pool)
{
svn_auth__get_windows_ssl_server_trust_provider(provider, pool);
}
#endif /* WIN32 && !__MINGW32__ */
/*** From macos_keychain.c ***/
#if defined(DARWIN)
void
svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
+#ifdef SVN_HAVE_KEYCHAIN_SERVICES
svn_auth__get_keychain_simple_provider(provider, pool);
+#else
+ svn_auth__get_dummmy_simple_provider(provider, pool);
+#endif
}
void
svn_auth_get_keychain_ssl_client_cert_pw_provider
(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
+#ifdef SVN_HAVE_KEYCHAIN_SERVICES
svn_auth__get_keychain_ssl_client_cert_pw_provider(provider, pool);
+#else
+ /* Not really the right type of dummy provider, but doesn't throw NULL
+ errors as just returning NULL would */
+ svn_auth__get_dummmy_simple_provider(provider, pool);
+#endif
}
#endif /* DARWIN */
#if !defined(WIN32)
void
svn_auth_get_gpg_agent_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
#ifdef SVN_HAVE_GPG_AGENT
svn_auth__get_gpg_agent_simple_provider(provider, pool);
#else
svn_auth__get_dummmy_simple_provider(provider, pool);
#endif /* SVN_HAVE_GPG_AGENT */
}
#endif /* !WIN32 */
svn_error_t *
svn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
svn_boolean_t non_interactive,
const char *auth_username,
const char *auth_password,
const char *config_dir,
svn_boolean_t no_auth_cache,
svn_boolean_t trust_server_cert,
svn_config_t *cfg,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
{
return svn_error_trace(svn_cmdline_create_auth_baton2(ab,
non_interactive,
auth_username,
auth_password,
config_dir,
no_auth_cache,
trust_server_cert,
FALSE,
FALSE,
FALSE,
FALSE,
cfg,
cancel_func,
cancel_baton,
pool));
}
Index: stable/11/contrib/subversion/subversion/libsvn_subr/gpg_agent.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/gpg_agent.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/gpg_agent.c (revision 309511)
@@ -1,678 +1,682 @@
/*
* gpg_agent.c: GPG Agent provider for SVN_AUTH_CRED_*
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* ==================================================================== */
/* This auth provider stores a plaintext password in memory managed by
* a running gpg-agent. In contrast to other password store providers
* it does not save the password to disk.
*
* Prompting is performed by the gpg-agent using a "pinentry" program
* which needs to be installed separately. There are several pinentry
* implementations with different front-ends (e.g. qt, gtk, ncurses).
*
* The gpg-agent will let the password time out after a while,
* or immediately when it receives the SIGHUP signal.
* When the password has timed out it will automatically prompt the
* user for the password again. This is transparent to Subversion.
*
* SECURITY CONSIDERATIONS:
*
* Communication to the agent happens over a UNIX socket, which is located
* in a directory which only the user running Subversion can access.
* However, any program the user runs could access this socket and get
* the Subversion password if the program knows the "cache ID" Subversion
* uses for the password.
* The cache ID is very easy to obtain for programs running as the same user.
* Subversion uses the MD5 of the realmstring as cache ID, and these checksums
* are also used as filenames within ~/.subversion/auth/svn.simple.
* Unlike GNOME Keyring or KDE Wallet, the user is not prompted for
* permission if another program attempts to access the password.
*
* Therefore, while the gpg-agent is running and has the password cached,
* this provider is no more secure than a file storing the password in
* plaintext.
*/
/*** Includes. ***/
#ifndef WIN32
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <apr_pools.h>
#include "svn_auth.h"
#include "svn_config.h"
#include "svn_error.h"
#include "svn_pools.h"
#include "svn_cmdline.h"
#include "svn_checksum.h"
#include "svn_string.h"
#include "svn_hash.h"
#include "svn_user.h"
#include "svn_dirent_uri.h"
#include "auth.h"
#include "private/svn_auth_private.h"
#include "svn_private_config.h"
#ifdef SVN_HAVE_GPG_AGENT
#define BUFFER_SIZE 1024
#define ATTEMPT_PARAMETER "svn.simple.gpg_agent.attempt"
/* Modify STR in-place such that blanks are escaped as required by the
* gpg-agent protocol. Return a pointer to STR. */
static char *
escape_blanks(char *str)
{
char *s = str;
while (*s)
{
if (*s == ' ')
*s = '+';
s++;
}
return str;
}
#define is_hex(c) (((c) >= '0' && (c) <= '9') || ((c) >= 'A' && (c) <= 'F'))
#define hex_to_int(c) ((c) < '9' ? (c) - '0' : (c) - 'A' + 10)
/* Modify STR in-place. '%', CR and LF are always percent escaped,
other characters may be percent escaped, always using uppercase
hex, see https://www.gnupg.org/documentation/manuals/assuan.pdf */
static char *
unescape_assuan(char *str)
{
char *s = str;
while (s[0])
{
if (s[0] == '%' && is_hex(s[1]) && is_hex(s[2]))
{
char *s2 = s;
char val = hex_to_int(s[1]) * 16 + hex_to_int(s[2]);
s2[0] = val;
++s2;
while (s2[2])
{
s2[0] = s2[2];
++s2;
}
s2[0] = '\0';
}
++s;
}
return str;
}
/* Generate the string CACHE_ID_P based on the REALMSTRING allocated in
* RESULT_POOL using SCRATCH_POOL for temporary allocations. This is similar
* to other password caching mechanisms. */
static svn_error_t *
get_cache_id(const char **cache_id_p, const char *realmstring,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
const char *cache_id = NULL;
svn_checksum_t *digest = NULL;
SVN_ERR(svn_checksum(&digest, svn_checksum_md5, realmstring,
strlen(realmstring), scratch_pool));
cache_id = svn_checksum_to_cstring(digest, result_pool);
*cache_id_p = cache_id;
return SVN_NO_ERROR;
}
/* Attempt to read a gpg-agent response message from the socket SD into
* buffer BUF. Buf is assumed to be N bytes large. Return TRUE if a response
* message could be read that fits into the buffer. Else return FALSE.
* If a message could be read it will always be NUL-terminated and the
* trailing newline is retained. */
static svn_boolean_t
receive_from_gpg_agent(int sd, char *buf, size_t n)
{
int i = 0;
size_t recvd;
char c;
/* Clear existing buffer content before reading response. */
if (n > 0)
*buf = '\0';
/* Require the message to fit into the buffer and be terminated
* with a newline. */
while (i < n)
{
recvd = read(sd, &c, 1);
if (recvd == -1)
return FALSE;
buf[i] = c;
i++;
if (i < n && c == '\n')
{
buf[i] = '\0';
return TRUE;
}
}
return FALSE;
}
/* Using socket SD, send the option OPTION with the specified VALUE
* to the gpg agent. Store the response in BUF, assumed to be N bytes
* in size, and evaluate the response. Return TRUE if the agent liked
* the smell of the option, if there is such a thing, and doesn't feel
* saturated by it. Else return FALSE.
* Do temporary allocations in scratch_pool. */
static svn_boolean_t
send_option(int sd, char *buf, size_t n, const char *option, const char *value,
apr_pool_t *scratch_pool)
{
const char *request;
request = apr_psprintf(scratch_pool, "OPTION %s=%s\n", option, value);
if (write(sd, request, strlen(request)) == -1)
return FALSE;
if (!receive_from_gpg_agent(sd, buf, n))
return FALSE;
return (strncmp(buf, "OK", 2) == 0);
}
/* Send the BYE command and disconnect from the gpg-agent. Doing this avoids
* gpg-agent emitting a "Connection reset by peer" log message with some
* versions of gpg-agent. */
static void
bye_gpg_agent(int sd)
{
/* don't bother to check the result of the write, it either worked or it
* didn't, but either way we're closing. */
write(sd, "BYE\n", 4);
close(sd);
}
/* Locate a running GPG Agent, and return an open file descriptor
* for communication with the agent in *NEW_SD. If no running agent
* can be found, set *NEW_SD to -1. */
static svn_error_t *
find_running_gpg_agent(int *new_sd, apr_pool_t *pool)
{
char *buffer;
char *gpg_agent_info = NULL;
+ char *gnupghome = NULL;
const char *socket_name = NULL;
const char *request = NULL;
const char *p = NULL;
char *ep = NULL;
int sd;
*new_sd = -1;
/* This implements the method of finding the socket as described in
* the gpg-agent man page under the --use-standard-socket option.
- * The manage page misleadingly says the standard socket is
- * "named 'S.gpg-agent' located in the home directory." The standard
- * socket path is actually in the .gnupg directory in the home directory,
- * i.e. ~/.gnupg/S.gpg-agent */
+ * The manage page says the standard socket is "named 'S.gpg-agent' located
+ * in the home directory." GPG's home directory is either the directory
+ * specified by $GNUPGHOME or ~/.gnupg. */
gpg_agent_info = getenv("GPG_AGENT_INFO");
if (gpg_agent_info != NULL)
{
apr_array_header_t *socket_details;
/* For reference GPG_AGENT_INFO consists of 3 : separated fields.
* The path to the socket, the pid of the gpg-agent process and
* finally the version of the protocol the agent talks. */
socket_details = svn_cstring_split(gpg_agent_info, ":", TRUE,
pool);
socket_name = APR_ARRAY_IDX(socket_details, 0, const char *);
}
+ else if ((gnupghome = getenv("GNUPGHOME")) != NULL)
+ {
+ const char *homedir = svn_dirent_canonicalize(gnupghome, pool);
+ socket_name = svn_dirent_join(homedir, "S.gpg-agent", pool);
+ }
else
{
const char *homedir = svn_user_get_homedir(pool);
if (!homedir)
return SVN_NO_ERROR;
homedir = svn_dirent_canonicalize(homedir, pool);
socket_name = svn_dirent_join_many(pool, homedir, ".gnupg",
"S.gpg-agent", SVN_VA_NULL);
}
if (socket_name != NULL)
{
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, socket_name, sizeof(addr.sun_path) - 1);
addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
sd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sd == -1)
return SVN_NO_ERROR;
if (connect(sd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
close(sd);
return SVN_NO_ERROR;
}
}
else
return SVN_NO_ERROR;
/* Receive the connection status from the gpg-agent daemon. */
buffer = apr_palloc(pool, BUFFER_SIZE);
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
if (strncmp(buffer, "OK", 2) != 0)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
/* The GPG-Agent documentation says:
* "Clients should deny to access an agent with a socket name which does
* not match its own configuration". */
request = "GETINFO socket_name\n";
if (write(sd, request, strlen(request)) == -1)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
if (strncmp(buffer, "D", 1) == 0)
p = &buffer[2];
if (!p)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
ep = strchr(p, '\n');
if (ep != NULL)
*ep = '\0';
if (strcmp(socket_name, p) != 0)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
/* The agent will terminate its response with "OK". */
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
if (strncmp(buffer, "OK", 2) != 0)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
*new_sd = sd;
return SVN_NO_ERROR;
}
static svn_boolean_t
send_options(int sd, char *buf, size_t n, apr_pool_t *scratch_pool)
{
const char *tty_name;
const char *tty_type;
const char *lc_ctype;
const char *display;
/* Send TTY_NAME to the gpg-agent daemon. */
tty_name = getenv("GPG_TTY");
if (tty_name != NULL)
{
if (!send_option(sd, buf, n, "ttyname", tty_name, scratch_pool))
return FALSE;
}
/* Send TTY_TYPE to the gpg-agent daemon. */
tty_type = getenv("TERM");
if (tty_type != NULL)
{
if (!send_option(sd, buf, n, "ttytype", tty_type, scratch_pool))
return FALSE;
}
/* Compute LC_CTYPE. */
lc_ctype = getenv("LC_ALL");
if (lc_ctype == NULL)
lc_ctype = getenv("LC_CTYPE");
if (lc_ctype == NULL)
lc_ctype = getenv("LANG");
/* Send LC_CTYPE to the gpg-agent daemon. */
if (lc_ctype != NULL)
{
if (!send_option(sd, buf, n, "lc-ctype", lc_ctype, scratch_pool))
return FALSE;
}
/* Send DISPLAY to the gpg-agent daemon. */
display = getenv("DISPLAY");
if (display != NULL)
{
if (!send_option(sd, buf, n, "display", display, scratch_pool))
return FALSE;
}
return TRUE;
}
/* Implementation of svn_auth__password_get_t that retrieves the password
from gpg-agent */
static svn_error_t *
password_get_gpg_agent(svn_boolean_t *done,
const char **password,
apr_hash_t *creds,
const char *realmstring,
const char *username,
apr_hash_t *parameters,
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
int sd;
char *p = NULL;
char *ep = NULL;
char *buffer;
const char *request = NULL;
const char *cache_id = NULL;
char *password_prompt;
char *realm_prompt;
char *error_prompt;
int *attempt;
*done = FALSE;
attempt = svn_hash_gets(parameters, ATTEMPT_PARAMETER);
SVN_ERR(find_running_gpg_agent(&sd, pool));
if (sd == -1)
return SVN_NO_ERROR;
buffer = apr_palloc(pool, BUFFER_SIZE);
if (!send_options(sd, buffer, BUFFER_SIZE, pool))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
SVN_ERR(get_cache_id(&cache_id, realmstring, pool, pool));
password_prompt = apr_psprintf(pool, _("Password for '%s': "), username);
realm_prompt = apr_psprintf(pool, _("Enter your Subversion password for %s"),
realmstring);
if (*attempt == 1)
/* X means no error to the gpg-agent protocol */
error_prompt = apr_pstrdup(pool, "X");
else
error_prompt = apr_pstrdup(pool, _("Authentication failed"));
request = apr_psprintf(pool,
"GET_PASSPHRASE --data %s"
"%s %s %s %s\n",
non_interactive ? "--no-ask " : "",
cache_id,
escape_blanks(error_prompt),
escape_blanks(password_prompt),
escape_blanks(realm_prompt));
if (write(sd, request, strlen(request)) == -1)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
bye_gpg_agent(sd);
if (strncmp(buffer, "ERR", 3) == 0)
return SVN_NO_ERROR;
p = NULL;
if (strncmp(buffer, "D", 1) == 0)
p = &buffer[2];
if (!p)
return SVN_NO_ERROR;
ep = strchr(p, '\n');
if (ep != NULL)
*ep = '\0';
*password = unescape_assuan(p);
*done = TRUE;
return SVN_NO_ERROR;
}
/* Implementation of svn_auth__password_set_t that would store the
password in GPG Agent if that's how this particular integration
worked. But it isn't. GPG Agent stores the password provided by
the user via the pinentry program immediately upon its provision
(and regardless of its accuracy as passwords go), so we just need
to check if a running GPG Agent exists. */
static svn_error_t *
password_set_gpg_agent(svn_boolean_t *done,
apr_hash_t *creds,
const char *realmstring,
const char *username,
const char *password,
apr_hash_t *parameters,
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
int sd;
*done = FALSE;
SVN_ERR(find_running_gpg_agent(&sd, pool));
if (sd == -1)
return SVN_NO_ERROR;
bye_gpg_agent(sd);
*done = TRUE;
return SVN_NO_ERROR;
}
/* An implementation of svn_auth_provider_t::first_credentials() */
static svn_error_t *
simple_gpg_agent_first_creds(void **credentials,
void **iter_baton,
void *provider_baton,
apr_hash_t *parameters,
const char *realmstring,
apr_pool_t *pool)
{
svn_error_t *err;
int *attempt = apr_palloc(pool, sizeof(*attempt));
*attempt = 1;
svn_hash_sets(parameters, ATTEMPT_PARAMETER, attempt);
err = svn_auth__simple_creds_cache_get(credentials, iter_baton,
provider_baton, parameters,
realmstring, password_get_gpg_agent,
SVN_AUTH__GPG_AGENT_PASSWORD_TYPE,
pool);
*iter_baton = attempt;
return err;
}
/* An implementation of svn_auth_provider_t::next_credentials() */
static svn_error_t *
simple_gpg_agent_next_creds(void **credentials,
void *iter_baton,
void *provider_baton,
apr_hash_t *parameters,
const char *realmstring,
apr_pool_t *pool)
{
int *attempt = (int *)iter_baton;
int sd;
char *buffer;
const char *cache_id = NULL;
const char *request = NULL;
*credentials = NULL;
/* The users previous credentials failed so first remove the cached entry,
* before trying to retrieve them again. Because gpg-agent stores cached
* credentials immediately upon retrieving them, this gives us the
* opportunity to remove the invalid credentials and prompt the
* user again. While it's possible that server side issues could trigger
* this, this cache is ephemeral so at worst we're just speeding up
* when the user would need to re-enter their password. */
if (svn_hash_gets(parameters, SVN_AUTH_PARAM_NON_INTERACTIVE))
{
/* In this case since we're running non-interactively we do not
* want to clear the cache since the user was never prompted by
* gpg-agent to set a password. */
return SVN_NO_ERROR;
}
*attempt = *attempt + 1;
SVN_ERR(find_running_gpg_agent(&sd, pool));
if (sd == -1)
return SVN_NO_ERROR;
buffer = apr_palloc(pool, BUFFER_SIZE);
if (!send_options(sd, buffer, BUFFER_SIZE, pool))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
SVN_ERR(get_cache_id(&cache_id, realmstring, pool, pool));
request = apr_psprintf(pool, "CLEAR_PASSPHRASE %s\n", cache_id);
if (write(sd, request, strlen(request)) == -1)
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
if (!receive_from_gpg_agent(sd, buffer, BUFFER_SIZE))
{
bye_gpg_agent(sd);
return SVN_NO_ERROR;
}
+ bye_gpg_agent(sd);
+
if (strncmp(buffer, "OK\n", 3) != 0)
- {
- bye_gpg_agent(sd);
- return SVN_NO_ERROR;
- }
+ return SVN_NO_ERROR;
/* TODO: This attempt limit hard codes it at 3 attempts (or 2 retries)
* which matches svn command line client's retry_limit as set in
* svn_cmdline_create_auth_baton(). It would be nice to have that
* limit reflected here but that violates the boundry between the
* prompt provider and the cache provider. gpg-agent is acting as
* both here due to the peculiarties of their design so we'll have to
* live with this for now. Note that when these failures get exceeded
* it'll eventually fall back on the retry limits of whatever prompt
* provider is in effect, so this effectively doubles the limit. */
if (*attempt < 4)
return svn_auth__simple_creds_cache_get(credentials, &iter_baton,
provider_baton, parameters,
realmstring,
password_get_gpg_agent,
SVN_AUTH__GPG_AGENT_PASSWORD_TYPE,
pool);
return SVN_NO_ERROR;
}
/* An implementation of svn_auth_provider_t::save_credentials() */
static svn_error_t *
simple_gpg_agent_save_creds(svn_boolean_t *saved,
void *credentials,
void *provider_baton,
apr_hash_t *parameters,
const char *realmstring,
apr_pool_t *pool)
{
return svn_auth__simple_creds_cache_set(saved, credentials,
provider_baton, parameters,
realmstring, password_set_gpg_agent,
SVN_AUTH__GPG_AGENT_PASSWORD_TYPE,
pool);
}
static const svn_auth_provider_t gpg_agent_simple_provider = {
SVN_AUTH_CRED_SIMPLE,
simple_gpg_agent_first_creds,
simple_gpg_agent_next_creds,
simple_gpg_agent_save_creds
};
/* Public API */
void
svn_auth__get_gpg_agent_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po));
po->vtable = &gpg_agent_simple_provider;
*provider = po;
}
#endif /* SVN_HAVE_GPG_AGENT */
#endif /* !WIN32 */
Index: stable/11/contrib/subversion/subversion/libsvn_subr/internal_statements.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/internal_statements.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/internal_statements.h (revision 309511)
@@ -1,76 +1,76 @@
-/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_subr/token-map.h.
+/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_subr/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_INTERNAL_SAVEPOINT_SVN 0
#define STMT_0_INFO {"STMT_INTERNAL_SAVEPOINT_SVN", NULL}
#define STMT_0 \
"SAVEPOINT svn " \
""
#define STMT_INTERNAL_RELEASE_SAVEPOINT_SVN 1
#define STMT_1_INFO {"STMT_INTERNAL_RELEASE_SAVEPOINT_SVN", NULL}
#define STMT_1 \
"RELEASE SAVEPOINT svn " \
""
#define STMT_INTERNAL_ROLLBACK_TO_SAVEPOINT_SVN 2
#define STMT_2_INFO {"STMT_INTERNAL_ROLLBACK_TO_SAVEPOINT_SVN", NULL}
#define STMT_2 \
"ROLLBACK TO SAVEPOINT svn " \
""
#define STMT_INTERNAL_BEGIN_TRANSACTION 3
#define STMT_3_INFO {"STMT_INTERNAL_BEGIN_TRANSACTION", NULL}
#define STMT_3 \
"BEGIN TRANSACTION " \
""
#define STMT_INTERNAL_BEGIN_IMMEDIATE_TRANSACTION 4
#define STMT_4_INFO {"STMT_INTERNAL_BEGIN_IMMEDIATE_TRANSACTION", NULL}
#define STMT_4 \
"BEGIN IMMEDIATE TRANSACTION " \
""
#define STMT_INTERNAL_COMMIT_TRANSACTION 5
#define STMT_5_INFO {"STMT_INTERNAL_COMMIT_TRANSACTION", NULL}
#define STMT_5 \
"COMMIT TRANSACTION " \
""
#define STMT_INTERNAL_ROLLBACK_TRANSACTION 6
#define STMT_6_INFO {"STMT_INTERNAL_ROLLBACK_TRANSACTION", NULL}
#define STMT_6 \
"ROLLBACK TRANSACTION " \
""
#define STMT_INTERNAL_LAST 7
#define STMT_7_INFO {"STMT_INTERNAL_LAST", NULL}
#define STMT_7 \
"; " \
""
#define INTERNAL_STATEMENTS_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
STMT_1, \
STMT_2, \
STMT_3, \
STMT_4, \
STMT_5, \
STMT_6, \
STMT_7, \
NULL \
}
#define INTERNAL_STATEMENTS_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
STMT_1_INFO, \
STMT_2_INFO, \
STMT_3_INFO, \
STMT_4_INFO, \
STMT_5_INFO, \
STMT_6_INFO, \
STMT_7_INFO, \
{NULL, NULL} \
}
Index: stable/11/contrib/subversion/subversion/libsvn_subr/sqlite.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/sqlite.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/sqlite.c (revision 309511)
@@ -1,1564 +1,1608 @@
/* sqlite.c
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <apr_pools.h>
#include "svn_types.h"
#include "svn_error.h"
#include "svn_pools.h"
#include "svn_io.h"
#include "svn_dirent_uri.h"
#include "svn_checksum.h"
#include "internal_statements.h"
#include "private/svn_sqlite.h"
#include "svn_private_config.h"
#include "private/svn_dep_compat.h"
#include "private/svn_atomic.h"
#include "private/svn_skel.h"
#include "private/svn_token.h"
#ifdef WIN32
#include "private/svn_io_private.h"
#include "private/svn_utf_private.h"
#endif
#ifdef SVN_UNICODE_NORMALIZATION_FIXES
#include "private/svn_utf_private.h"
#include "private/svn_string_private.h"
#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
#ifdef SQLITE3_DEBUG
#include "private/svn_debug.h"
#endif
#ifdef SVN_SQLITE_INLINE
/* Import the sqlite3 API vtable from sqlite3wrapper.c */
# define SQLITE_OMIT_DEPRECATED
# include <sqlite3ext.h>
extern const sqlite3_api_routines *const svn_sqlite3__api_funcs;
extern int (*const svn_sqlite3__api_initialize)(void);
extern int (*const svn_sqlite3__api_config)(int, ...);
# define sqlite3_api svn_sqlite3__api_funcs
# define sqlite3_initialize svn_sqlite3__api_initialize
# define sqlite3_config svn_sqlite3__api_config
#else
# include <sqlite3.h>
#endif
#if !SQLITE_VERSION_AT_LEAST(3,7,12)
#error SQLite is too old -- version 3.7.12 is the minimum required version
#endif
#ifndef SQLITE_DETERMINISTIC
#define SQLITE_DETERMINISTIC 0
#endif
#ifdef SVN_UNICODE_NORMALIZATION_FIXES
/* Limit the length of a GLOB or LIKE pattern. */
#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
#endif
#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
const char *
svn_sqlite__compiled_version(void)
{
static const char sqlite_version[] = SQLITE_VERSION;
return sqlite_version;
}
const char *
svn_sqlite__runtime_version(void)
{
return sqlite3_libversion();
}
INTERNAL_STATEMENTS_SQL_DECLARE_STATEMENTS(internal_statements);
#ifdef SQLITE3_DEBUG
/* An sqlite query execution callback. */
static void
sqlite_tracer(void *data, const char *sql)
{
/* sqlite3 *db3 = data; */
SVN_DBG(("sql=\"%s\"\n", sql));
}
#endif
#ifdef SQLITE3_PROFILE
/* An sqlite execution timing callback. */
static void
sqlite_profiler(void *data, const char *sql, sqlite3_uint64 duration)
{
/* sqlite3 *db3 = data; */
SVN_DBG(("[%.3f] sql=\"%s\"\n", 1e-9 * duration, sql));
}
#endif
#if defined(SVN_DEBUG) && defined(SQLITE_CONFIG_LOG)
static void
sqlite_error_log(void* baton, int err, const char* msg)
{
fprintf(SVN_DBG_OUTPUT, "DBG: sqlite[S%d]: %s\n", err, msg);
}
#endif
void
svn_sqlite__dbg_enable_errorlog(void)
{
#if defined(SVN_DEBUG) && defined(SQLITE_CONFIG_LOG)
sqlite3_config(SQLITE_CONFIG_LOG, sqlite_error_log, (void*)NULL /* baton */);
#endif
}
struct svn_sqlite__db_t
{
sqlite3 *db3;
const char * const *statement_strings;
int nbr_statements;
svn_sqlite__stmt_t **prepared_stmts;
apr_pool_t *state_pool;
#ifdef SVN_UNICODE_NORMALIZATION_FIXES
/* Buffers for SQLite extensoins. */
svn_membuf_t sqlext_buf1;
svn_membuf_t sqlext_buf2;
svn_membuf_t sqlext_buf3;
#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
};
struct svn_sqlite__stmt_t
{
sqlite3_stmt *s3stmt;
svn_sqlite__db_t *db;
svn_boolean_t needs_reset;
};
struct svn_sqlite__context_t
{
sqlite3_context *context;
};
struct svn_sqlite__value_t
{
sqlite3_value *value;
};
/* Convert SQLite error codes to SVN. Evaluates X multiple times */
#define SQLITE_ERROR_CODE(x) ((x) == SQLITE_READONLY \
? SVN_ERR_SQLITE_READONLY \
: ((x) == SQLITE_BUSY \
? SVN_ERR_SQLITE_BUSY \
: ((x) == SQLITE_CONSTRAINT \
? SVN_ERR_SQLITE_CONSTRAINT \
: SVN_ERR_SQLITE_ERROR)))
/* SQLITE->SVN quick error wrap, much like SVN_ERR. */
#define SQLITE_ERR(x, db) do \
{ \
int sqlite_err__temp = (x); \
if (sqlite_err__temp != SQLITE_OK) \
return svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
NULL, "sqlite[S%d]: %s", \
sqlite_err__temp, \
sqlite3_errmsg((db)->db3)); \
} while (0)
#define SQLITE_ERR_CLOSE(x, db, pool) do \
{ \
int sqlite_err__temp = (x); \
if (sqlite_err__temp != SQLITE_OK) \
{ \
const char *sqlite_err__msg \
= apr_pstrdup(pool, sqlite3_errmsg((db)->db3)); \
return svn_error_compose_create( \
svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
NULL, "sqlite[S%d]: %s", \
sqlite_err__temp, sqlite_err__msg), \
svn_sqlite__close(db)); \
} \
} while (0)
#define SQLITE_ERR_MSG(x, msg) do \
{ \
int sqlite_err__temp = (x); \
if (sqlite_err__temp != SQLITE_OK) \
return svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
NULL, "sqlite[S%d]: %s", \
sqlite_err__temp, msg); \
} while (0)
#define SVN_ERR_CLOSE(x, db) do \
{ \
svn_error_t *svn__err = (x); \
if (svn__err) \
return svn_error_compose_create(svn__err, svn_sqlite__close(db)); \
} while (0)
/* Time (in milliseconds) to wait for sqlite locks before giving up. */
#define BUSY_TIMEOUT 10000
/* Convenience wrapper around exec_sql2(). */
#define exec_sql(db, sql) exec_sql2((db), (sql), SQLITE_OK)
/* Run the statement SQL on DB, ignoring SQLITE_OK and IGNORED_ERR.
(Note: the IGNORED_ERR parameter itself is not ignored.) */
static svn_error_t *
exec_sql2(svn_sqlite__db_t *db, const char *sql, int ignored_err)
{
char *err_msg;
int sqlite_err = sqlite3_exec(db->db3, sql, NULL, NULL, &err_msg);
if (sqlite_err != SQLITE_OK && sqlite_err != ignored_err)
{
svn_error_t *err = svn_error_createf(SQLITE_ERROR_CODE(sqlite_err), NULL,
_("sqlite[S%d]: %s,"
" executing statement '%s'"),
sqlite_err, err_msg, sql);
sqlite3_free(err_msg);
return err;
}
return SVN_NO_ERROR;
}
static svn_error_t *
prepare_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
const char *text, apr_pool_t *result_pool)
{
*stmt = apr_palloc(result_pool, sizeof(**stmt));
(*stmt)->db = db;
(*stmt)->needs_reset = FALSE;
SQLITE_ERR(sqlite3_prepare_v2(db->db3, text, -1, &(*stmt)->s3stmt, NULL), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__exec_statements(svn_sqlite__db_t *db, int stmt_idx)
{
SVN_ERR_ASSERT(stmt_idx < db->nbr_statements);
return svn_error_trace(exec_sql(db, db->statement_strings[stmt_idx]));
}
svn_error_t *
svn_sqlite__get_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
int stmt_idx)
{
SVN_ERR_ASSERT(stmt_idx < db->nbr_statements);
if (db->prepared_stmts[stmt_idx] == NULL)
SVN_ERR(prepare_statement(&db->prepared_stmts[stmt_idx], db,
db->statement_strings[stmt_idx],
db->state_pool));
*stmt = db->prepared_stmts[stmt_idx];
if ((*stmt)->needs_reset)
return svn_error_trace(svn_sqlite__reset(*stmt));
return SVN_NO_ERROR;
}
/* Like svn_sqlite__get_statement but gets an internal statement.
All internal statements that use this api are executed with step_done(),
so we don't need the fallback reset handling here or in the pool cleanup */
static svn_error_t *
get_internal_statement(svn_sqlite__stmt_t **stmt, svn_sqlite__db_t *db,
int stmt_idx)
{
/* The internal statements are stored after the registered statements */
int prep_idx = db->nbr_statements + stmt_idx;
SVN_ERR_ASSERT(stmt_idx < STMT_INTERNAL_LAST);
if (db->prepared_stmts[prep_idx] == NULL)
SVN_ERR(prepare_statement(&db->prepared_stmts[prep_idx], db,
internal_statements[stmt_idx],
db->state_pool));
*stmt = db->prepared_stmts[prep_idx];
return SVN_NO_ERROR;
}
static svn_error_t *
step_with_expectation(svn_sqlite__stmt_t* stmt,
svn_boolean_t expecting_row)
{
svn_boolean_t got_row;
SVN_ERR(svn_sqlite__step(&got_row, stmt));
if ((got_row && !expecting_row)
||
(!got_row && expecting_row))
return svn_error_create(SVN_ERR_SQLITE_ERROR,
svn_sqlite__reset(stmt),
expecting_row
? _("sqlite: Expected database row missing")
: _("sqlite: Extra database row found"));
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__step_done(svn_sqlite__stmt_t *stmt)
{
SVN_ERR(step_with_expectation(stmt, FALSE));
return svn_error_trace(svn_sqlite__reset(stmt));
}
svn_error_t *
svn_sqlite__step_row(svn_sqlite__stmt_t *stmt)
{
return svn_error_trace(step_with_expectation(stmt, TRUE));
}
svn_error_t *
svn_sqlite__step(svn_boolean_t *got_row, svn_sqlite__stmt_t *stmt)
{
int sqlite_result = sqlite3_step(stmt->s3stmt);
if (sqlite_result != SQLITE_DONE && sqlite_result != SQLITE_ROW)
{
svn_error_t *err1, *err2;
err1 = svn_error_createf(SQLITE_ERROR_CODE(sqlite_result), NULL,
"sqlite[S%d]: %s",
sqlite_result, sqlite3_errmsg(stmt->db->db3));
err2 = svn_sqlite__reset(stmt);
return svn_error_compose_create(err1, err2);
}
*got_row = (sqlite_result == SQLITE_ROW);
stmt->needs_reset = TRUE;
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__insert(apr_int64_t *row_id, svn_sqlite__stmt_t *stmt)
{
svn_boolean_t got_row;
SVN_ERR(svn_sqlite__step(&got_row, stmt));
if (row_id)
*row_id = sqlite3_last_insert_rowid(stmt->db->db3);
return svn_error_trace(svn_sqlite__reset(stmt));
}
svn_error_t *
svn_sqlite__update(int *affected_rows, svn_sqlite__stmt_t *stmt)
{
SVN_ERR(step_with_expectation(stmt, FALSE));
if (affected_rows)
*affected_rows = sqlite3_changes(stmt->db->db3);
return svn_error_trace(svn_sqlite__reset(stmt));
}
static svn_error_t *
vbindf(svn_sqlite__stmt_t *stmt, const char *fmt, va_list ap)
{
int count;
for (count = 1; *fmt; fmt++, count++)
{
const void *blob;
apr_size_t blob_size;
const svn_token_map_t *map;
switch (*fmt)
{
case 's':
SVN_ERR(svn_sqlite__bind_text(stmt, count,
va_arg(ap, const char *)));
break;
case 'd':
SVN_ERR(svn_sqlite__bind_int(stmt, count,
va_arg(ap, int)));
break;
case 'i':
case 'L':
SVN_ERR(svn_sqlite__bind_int64(stmt, count,
va_arg(ap, apr_int64_t)));
break;
case 'b':
blob = va_arg(ap, const void *);
blob_size = va_arg(ap, apr_size_t);
SVN_ERR(svn_sqlite__bind_blob(stmt, count, blob, blob_size));
break;
case 'r':
SVN_ERR(svn_sqlite__bind_revnum(stmt, count,
va_arg(ap, svn_revnum_t)));
break;
case 't':
map = va_arg(ap, const svn_token_map_t *);
SVN_ERR(svn_sqlite__bind_token(stmt, count, map, va_arg(ap, int)));
break;
case 'n':
/* Skip this column: no binding */
break;
default:
SVN_ERR_MALFUNCTION();
}
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bindf(svn_sqlite__stmt_t *stmt, const char *fmt, ...)
{
svn_error_t *err;
va_list ap;
va_start(ap, fmt);
err = vbindf(stmt, fmt, ap);
va_end(ap);
return svn_error_trace(err);
}
svn_error_t *
svn_sqlite__bind_int(svn_sqlite__stmt_t *stmt,
int slot,
int val)
{
SQLITE_ERR(sqlite3_bind_int(stmt->s3stmt, slot, val), stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bind_int64(svn_sqlite__stmt_t *stmt,
int slot,
apr_int64_t val)
{
SQLITE_ERR(sqlite3_bind_int64(stmt->s3stmt, slot, val), stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bind_text(svn_sqlite__stmt_t *stmt,
int slot,
const char *val)
{
SQLITE_ERR(sqlite3_bind_text(stmt->s3stmt, slot, val, -1, SQLITE_TRANSIENT),
stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bind_blob(svn_sqlite__stmt_t *stmt,
int slot,
const void *val,
apr_size_t len)
{
SQLITE_ERR(sqlite3_bind_blob(stmt->s3stmt, slot, val, (int) len,
SQLITE_TRANSIENT),
stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bind_token(svn_sqlite__stmt_t *stmt,
int slot,
const svn_token_map_t *map,
int value)
{
const char *word = svn_token__to_word(map, value);
SQLITE_ERR(sqlite3_bind_text(stmt->s3stmt, slot, word, -1, SQLITE_STATIC),
stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bind_revnum(svn_sqlite__stmt_t *stmt,
int slot,
svn_revnum_t value)
{
if (SVN_IS_VALID_REVNUM(value))
SQLITE_ERR(sqlite3_bind_int64(stmt->s3stmt, slot,
(sqlite_int64)value), stmt->db);
else
SQLITE_ERR(sqlite3_bind_null(stmt->s3stmt, slot), stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__bind_properties(svn_sqlite__stmt_t *stmt,
int slot,
const apr_hash_t *props,
apr_pool_t *scratch_pool)
{
svn_skel_t *skel;
svn_stringbuf_t *properties;
if (props == NULL)
return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, NULL, 0));
SVN_ERR(svn_skel__unparse_proplist(&skel, props, scratch_pool));
properties = svn_skel__unparse(skel, scratch_pool);
return svn_error_trace(svn_sqlite__bind_blob(stmt,
slot,
properties->data,
properties->len));
}
svn_error_t *
svn_sqlite__bind_iprops(svn_sqlite__stmt_t *stmt,
int slot,
const apr_array_header_t *inherited_props,
apr_pool_t *scratch_pool)
{
svn_skel_t *skel;
svn_stringbuf_t *properties;
if (inherited_props == NULL)
return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, NULL, 0));
SVN_ERR(svn_skel__unparse_iproplist(&skel, inherited_props,
scratch_pool, scratch_pool));
properties = svn_skel__unparse(skel, scratch_pool);
return svn_error_trace(svn_sqlite__bind_blob(stmt,
slot,
properties->data,
properties->len));
}
svn_error_t *
svn_sqlite__bind_checksum(svn_sqlite__stmt_t *stmt,
int slot,
const svn_checksum_t *checksum,
apr_pool_t *scratch_pool)
{
const char *csum_str;
if (checksum == NULL)
csum_str = NULL;
else
csum_str = svn_checksum_serialize(checksum, scratch_pool, scratch_pool);
return svn_error_trace(svn_sqlite__bind_text(stmt, slot, csum_str));
}
const void *
svn_sqlite__column_blob(svn_sqlite__stmt_t *stmt, int column,
apr_size_t *len, apr_pool_t *result_pool)
{
const void *val = sqlite3_column_blob(stmt->s3stmt, column);
*len = sqlite3_column_bytes(stmt->s3stmt, column);
if (result_pool && val != NULL)
val = apr_pmemdup(result_pool, val, *len);
return val;
}
const char *
svn_sqlite__column_text(svn_sqlite__stmt_t *stmt, int column,
apr_pool_t *result_pool)
{
/* cast from 'unsigned char' to regular 'char' */
const char *result = (const char *)sqlite3_column_text(stmt->s3stmt, column);
if (result_pool && result != NULL)
result = apr_pstrdup(result_pool, result);
return result;
}
svn_revnum_t
svn_sqlite__column_revnum(svn_sqlite__stmt_t *stmt, int column)
{
if (svn_sqlite__column_is_null(stmt, column))
return SVN_INVALID_REVNUM;
return (svn_revnum_t) sqlite3_column_int64(stmt->s3stmt, column);
}
svn_boolean_t
svn_sqlite__column_boolean(svn_sqlite__stmt_t *stmt, int column)
{
return sqlite3_column_int64(stmt->s3stmt, column) != 0;
}
int
svn_sqlite__column_int(svn_sqlite__stmt_t *stmt, int column)
{
return sqlite3_column_int(stmt->s3stmt, column);
}
apr_int64_t
svn_sqlite__column_int64(svn_sqlite__stmt_t *stmt, int column)
{
return sqlite3_column_int64(stmt->s3stmt, column);
}
int
svn_sqlite__column_token(svn_sqlite__stmt_t *stmt,
int column,
const svn_token_map_t *map)
{
/* cast from 'unsigned char' to regular 'char' */
const char *word = (const char *)sqlite3_column_text(stmt->s3stmt, column);
return svn_token__from_word_strict(map, word);
}
int
svn_sqlite__column_token_null(svn_sqlite__stmt_t *stmt,
int column,
const svn_token_map_t *map,
int null_val)
{
/* cast from 'unsigned char' to regular 'char' */
const char *word = (const char *)sqlite3_column_text(stmt->s3stmt, column);
if (!word)
return null_val;
return svn_token__from_word_strict(map, word);
}
svn_error_t *
svn_sqlite__column_properties(apr_hash_t **props,
svn_sqlite__stmt_t *stmt,
int column,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_size_t len;
const void *val;
/* svn_skel__parse_proplist copies everything needed to result_pool */
val = svn_sqlite__column_blob(stmt, column, &len, NULL);
if (val == NULL)
{
*props = NULL;
return SVN_NO_ERROR;
}
SVN_ERR(svn_skel__parse_proplist(props,
svn_skel__parse(val, len, scratch_pool),
result_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__column_iprops(apr_array_header_t **iprops,
svn_sqlite__stmt_t *stmt,
int column,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_size_t len;
const void *val;
/* svn_skel__parse_iprops copies everything needed to result_pool */
val = svn_sqlite__column_blob(stmt, column, &len, NULL);
if (val == NULL)
{
*iprops = NULL;
return SVN_NO_ERROR;
}
SVN_ERR(svn_skel__parse_iprops(iprops,
svn_skel__parse(val, len, scratch_pool),
result_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__column_checksum(const svn_checksum_t **checksum,
svn_sqlite__stmt_t *stmt, int column,
apr_pool_t *result_pool)
{
const char *digest = svn_sqlite__column_text(stmt, column, NULL);
if (digest == NULL)
*checksum = NULL;
else
SVN_ERR(svn_checksum_deserialize(checksum, digest,
result_pool, result_pool));
return SVN_NO_ERROR;
}
svn_boolean_t
svn_sqlite__column_is_null(svn_sqlite__stmt_t *stmt, int column)
{
return sqlite3_column_type(stmt->s3stmt, column) == SQLITE_NULL;
}
int
svn_sqlite__column_bytes(svn_sqlite__stmt_t *stmt, int column)
{
return sqlite3_column_bytes(stmt->s3stmt, column);
}
svn_error_t *
svn_sqlite__finalize(svn_sqlite__stmt_t *stmt)
{
SQLITE_ERR(sqlite3_finalize(stmt->s3stmt), stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__reset(svn_sqlite__stmt_t *stmt)
{
/* No need to reset again after a first attempt */
stmt->needs_reset = FALSE;
/* Clear bindings first, as there are no documented reasons
why this would ever fail, but keeping variable bindings
when reset is not what we expect. */
SQLITE_ERR(sqlite3_clear_bindings(stmt->s3stmt), stmt->db);
/* Reset last, as this *will* fail if the statement failed since
the last time it was reset, while reporting just the same failure.
(In this case the statement is also properly reset).
See the sqlite3_reset() documentation for more details. */
SQLITE_ERR(sqlite3_reset(stmt->s3stmt), stmt->db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__read_schema_version(int *version,
svn_sqlite__db_t *db,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
SVN_ERR(prepare_statement(&stmt, db, "PRAGMA user_version;", scratch_pool));
SVN_ERR(svn_sqlite__step_row(stmt));
*version = svn_sqlite__column_int(stmt, 0);
return svn_error_trace(svn_sqlite__finalize(stmt));
}
static volatile svn_atomic_t sqlite_init_state = 0;
/* If possible, verify that SQLite was compiled in a thread-safe
manner. */
/* Don't call this function directly! Use svn_atomic__init_once(). */
static svn_error_t *
init_sqlite(void *baton, apr_pool_t *pool)
{
if (sqlite3_libversion_number() < SVN_SQLITE_MIN_VERSION_NUMBER)
{
return svn_error_createf(
SVN_ERR_SQLITE_ERROR, NULL,
_("SQLite compiled for %s, but running with %s"),
SVN_SQLITE_MIN_VERSION, sqlite3_libversion());
}
#if APR_HAS_THREADS
/* SQLite 3.5 allows verification of its thread-safety at runtime.
Older versions are simply expected to have been configured with
--enable-threadsafe, which compiles with -DSQLITE_THREADSAFE=1
(or -DTHREADSAFE, for older versions). */
if (! sqlite3_threadsafe())
return svn_error_create(SVN_ERR_SQLITE_ERROR, NULL,
_("SQLite is required to be compiled and run in "
"thread-safe mode"));
/* If SQLite has been already initialized, sqlite3_config() returns
SQLITE_MISUSE. */
{
int err = sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
if (err != SQLITE_OK && err != SQLITE_MISUSE)
return svn_error_createf(SQLITE_ERROR_CODE(err), NULL,
_("Could not configure SQLite [S%d]"), err);
}
SQLITE_ERR_MSG(sqlite3_initialize(), _("Could not initialize SQLite"));
#endif /* APR_HAS_THRADS */
return SVN_NO_ERROR;
}
static svn_error_t *
internal_open(svn_sqlite__db_t *db, const char *path, svn_sqlite__mode_t mode,
apr_int32_t timeout, apr_pool_t *scratch_pool)
{
{
int flags;
if (mode == svn_sqlite__mode_readonly)
flags = SQLITE_OPEN_READONLY;
else if (mode == svn_sqlite__mode_readwrite)
flags = SQLITE_OPEN_READWRITE;
else if (mode == svn_sqlite__mode_rwcreate)
flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
else
SVN_ERR_MALFUNCTION();
/* Turn off SQLite's mutexes. All svn objects are single-threaded,
so we can already guarantee that our use of the SQLite handle
will be serialized properly.
Note: in 3.6.x, we've already config'd SQLite into MULTITHREAD mode,
so this is probably redundant, but if we are running in a process where
somebody initialized SQLite before us it is needed anyway. */
flags |= SQLITE_OPEN_NOMUTEX;
#if !defined(WIN32) && !defined(SVN_SQLITE_INLINE)
if (mode == svn_sqlite__mode_rwcreate)
{
svn_node_kind_t kind;
/* Create the file before SQLite to avoid any permissions
problems with an SQLite build that uses the default
SQLITE_DEFAULT_FILE_PERMISSIONS of 644 modified by umask.
We simply want umask permissions. */
SVN_ERR(svn_io_check_path(path, &kind, scratch_pool));
if (kind == svn_node_none)
{
/* Another thread may have created the file, that's OK. */
svn_error_t *err = svn_io_file_create_empty(path, scratch_pool);
if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
return svn_error_trace(err);
svn_error_clear(err);
}
}
#endif
/* Open the database. Note that a handle is returned, even when an error
occurs (except for out-of-memory); thus, we can safely use it to
extract an error message and construct an svn_error_t. SQLite always
requires sqlite3_close() after sqlite3_open_v2() while Subversion
typically does not require close() after an open() that returns an
error. So we must ensure we close the handle if this function, or
the caller svn_sqlite__open, returns an error to the application. */
{
const char *vFs = NULL;
#if defined(WIN32) && SQLITE_VERSION_AT_LEAST(3, 8, 1)
if (strlen(path) > 248)
{
WCHAR *win_path;
vFs = "win32-longpath"; /* Enable long paths in sqlite */
/* Long paths must be absolute */
if (!svn_dirent_is_absolute(path))
SVN_ERR(svn_dirent_get_absolute(&path, path, scratch_pool));
/* Convert the path to a properly canonicalized \\?\C:\long\path */
SVN_ERR(svn_io__utf8_to_unicode_longpath(&win_path, path,
scratch_pool));
/* And convert it back to UTF-8 because there is no
sqlite3_open16_v2() yet */
SVN_ERR(svn_utf__win32_utf16_to_utf8(&path, win_path, NULL,
scratch_pool));
}
#endif
/* ### SQLITE_CANTOPEN */
SQLITE_ERR_CLOSE(sqlite3_open_v2(path, &db->db3, flags, vFs),
db, scratch_pool);
}
}
if (timeout <= 0)
timeout = BUSY_TIMEOUT;
/* Retry until timeout when database is busy. */
SQLITE_ERR_CLOSE(sqlite3_busy_timeout(db->db3, timeout),
db, scratch_pool);
return SVN_NO_ERROR;
}
/* APR cleanup function used to close the database when its pool is destroyed.
DATA should be the svn_sqlite__db_t handle for the database. */
static apr_status_t
close_apr(void *data)
{
svn_sqlite__db_t *db = data;
svn_error_t *err = SVN_NO_ERROR;
apr_status_t result;
int i;
/* Check to see if we've already closed this database. */
if (db->db3 == NULL)
return APR_SUCCESS;
/* Finalize any prepared statements. */
if (db->prepared_stmts)
{
for (i = 0; i < db->nbr_statements + STMT_INTERNAL_LAST; i++)
{
if (db->prepared_stmts[i])
{
if (i < db->nbr_statements
&& db->prepared_stmts[i]->needs_reset)
{
#ifdef SVN_DEBUG
const char *stmt_text = db->statement_strings[i];
SVN_UNUSED(stmt_text);
SVN_ERR_MALFUNCTION_NO_RETURN();
#else
err = svn_error_compose_create(err,
svn_sqlite__reset(db->prepared_stmts[i]));
#endif
}
err = svn_error_compose_create(
svn_sqlite__finalize(db->prepared_stmts[i]), err);
}
}
}
result = sqlite3_close(db->db3);
/* If there's a pre-existing error, return it. */
if (err)
{
result = err->apr_err;
svn_error_clear(err);
return result;
}
if (result != SQLITE_OK)
return SQLITE_ERROR_CODE(result); /* ### lossy */
db->db3 = NULL;
return APR_SUCCESS;
}
#ifdef SVN_UNICODE_NORMALIZATION_FIXES
/* Unicode normalizing collation for WC paths */
static int
collate_ucs_nfd(void *baton,
int len1, const void *key1,
int len2, const void *key2)
{
svn_sqlite__db_t *db = baton;
int result;
if (svn_utf__normcmp(key1, len1, key2, len2,
&db->sqlext_buf1, &db->sqlext_buf2, &result))
{
/* There is really nothing we can do here if an error occurs
during Unicode normalizetion, and attempting to recover could
result in the wc.db index being corrupted. Presumably this
can only happen if the index already contains invalid UTF-8
strings, which should never happen in any case ... */
SVN_ERR_MALFUNCTION_NO_RETURN();
}
return result;
}
static void
glob_like_ucs_nfd_common(sqlite3_context *context,
int argc, sqlite3_value **argv,
svn_boolean_t sql_like)
{
svn_sqlite__db_t *const db = sqlite3_user_data(context);
const char *const pattern = (void*)sqlite3_value_text(argv[0]);
const apr_size_t pattern_len = sqlite3_value_bytes(argv[0]);
const char *const string = (void*)sqlite3_value_text(argv[1]);
const apr_size_t string_len = sqlite3_value_bytes(argv[1]);
const char *escape = NULL;
apr_size_t escape_len = 0;
svn_boolean_t match;
svn_error_t *err;
if (pattern_len > SQLITE_MAX_LIKE_PATTERN_LENGTH)
{
sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
return;
}
if (argc == 3 && sql_like)
{
escape = (void*)sqlite3_value_text(argv[2]);
escape_len = sqlite3_value_bytes(argv[2]);
}
if (pattern && string)
{
err = svn_utf__glob(pattern, pattern_len, string, string_len,
escape, escape_len, sql_like,
&db->sqlext_buf1, &db->sqlext_buf2, &db->sqlext_buf3,
&match);
if (err)
{
const char *errmsg;
svn_membuf__ensure(&db->sqlext_buf1, 512);
errmsg = svn_err_best_message(err,
db->sqlext_buf1.data,
db->sqlext_buf1.size - 1);
svn_error_clear(err);
sqlite3_result_error(context, errmsg, -1);
return;
}
sqlite3_result_int(context, match);
}
}
/* Unicode normalizing implementation of GLOB */
static void
glob_ucs_nfd(sqlite3_context *context,
int argc, sqlite3_value **argv)
{
glob_like_ucs_nfd_common(context, argc, argv, FALSE);
}
/* Unicode normalizing implementation of LIKE */
static void
like_ucs_nfd(sqlite3_context *context,
int argc, sqlite3_value **argv)
{
glob_like_ucs_nfd_common(context, argc, argv, TRUE);
}
#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
svn_error_t *
svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
svn_sqlite__mode_t mode, const char * const statements[],
int unused1, const char * const *unused2,
apr_int32_t timeout,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
SVN_ERR(svn_atomic__init_once(&sqlite_init_state,
init_sqlite, NULL, scratch_pool));
*db = apr_pcalloc(result_pool, sizeof(**db));
SVN_ERR(internal_open(*db, path, mode, timeout, scratch_pool));
#if SQLITE_VERSION_NUMBER >= 3008000 && SQLITE_VERSION_NUMBER < 3009000
/* disable SQLITE_ENABLE_STAT3/4 from 3.8.1 - 3.8.3 (but not 3.8.3.1+)
* to prevent using it when it's buggy.
* See: https://www.sqlite.org/src/info/4c86b126f2 */
if (sqlite3_libversion_number() > 3008000 &&
sqlite3_libversion_number() < 3008004 &&
strcmp(sqlite3_sourceid(),"2014-02-11")<0)
{
sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, (*db)->db3, 0x800);
}
#endif
#ifdef SVN_UNICODE_NORMALIZATION_FIXES
/* Create extension buffers with space for 200 UCS-4 characters. */
svn_membuf__create(&(*db)->sqlext_buf1, 800, result_pool);
svn_membuf__create(&(*db)->sqlext_buf2, 800, result_pool);
svn_membuf__create(&(*db)->sqlext_buf3, 800, result_pool);
/* Register collation and LIKE and GLOB operator replacements. */
SQLITE_ERR_CLOSE(sqlite3_create_collation((*db)->db3,
"svn-ucs-nfd", SQLITE_UTF8,
*db, collate_ucs_nfd),
db, scratch_pool);
/* ### Is it really necessary to override these functions?
I would assume the default implementation to be collation agnostic?
And otherwise our implementation should be...
The default implementation is in some cases index backed, while our
implementation can't be. With an index based on the collation it could
be. */
SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "glob", 2,
SQLITE_UTF8 | SQLITE_DETERMINISTIC,
*db, glob_ucs_nfd, NULL, NULL),
db, scratch_pool);
SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "like", 2,
SQLITE_UTF8 | SQLITE_DETERMINISTIC,
*db, like_ucs_nfd, NULL, NULL),
db, scratch_pool);
SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "like", 3,
SQLITE_UTF8 | SQLITE_DETERMINISTIC,
*db, like_ucs_nfd, NULL, NULL),
db, scratch_pool);
#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
#ifdef SQLITE3_DEBUG
sqlite3_trace((*db)->db3, sqlite_tracer, (*db)->db3);
#endif
#ifdef SQLITE3_PROFILE
sqlite3_profile((*db)->db3, sqlite_profiler, (*db)->db3);
#endif
SVN_ERR_CLOSE(exec_sql(*db,
/* The default behavior of the LIKE operator is to ignore case
for ASCII characters. Hence, by default 'a' LIKE 'A' is true.
The case_sensitive_like pragma installs a new application-
defined LIKE function that is either case sensitive or
insensitive depending on the value of the case_sensitive_like
pragma. */
"PRAGMA case_sensitive_like=1;"
/* Disable synchronization to disable the explicit disk flushes
that make Sqlite up to 50 times slower; especially on small
transactions.
This removes some stability guarantees on specific hardware
and power failures, but still guarantees atomic commits on
application crashes. With our dependency on external data
like pristine files (Wc) and revision files (repository),
we can't keep up these additional guarantees anyway.
### Maybe switch to NORMAL(1) when we use larger transaction
scopes */
"PRAGMA synchronous=OFF;"
/* Enable recursive triggers so that a user trigger will fire
in the deletion phase of an INSERT OR REPLACE statement.
Requires SQLite >= 3.6.18 */
"PRAGMA recursive_triggers=ON;"
/* Enforce current Sqlite default behavior. Some distributions
might change the Sqlite defaults without realizing how this
affects application(read: Subversion) performance/behavior. */
"PRAGMA foreign_keys=OFF;" /* SQLITE_DEFAULT_FOREIGN_KEYS*/
"PRAGMA locking_mode = NORMAL;" /* SQLITE_DEFAULT_LOCKING_MODE */
/* Testing shows TRUNCATE is faster than DELETE on Windows. */
"PRAGMA journal_mode = TRUNCATE;"
),
*db);
#if defined(SVN_DEBUG)
/* When running in debug mode, enable the checking of foreign key
constraints. This has possible performance implications, so we don't
bother to do it for production...for now. */
SVN_ERR_CLOSE(exec_sql(*db, "PRAGMA foreign_keys=ON;"),
*db);
#endif
#ifdef SVN_SQLITE_REVERSE_UNORDERED_SELECTS
/* When enabled, this PRAGMA causes SELECT statements without an ORDER BY
clause to emit their results in the reverse order of what they normally
would. This can help detecting invalid assumptions about the result
order.*/
SVN_ERR_CLOSE(exec_sql(*db, "PRAGMA reverse_unordered_selects=ON;"),
*db);
#endif
/* Store temporary tables in RAM instead of in temporary files, but don't
fail on this if this option is disabled in the sqlite compilation by
setting SQLITE_TEMP_STORE to 0 (always to disk) */
svn_error_clear(exec_sql(*db, "PRAGMA temp_store = MEMORY;"));
/* Store the provided statements. */
if (statements)
{
(*db)->statement_strings = statements;
(*db)->nbr_statements = 0;
while (*statements != NULL)
{
statements++;
(*db)->nbr_statements++;
}
(*db)->prepared_stmts = apr_pcalloc(
result_pool,
((*db)->nbr_statements + STMT_INTERNAL_LAST)
* sizeof(svn_sqlite__stmt_t *));
}
else
{
(*db)->nbr_statements = 0;
(*db)->prepared_stmts = apr_pcalloc(result_pool,
(0 + STMT_INTERNAL_LAST)
* sizeof(svn_sqlite__stmt_t *));
}
(*db)->state_pool = result_pool;
apr_pool_cleanup_register(result_pool, *db, close_apr, apr_pool_cleanup_null);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__close(svn_sqlite__db_t *db)
{
apr_status_t result = apr_pool_cleanup_run(db->state_pool, db, close_apr);
if (result == APR_SUCCESS)
return SVN_NO_ERROR;
return svn_error_wrap_apr(result, NULL);
}
static svn_error_t *
reset_all_statements(svn_sqlite__db_t *db,
svn_error_t *error_to_wrap)
{
int i;
svn_error_t *err;
/* ### Should we reorder the errors in this specific case
### to avoid returning the normal error as top level error? */
err = svn_error_compose_create(error_to_wrap,
svn_error_create(SVN_ERR_SQLITE_RESETTING_FOR_ROLLBACK,
NULL, NULL));
for (i = 0; i < db->nbr_statements; i++)
if (db->prepared_stmts[i] && db->prepared_stmts[i]->needs_reset)
err = svn_error_compose_create(err,
svn_sqlite__reset(db->prepared_stmts[i]));
return err;
}
+static svn_error_t *
+rollback_transaction(svn_sqlite__db_t *db,
+ svn_error_t *error_to_wrap)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_error_t *err;
+
+ err = get_internal_statement(&stmt, db, STMT_INTERNAL_ROLLBACK_TRANSACTION);
+ if (!err)
+ {
+ err = svn_error_trace(svn_sqlite__step_done(stmt));
+
+ if (err && err->apr_err == SVN_ERR_SQLITE_BUSY)
+ {
+ /* ### Houston, we have a problem!
+
+ We are trying to rollback but we can't because some
+ statements are still busy. This leaves the database
+ unusable for future transactions as the current transaction
+ is still open.
+
+ As we are returning the actual error as the most relevant
+ error in the chain, our caller might assume that it can
+ retry/compensate on this error (e.g. SVN_WC_LOCKED), while
+ in fact the SQLite database is unusable until the statements
+ started within this transaction are reset and the transaction
+ aborted.
+
+ We try to compensate by resetting all prepared but unreset
+ statements; but we leave the busy error in the chain anyway to
+ help diagnosing the original error and help in finding where
+ a reset statement is missing. */
+ err = svn_error_trace(reset_all_statements(db, err));
+ err = svn_error_compose_create(
+ svn_error_trace(svn_sqlite__step_done(stmt)),
+ err);
+ }
+ }
+
+ if (err)
+ {
+ /* Rollback failed, use a specific error code. */
+ err = svn_error_create(SVN_SQLITE__ERR_ROLLBACK_FAILED, err,
+ _("SQLite transaction rollback failed"));
+ }
+
+ return svn_error_compose_create(error_to_wrap, err);
+}
+
svn_error_t *
svn_sqlite__begin_transaction(svn_sqlite__db_t *db)
{
svn_sqlite__stmt_t *stmt;
SVN_ERR(get_internal_statement(&stmt, db,
STMT_INTERNAL_BEGIN_TRANSACTION));
SVN_ERR(svn_sqlite__step_done(stmt));
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__begin_immediate_transaction(svn_sqlite__db_t *db)
{
svn_sqlite__stmt_t *stmt;
SVN_ERR(get_internal_statement(&stmt, db,
STMT_INTERNAL_BEGIN_IMMEDIATE_TRANSACTION));
SVN_ERR(svn_sqlite__step_done(stmt));
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__begin_savepoint(svn_sqlite__db_t *db)
{
svn_sqlite__stmt_t *stmt;
SVN_ERR(get_internal_statement(&stmt, db,
STMT_INTERNAL_SAVEPOINT_SVN));
SVN_ERR(svn_sqlite__step_done(stmt));
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__finish_transaction(svn_sqlite__db_t *db,
svn_error_t *err)
{
svn_sqlite__stmt_t *stmt;
/* Commit or rollback the sqlite transaction. */
if (err)
{
- svn_error_t *err2;
+ return svn_error_trace(rollback_transaction(db, err));
+ }
+ else
+ {
+ err = get_internal_statement(&stmt, db,
+ STMT_INTERNAL_COMMIT_TRANSACTION);
+ if (!err)
+ err = svn_error_trace(svn_sqlite__step_done(stmt));
- err2 = get_internal_statement(&stmt, db,
- STMT_INTERNAL_ROLLBACK_TRANSACTION);
- if (!err2)
- err2 = svn_sqlite__step_done(stmt);
+ /* Need to rollback if the commit fails as well, because otherwise the
+ db connection will be left in an unusable state.
- if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
- {
- /* ### Houston, we have a problem!
+ One important case to keep in mind is trying to COMMIT with concurrent
+ readers. In case the commit fails, because someone else is holding a
+ shared lock, sqlite keeps the transaction, and *also* keeps the file
+ locks on the database. While the first part only prevents from using
+ this connection, the second part prevents everyone else from accessing
+ the database while the connection is open.
- We are trying to rollback but we can't because some
- statements are still busy. This leaves the database
- unusable for future transactions as the current transaction
- is still open.
+ See https://www.sqlite.org/lang_transaction.html
- As we are returning the actual error as the most relevant
- error in the chain, our caller might assume that it can
- retry/compensate on this error (e.g. SVN_WC_LOCKED), while
- in fact the SQLite database is unusable until the statements
- started within this transaction are reset and the transaction
- aborted.
-
- We try to compensate by resetting all prepared but unreset
- statements; but we leave the busy error in the chain anyway to
- help diagnosing the original error and help in finding where
- a reset statement is missing. */
-
- err2 = reset_all_statements(db, err2);
- err2 = svn_error_compose_create(
- svn_sqlite__step_done(stmt),
- err2);
- }
-
- return svn_error_compose_create(err,
- err2);
+ COMMIT might also result in an SQLITE_BUSY return code if an another
+ thread or process has a shared lock on the database that prevented
+ the database from being updated. When COMMIT fails in this way, the
+ transaction remains active and the COMMIT can be retried later after
+ the reader has had a chance to clear. */
+ if (err)
+ return svn_error_trace(rollback_transaction(db, err));
}
- SVN_ERR(get_internal_statement(&stmt, db, STMT_INTERNAL_COMMIT_TRANSACTION));
- return svn_error_trace(svn_sqlite__step_done(stmt));
+ return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__finish_savepoint(svn_sqlite__db_t *db,
svn_error_t *err)
{
svn_sqlite__stmt_t *stmt;
if (err)
{
svn_error_t *err2;
err2 = get_internal_statement(&stmt, db,
STMT_INTERNAL_ROLLBACK_TO_SAVEPOINT_SVN);
if (!err2)
- err2 = svn_sqlite__step_done(stmt);
-
- if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
{
- /* Ok, we have a major problem. Some statement is still open, which
- makes it impossible to release this savepoint.
+ err2 = svn_error_trace(svn_sqlite__step_done(stmt));
- ### See huge comment in svn_sqlite__finish_transaction for
- further details */
+ if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
+ {
+ /* Ok, we have a major problem. Some statement is still open,
+ which makes it impossible to release this savepoint.
- err2 = reset_all_statements(db, err2);
- err2 = svn_error_compose_create(svn_sqlite__step_done(stmt), err2);
+ ### See huge comment in svn_sqlite__finish_transaction for
+ further details */
+
+ err2 = svn_error_trace(reset_all_statements(db, err2));
+ err2 = svn_error_compose_create(
+ svn_error_trace(svn_sqlite__step_done(stmt)),
+ err2);
+ }
}
err = svn_error_compose_create(err, err2);
err2 = get_internal_statement(&stmt, db,
STMT_INTERNAL_RELEASE_SAVEPOINT_SVN);
if (!err2)
- err2 = svn_sqlite__step_done(stmt);
+ err2 = svn_error_trace(svn_sqlite__step_done(stmt));
- return svn_error_trace(svn_error_compose_create(err, err2));
+ return svn_error_compose_create(err, err2);
}
SVN_ERR(get_internal_statement(&stmt, db,
STMT_INTERNAL_RELEASE_SAVEPOINT_SVN));
return svn_error_trace(svn_sqlite__step_done(stmt));
}
svn_error_t *
svn_sqlite__with_transaction(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool /* NULL allowed */)
{
SVN_SQLITE__WITH_TXN(cb_func(cb_baton, db, scratch_pool), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__with_immediate_transaction(
svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool /* NULL allowed */)
{
SVN_SQLITE__WITH_IMMEDIATE_TXN(cb_func(cb_baton, db, scratch_pool), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__with_lock(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool /* NULL allowed */)
{
SVN_SQLITE__WITH_LOCK(cb_func(cb_baton, db, scratch_pool), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__hotcopy(const char *src_path,
const char *dst_path,
apr_pool_t *scratch_pool)
{
svn_sqlite__db_t *src_db;
SVN_ERR(svn_sqlite__open(&src_db, src_path, svn_sqlite__mode_readonly,
NULL, 0, NULL, 0,
scratch_pool, scratch_pool));
{
svn_sqlite__db_t *dst_db;
sqlite3_backup *backup;
int rc1, rc2;
SVN_ERR(svn_sqlite__open(&dst_db, dst_path, svn_sqlite__mode_rwcreate,
NULL, 0, NULL, 0, scratch_pool, scratch_pool));
backup = sqlite3_backup_init(dst_db->db3, "main", src_db->db3, "main");
if (!backup)
return svn_error_createf(SVN_ERR_SQLITE_ERROR, NULL,
_("SQLite hotcopy failed for %s"), src_path);
do
{
/* Pages are usually 1024 byte (SQLite docs). On my laptop
copying gets faster as the number of pages is increased up
to about 64, beyond that speed levels off. Lets put the
number of pages an order of magnitude higher, this is still
likely to be a fraction of large databases. */
rc1 = sqlite3_backup_step(backup, 1024);
/* Should we sleep on SQLITE_OK? That would make copying a
large database take much longer. When we do sleep how,
long should we sleep? Should the sleep get longer if we
keep getting BUSY/LOCKED? I have no real reason for
choosing 25. */
if (rc1 == SQLITE_BUSY || rc1 == SQLITE_LOCKED)
sqlite3_sleep(25);
}
while (rc1 == SQLITE_OK || rc1 == SQLITE_BUSY || rc1 == SQLITE_LOCKED);
rc2 = sqlite3_backup_finish(backup);
if (rc1 != SQLITE_DONE)
SQLITE_ERR(rc1, dst_db);
SQLITE_ERR(rc2, dst_db);
SVN_ERR(svn_sqlite__close(dst_db));
}
SVN_ERR(svn_sqlite__close(src_db));
SVN_ERR(svn_io_copy_perms(src_path, dst_path, scratch_pool));
return SVN_NO_ERROR;
}
struct function_wrapper_baton_t
{
svn_sqlite__func_t func;
void *baton;
};
static void
wrapped_func(sqlite3_context *context,
int argc,
sqlite3_value *values[])
{
struct function_wrapper_baton_t *fwb = sqlite3_user_data(context);
svn_sqlite__context_t sctx;
svn_error_t *err;
void *void_values = values;
sctx.context = context;
err = fwb->func(&sctx, argc, void_values, fwb->baton);
if (err)
{
char buf[256];
sqlite3_result_error(context,
svn_err_best_message(err, buf, sizeof(buf)),
-1);
svn_error_clear(err);
}
}
svn_error_t *
svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
const char *func_name,
int argc,
svn_boolean_t deterministic,
svn_sqlite__func_t func,
void *baton)
{
int eTextRep;
struct function_wrapper_baton_t *fwb = apr_pcalloc(db->state_pool,
sizeof(*fwb));
fwb->func = func;
fwb->baton = baton;
eTextRep = SQLITE_ANY;
if (deterministic)
eTextRep |= SQLITE_DETERMINISTIC;
SQLITE_ERR(sqlite3_create_function(db->db3, func_name, argc, eTextRep,
fwb, wrapped_func, NULL, NULL),
db);
return SVN_NO_ERROR;
}
int
svn_sqlite__value_type(svn_sqlite__value_t *val)
{
void *v = val;
return sqlite3_value_type(v);
}
const char *
svn_sqlite__value_text(svn_sqlite__value_t *val)
{
void *v = val;
return (const char *) sqlite3_value_text(v);
}
void
svn_sqlite__result_null(svn_sqlite__context_t *sctx)
{
sqlite3_result_null(sctx->context);
}
void
svn_sqlite__result_int64(svn_sqlite__context_t *sctx, apr_int64_t val)
{
sqlite3_result_int64(sctx->context, val);
}
void
svn_sqlite__result_error(svn_sqlite__context_t *sctx, const char *msg, int num)
{
sqlite3_result_error(sctx->context, msg, num);
}
Index: stable/11/contrib/subversion/subversion/libsvn_subr/sysinfo.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/sysinfo.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/sysinfo.c (revision 309511)
@@ -1,1283 +1,1285 @@
/*
* sysinfo.c : information about the running system
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#define APR_WANT_STRFUNC
#include <apr_want.h>
#include <apr_lib.h>
#include <apr_pools.h>
#include <apr_file_info.h>
#include <apr_signal.h>
#include <apr_strings.h>
#include <apr_thread_proc.h>
#include <apr_version.h>
#include <apu_version.h>
#include "svn_pools.h"
#include "svn_ctype.h"
#include "svn_dirent_uri.h"
#include "svn_error.h"
#include "svn_io.h"
#include "svn_string.h"
#include "svn_utf.h"
#include "svn_version.h"
#include "private/svn_sqlite.h"
#include "private/svn_subr_private.h"
#include "private/svn_utf_private.h"
#include "sysinfo.h"
#include "svn_private_config.h"
#if HAVE_SYS_UTSNAME_H
#include <sys/utsname.h>
#endif
#ifdef SVN_HAVE_MACOS_PLIST
#include <CoreFoundation/CoreFoundation.h>
#include <AvailabilityMacros.h>
# ifndef MAC_OS_X_VERSION_10_6
# define MAC_OS_X_VERSION_10_6 1060
# endif
#endif
#ifdef SVN_HAVE_MACHO_ITERATE
#include <mach-o/dyld.h>
#include <mach-o/loader.h>
#endif
#if HAVE_UNAME
static const char *canonical_host_from_uname(apr_pool_t *pool);
# ifndef SVN_HAVE_MACOS_PLIST
static const char *release_name_from_uname(apr_pool_t *pool);
# endif
#endif
#ifdef WIN32
static const char *win32_canonical_host(apr_pool_t *pool);
static const char *win32_release_name(apr_pool_t *pool);
static const apr_array_header_t *win32_shared_libs(apr_pool_t *pool);
#endif /* WIN32 */
#ifdef SVN_HAVE_MACOS_PLIST
static const char *macos_release_name(apr_pool_t *pool);
#endif
#ifdef SVN_HAVE_MACHO_ITERATE
static const apr_array_header_t *macos_shared_libs(apr_pool_t *pool);
#endif
#if __linux__
static const char *linux_release_name(apr_pool_t *pool);
#endif
const char *
svn_sysinfo__canonical_host(apr_pool_t *pool)
{
#ifdef WIN32
return win32_canonical_host(pool);
#elif HAVE_UNAME
return canonical_host_from_uname(pool);
#else
return "unknown-unknown-unknown";
#endif
}
const char *
svn_sysinfo__release_name(apr_pool_t *pool)
{
#ifdef WIN32
return win32_release_name(pool);
#elif defined(SVN_HAVE_MACOS_PLIST)
return macos_release_name(pool);
#elif __linux__
return linux_release_name(pool);
#elif HAVE_UNAME
return release_name_from_uname(pool);
#else
return NULL;
#endif
}
const apr_array_header_t *
svn_sysinfo__linked_libs(apr_pool_t *pool)
{
svn_version_ext_linked_lib_t *lib;
apr_array_header_t *array = apr_array_make(pool, 6, sizeof(*lib));
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "APR";
lib->compiled_version = APR_VERSION_STRING;
lib->runtime_version = apr_pstrdup(pool, apr_version_string());
/* Don't list APR-Util if it isn't linked in, which it may not be if
* we're using APR 2.x+ which combined APR-Util into APR. */
#ifdef APU_VERSION_STRING
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "APR-Util";
lib->compiled_version = APU_VERSION_STRING;
lib->runtime_version = apr_pstrdup(pool, apu_version_string());
#endif
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "Expat";
lib->compiled_version = apr_pstrdup(pool, svn_xml__compiled_version());
lib->runtime_version = apr_pstrdup(pool, svn_xml__runtime_version());
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "SQLite";
lib->compiled_version = apr_pstrdup(pool, svn_sqlite__compiled_version());
#ifdef SVN_SQLITE_INLINE
lib->runtime_version = NULL;
#else
lib->runtime_version = apr_pstrdup(pool, svn_sqlite__runtime_version());
#endif
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "Utf8proc";
lib->compiled_version = apr_pstrdup(pool, svn_utf__utf8proc_compiled_version());
lib->runtime_version = apr_pstrdup(pool, svn_utf__utf8proc_runtime_version());
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "ZLib";
lib->compiled_version = apr_pstrdup(pool, svn_zlib__compiled_version());
lib->runtime_version = apr_pstrdup(pool, svn_zlib__runtime_version());
return array;
}
const apr_array_header_t *
svn_sysinfo__loaded_libs(apr_pool_t *pool)
{
#ifdef WIN32
return win32_shared_libs(pool);
#elif defined(SVN_HAVE_MACHO_ITERATE)
return macos_shared_libs(pool);
#else
return NULL;
#endif
}
#if HAVE_UNAME
static const char*
canonical_host_from_uname(apr_pool_t *pool)
{
const char *machine = "unknown";
const char *vendor = "unknown";
const char *sysname = "unknown";
const char *sysver = "";
struct utsname info;
if (0 <= uname(&info))
{
svn_error_t *err;
const char *tmp;
err = svn_utf_cstring_to_utf8(&tmp, info.machine, pool);
if (err)
svn_error_clear(err);
else
machine = tmp;
err = svn_utf_cstring_to_utf8(&tmp, info.sysname, pool);
if (err)
svn_error_clear(err);
else
{
char *lwr = apr_pstrdup(pool, tmp);
char *it = lwr;
while (*it)
{
if (svn_ctype_isupper(*it))
*it = apr_tolower(*it);
++it;
}
sysname = lwr;
}
if (0 == strcmp(sysname, "darwin"))
vendor = "apple";
if (0 == strcmp(sysname, "linux"))
sysver = "-gnu";
else
{
err = svn_utf_cstring_to_utf8(&tmp, info.release, pool);
if (err)
svn_error_clear(err);
else
{
apr_size_t n = strspn(tmp, ".0123456789");
if (n > 0)
{
char *ver = apr_pstrdup(pool, tmp);
ver[n] = 0;
sysver = ver;
}
else
sysver = tmp;
}
}
}
return apr_psprintf(pool, "%s-%s-%s%s", machine, vendor, sysname, sysver);
}
# ifndef SVN_HAVE_MACOS_PLIST
/* Generate a release name from the uname(3) info, effectively
returning "`uname -s` `uname -r`". */
static const char *
release_name_from_uname(apr_pool_t *pool)
{
struct utsname info;
if (0 <= uname(&info))
{
svn_error_t *err;
const char *sysname;
const char *sysver;
err = svn_utf_cstring_to_utf8(&sysname, info.sysname, pool);
if (err)
{
sysname = NULL;
svn_error_clear(err);
}
err = svn_utf_cstring_to_utf8(&sysver, info.release, pool);
if (err)
{
sysver = NULL;
svn_error_clear(err);
}
if (sysname || sysver)
{
return apr_psprintf(pool, "%s%s%s",
(sysname ? sysname : ""),
(sysver ? (sysname ? " " : "") : ""),
(sysver ? sysver : ""));
}
}
return NULL;
}
# endif /* !SVN_HAVE_MACOS_PLIST */
#endif /* HAVE_UNAME */
#if __linux__
/* Split a stringbuf into a key/value pair.
Return the key, leaving the stripped value in the stringbuf. */
static const char *
stringbuf_split_key(svn_stringbuf_t *buffer, char delim)
{
char *key;
char *end;
end = strchr(buffer->data, delim);
if (!end)
return NULL;
svn_stringbuf_strip_whitespace(buffer);
/* Now we split the currently allocated buffer in two parts:
- a const char * HEAD
- the remaining stringbuf_t. */
/* Create HEAD as '\0' terminated const char * */
key = buffer->data;
end = strchr(key, delim);
*end = '\0';
/* And update the TAIL to be a smaller, but still valid stringbuf */
buffer->data = end + 1;
buffer->len -= 1 + end - key;
buffer->blocksize -= 1 + end - key;
svn_stringbuf_strip_whitespace(buffer);
return key;
}
/* Parse `/usr/bin/lsb_rlease --all` */
static const char *
lsb_release(apr_pool_t *pool)
{
static const char *const args[3] =
{
"/usr/bin/lsb_release",
"--all",
NULL
};
const char *distributor = NULL;
const char *description = NULL;
const char *release = NULL;
const char *codename = NULL;
apr_proc_t lsbproc;
svn_stream_t *lsbinfo;
svn_error_t *err;
/* Run /usr/bin/lsb_release --all < /dev/null 2>/dev/null */
{
apr_file_t *stdin_handle;
apr_file_t *stdout_handle;
err = svn_io_file_open(&stdin_handle, SVN_NULL_DEVICE_NAME,
APR_READ, APR_OS_DEFAULT, pool);
if (!err)
err = svn_io_file_open(&stdout_handle, SVN_NULL_DEVICE_NAME,
APR_WRITE, APR_OS_DEFAULT, pool);
if (!err)
err = svn_io_start_cmd3(&lsbproc, NULL, args[0], args, NULL, FALSE,
FALSE, stdin_handle,
TRUE, NULL,
FALSE, stdout_handle,
pool);
if (err)
{
svn_error_clear(err);
return NULL;
}
}
/* Parse the output and try to populate the */
lsbinfo = svn_stream_from_aprfile2(lsbproc.out, TRUE, pool);
if (lsbinfo)
{
for (;;)
{
svn_boolean_t eof = FALSE;
svn_stringbuf_t *line;
const char *key;
err = svn_stream_readline(lsbinfo, &line, "\n", &eof, pool);
if (err || eof)
break;
key = stringbuf_split_key(line, ':');
if (!key)
continue;
if (0 == svn_cstring_casecmp(key, "Distributor ID"))
distributor = line->data;
else if (0 == svn_cstring_casecmp(key, "Description"))
description = line->data;
else if (0 == svn_cstring_casecmp(key, "Release"))
release = line->data;
else if (0 == svn_cstring_casecmp(key, "Codename"))
codename = line->data;
}
err = svn_error_compose_create(err,
svn_stream_close(lsbinfo));
if (err)
{
svn_error_clear(err);
apr_proc_kill(&lsbproc, SIGKILL);
return NULL;
}
}
/* Reap the child process */
err = svn_io_wait_for_cmd(&lsbproc, "", NULL, NULL, pool);
if (err)
{
svn_error_clear(err);
return NULL;
}
if (description)
return apr_psprintf(pool, "%s%s%s%s", description,
(codename ? " (" : ""),
(codename ? codename : ""),
(codename ? ")" : ""));
if (distributor)
return apr_psprintf(pool, "%s%s%s%s%s%s", distributor,
(release ? " " : ""),
(release ? release : ""),
(codename ? " (" : ""),
(codename ? codename : ""),
(codename ? ")" : ""));
return NULL;
}
/* Read /etc/os-release, as documented here:
* http://www.freedesktop.org/software/systemd/man/os-release.html
*/
static const char *
systemd_release(apr_pool_t *pool)
{
svn_error_t *err;
svn_stream_t *stream;
/* Open the file. */
err = svn_stream_open_readonly(&stream, "/etc/os-release", pool, pool);
if (err && APR_STATUS_IS_ENOENT(err->apr_err))
{
svn_error_clear(err);
err = svn_stream_open_readonly(&stream, "/usr/lib/os-release", pool,
pool);
}
if (err)
{
svn_error_clear(err);
return NULL;
}
/* Look for the PRETTY_NAME line. */
while (TRUE)
{
svn_stringbuf_t *line;
svn_boolean_t eof;
err = svn_stream_readline(stream, &line, "\n", &eof, pool);
if (err)
{
svn_error_clear(err);
return NULL;
}
if (!strncmp(line->data, "PRETTY_NAME=", 12))
{
svn_stringbuf_t *release_name;
/* The value may or may not be enclosed by double quotes. We don't
* attempt to strip them. */
release_name = svn_stringbuf_create(line->data + 12, pool);
svn_error_clear(svn_stream_close(stream));
svn_stringbuf_strip_whitespace(release_name);
return release_name->data;
}
if (eof)
break;
}
/* The file did not contain a PRETTY_NAME line. */
svn_error_clear(svn_stream_close(stream));
return NULL;
}
/* Read the whole contents of a file. */
static svn_stringbuf_t *
read_file_contents(const char *filename, apr_pool_t *pool)
{
svn_error_t *err;
svn_stringbuf_t *buffer;
err = svn_stringbuf_from_file2(&buffer, filename, pool);
if (err)
{
svn_error_clear(err);
return NULL;
}
return buffer;
}
/* Strip everything but the first line from a stringbuf. */
static void
stringbuf_first_line_only(svn_stringbuf_t *buffer)
{
char *eol = strchr(buffer->data, '\n');
if (eol)
{
*eol = '\0';
buffer->len = 1 + eol - buffer->data;
}
svn_stringbuf_strip_whitespace(buffer);
}
/* Look at /etc/redhat_release to detect RHEL/Fedora/CentOS. */
static const char *
redhat_release(apr_pool_t *pool)
{
svn_stringbuf_t *buffer = read_file_contents("/etc/redhat-release", pool);
if (buffer)
{
stringbuf_first_line_only(buffer);
return buffer->data;
}
return NULL;
}
/* Look at /etc/SuSE-release to detect non-LSB SuSE. */
static const char *
suse_release(apr_pool_t *pool)
{
const char *release = NULL;
const char *codename = NULL;
svn_stringbuf_t *buffer = read_file_contents("/etc/SuSE-release", pool);
svn_stringbuf_t *line;
svn_stream_t *stream;
svn_boolean_t eof;
svn_error_t *err;
if (!buffer)
return NULL;
stream = svn_stream_from_stringbuf(buffer, pool);
err = svn_stream_readline(stream, &line, "\n", &eof, pool);
if (err || eof)
{
svn_error_clear(err);
return NULL;
}
svn_stringbuf_strip_whitespace(line);
release = line->data;
for (;;)
{
const char *key;
err = svn_stream_readline(stream, &line, "\n", &eof, pool);
if (err || eof)
{
svn_error_clear(err);
break;
}
key = stringbuf_split_key(line, '=');
if (!key)
continue;
if (0 == strncmp(key, "CODENAME", 8))
codename = line->data;
}
return apr_psprintf(pool, "%s%s%s%s",
release,
(codename ? " (" : ""),
(codename ? codename : ""),
(codename ? ")" : ""));
}
/* Look at /etc/debian_version to detect non-LSB Debian. */
static const char *
debian_release(apr_pool_t *pool)
{
svn_stringbuf_t *buffer = read_file_contents("/etc/debian_version", pool);
if (!buffer)
return NULL;
stringbuf_first_line_only(buffer);
return apr_pstrcat(pool, "Debian ", buffer->data, SVN_VA_NULL);
}
/* Try to find the Linux distribution name, or return info from uname. */
static const char *
linux_release_name(apr_pool_t *pool)
{
const char *uname_release = release_name_from_uname(pool);
/* Try anything that has /usr/bin/lsb_release.
Covers, for example, Debian, Ubuntu and SuSE. */
const char *release_name = lsb_release(pool);
/* Try the systemd way (covers Arch). */
if (!release_name)
release_name = systemd_release(pool);
/* Try RHEL/Fedora/CentOS */
if (!release_name)
release_name = redhat_release(pool);
/* Try Non-LSB SuSE */
if (!release_name)
release_name = suse_release(pool);
/* Try non-LSB Debian */
if (!release_name)
release_name = debian_release(pool);
if (!release_name)
return uname_release;
if (!uname_release)
return release_name;
return apr_psprintf(pool, "%s [%s]", release_name, uname_release);
}
#endif /* __linux__ */
#ifdef WIN32
typedef DWORD (WINAPI *FNGETNATIVESYSTEMINFO)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *FNENUMPROCESSMODULES) (HANDLE, HMODULE*, DWORD, LPDWORD);
svn_boolean_t
svn_sysinfo___fill_windows_version(OSVERSIONINFOEXW *version_info)
{
memset(version_info, 0, sizeof(*version_info));
version_info->dwOSVersionInfoSize = sizeof(*version_info);
/* Kill warnings with the Windows 8 and later platform SDK */
#if _MSC_VER > 1600 && NTDDI_VERSION >= _0x06020000
/* Windows 8 deprecated the API to retrieve the Windows version to avoid
backwards compatibility problems... It might return a constant version
in future Windows versions... But let's kill the warning.
We can implementation this using a different function later. */
#pragma warning(push)
#pragma warning(disable: 4996)
#endif
/* Prototype supports OSVERSIONINFO */
return GetVersionExW((LPVOID)version_info);
#if _MSC_VER > 1600 && NTDDI_VERSION >= _0x06020000
#pragma warning(pop)
#pragma warning(disable: 4996)
#endif
}
/* Get system info, and try to tell the difference between the native
system type and the runtime environment of the current process.
Populate results in SYSINFO and LOCAL_SYSINFO (optional). */
static BOOL
system_info(SYSTEM_INFO *sysinfo,
SYSTEM_INFO *local_sysinfo)
{
FNGETNATIVESYSTEMINFO GetNativeSystemInfo_ = (FNGETNATIVESYSTEMINFO)
GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetNativeSystemInfo");
memset(sysinfo, 0, sizeof *sysinfo);
if (local_sysinfo)
{
memset(local_sysinfo, 0, sizeof *local_sysinfo);
GetSystemInfo(local_sysinfo);
if (GetNativeSystemInfo_)
GetNativeSystemInfo_(sysinfo);
else
memcpy(sysinfo, local_sysinfo, sizeof *sysinfo);
}
else
GetSystemInfo(sysinfo);
return TRUE;
}
/* Map the proccessor type from SYSINFO to a string. */
static const char *
processor_name(SYSTEM_INFO *sysinfo)
{
switch (sysinfo->wProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_AMD64: return "x86_64";
case PROCESSOR_ARCHITECTURE_IA64: return "ia64";
case PROCESSOR_ARCHITECTURE_INTEL: return "x86";
case PROCESSOR_ARCHITECTURE_MIPS: return "mips";
case PROCESSOR_ARCHITECTURE_ALPHA: return "alpha32";
case PROCESSOR_ARCHITECTURE_PPC: return "powerpc";
case PROCESSOR_ARCHITECTURE_SHX: return "shx";
case PROCESSOR_ARCHITECTURE_ARM: return "arm";
case PROCESSOR_ARCHITECTURE_ALPHA64: return "alpha";
case PROCESSOR_ARCHITECTURE_MSIL: return "msil";
case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: return "x86_wow64";
default: return "unknown";
}
}
/* Return the Windows-specific canonical host name. */
static const char *
win32_canonical_host(apr_pool_t *pool)
{
SYSTEM_INFO sysinfo;
SYSTEM_INFO local_sysinfo;
OSVERSIONINFOEXW osinfo;
if (system_info(&sysinfo, &local_sysinfo)
&& svn_sysinfo___fill_windows_version(&osinfo))
{
const char *arch = processor_name(&local_sysinfo);
const char *machine = processor_name(&sysinfo);
const char *vendor = "microsoft";
const char *sysname = "windows";
const char *sysver = apr_psprintf(pool, "%u.%u.%u",
(unsigned int)osinfo.dwMajorVersion,
(unsigned int)osinfo.dwMinorVersion,
(unsigned int)osinfo.dwBuildNumber);
if (sysinfo.wProcessorArchitecture
== local_sysinfo.wProcessorArchitecture)
return apr_psprintf(pool, "%s-%s-%s%s",
machine, vendor, sysname, sysver);
return apr_psprintf(pool, "%s/%s-%s-%s%s",
arch, machine, vendor, sysname, sysver);
}
return "unknown-microsoft-windows";
}
/* Convert a Unicode string to UTF-8. */
static char *
wcs_to_utf8(const wchar_t *wcs, apr_pool_t *pool)
{
const int bufsize = WideCharToMultiByte(CP_UTF8, 0, wcs, -1,
NULL, 0, NULL, NULL);
if (bufsize > 0)
{
char *const utf8 = apr_palloc(pool, bufsize + 1);
WideCharToMultiByte(CP_UTF8, 0, wcs, -1, utf8, bufsize, NULL, NULL);
return utf8;
}
return NULL;
}
/* Query the value called NAME of the registry key HKEY. */
static char *
registry_value(HKEY hkey, wchar_t *name, apr_pool_t *pool)
{
DWORD size;
wchar_t *value;
if (RegQueryValueExW(hkey, name, NULL, NULL, NULL, &size))
return NULL;
value = apr_palloc(pool, size + sizeof *value);
if (RegQueryValueExW(hkey, name, NULL, NULL, (void*)value, &size))
return NULL;
value[size / sizeof *value] = 0;
return wcs_to_utf8(value, pool);
}
/* Try to glean the Windows release name and associated info from the
registry. Failing that, construct a release name from the version
info. */
static const char *
win32_release_name(apr_pool_t *pool)
{
SYSTEM_INFO sysinfo;
OSVERSIONINFOEXW osinfo;
HKEY hkcv;
if (!system_info(&sysinfo, NULL)
|| !svn_sysinfo___fill_windows_version(&osinfo))
return NULL;
if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
0, KEY_QUERY_VALUE, &hkcv))
{
const char *release = registry_value(hkcv, L"ProductName", pool);
const char *spack = registry_value(hkcv, L"CSDVersion", pool);
const char *curver = registry_value(hkcv, L"CurrentVersion", pool);
const char *curtype = registry_value(hkcv, L"CurrentType", pool);
const char *install = registry_value(hkcv, L"InstallationType", pool);
const char *curbuild = registry_value(hkcv, L"CurrentBuildNumber", pool);
if (!spack && *osinfo.szCSDVersion)
spack = wcs_to_utf8(osinfo.szCSDVersion, pool);
if (!curbuild)
curbuild = registry_value(hkcv, L"CurrentBuild", pool);
if (release || spack || curver || curtype || curbuild)
{
const char *bootinfo = "";
if (curver || install || curtype)
{
bootinfo = apr_psprintf(pool, "[%s%s%s%s%s]",
(curver ? curver : ""),
(install ? (curver ? " " : "") : ""),
(install ? install : ""),
(curtype
? (curver||install ? " " : "")
: ""),
(curtype ? curtype : ""));
}
return apr_psprintf(pool, "%s%s%s%s%s%s%s",
(release ? release : ""),
(spack ? (release ? ", " : "") : ""),
(spack ? spack : ""),
(curbuild
? (release||spack ? ", build " : "build ")
: ""),
(curbuild ? curbuild : ""),
(bootinfo
? (release||spack||curbuild ? " " : "")
: ""),
(bootinfo ? bootinfo : ""));
}
}
if (*osinfo.szCSDVersion)
{
const char *servicepack = wcs_to_utf8(osinfo.szCSDVersion, pool);
if (servicepack)
return apr_psprintf(pool, "Windows NT %u.%u, %s, build %u",
(unsigned int)osinfo.dwMajorVersion,
(unsigned int)osinfo.dwMinorVersion,
servicepack,
(unsigned int)osinfo.dwBuildNumber);
/* Assume wServicePackMajor > 0 if szCSDVersion is not empty */
if (osinfo.wServicePackMinor)
return apr_psprintf(pool, "Windows NT %u.%u SP%u.%u, build %u",
(unsigned int)osinfo.dwMajorVersion,
(unsigned int)osinfo.dwMinorVersion,
(unsigned int)osinfo.wServicePackMajor,
(unsigned int)osinfo.wServicePackMinor,
(unsigned int)osinfo.dwBuildNumber);
return apr_psprintf(pool, "Windows NT %u.%u SP%u, build %u",
(unsigned int)osinfo.dwMajorVersion,
(unsigned int)osinfo.dwMinorVersion,
(unsigned int)osinfo.wServicePackMajor,
(unsigned int)osinfo.dwBuildNumber);
}
return apr_psprintf(pool, "Windows NT %u.%u, build %u",
(unsigned int)osinfo.dwMajorVersion,
(unsigned int)osinfo.dwMinorVersion,
(unsigned int)osinfo.dwBuildNumber);
}
/* Get a list of handles of shared libs loaded by the current
process. Returns a NULL-terminated array alocated from POOL. */
static HMODULE *
enum_loaded_modules(apr_pool_t *pool)
{
HMODULE psapi_dll = 0;
HANDLE current = GetCurrentProcess();
HMODULE dummy[1];
HMODULE *handles;
DWORD size;
FNENUMPROCESSMODULES EnumProcessModules_;
psapi_dll = GetModuleHandleA("psapi.dll");
if (!psapi_dll)
{
/* Load and never unload, just like static linking */
psapi_dll = LoadLibraryA("psapi.dll");
}
if (!psapi_dll)
return NULL;
EnumProcessModules_ = (FNENUMPROCESSMODULES)
GetProcAddress(psapi_dll, "EnumProcessModules");
/* Before Windows XP psapi was an optional module */
if (! EnumProcessModules_)
return NULL;
if (!EnumProcessModules_(current, dummy, sizeof(dummy), &size))
return NULL;
handles = apr_palloc(pool, size + sizeof *handles);
if (! EnumProcessModules_(current, handles, size, &size))
return NULL;
handles[size / sizeof *handles] = NULL;
return handles;
}
/* Find the version number, if any, embedded in FILENAME. */
static const char *
file_version_number(const wchar_t *filename, apr_pool_t *pool)
{
VS_FIXEDFILEINFO info;
unsigned int major, minor, micro, nano;
void *data;
DWORD data_size = GetFileVersionInfoSizeW(filename, NULL);
void *vinfo;
UINT vinfo_size;
if (!data_size)
return NULL;
data = apr_palloc(pool, data_size);
if (!GetFileVersionInfoW(filename, 0, data_size, data))
return NULL;
if (!VerQueryValueW(data, L"\\", &vinfo, &vinfo_size))
return NULL;
if (vinfo_size != sizeof info)
return NULL;
memcpy(&info, vinfo, sizeof info);
major = (info.dwFileVersionMS >> 16) & 0xFFFF;
minor = info.dwFileVersionMS & 0xFFFF;
micro = (info.dwFileVersionLS >> 16) & 0xFFFF;
nano = info.dwFileVersionLS & 0xFFFF;
if (!nano)
{
if (!micro)
return apr_psprintf(pool, "%u.%u", major, minor);
else
return apr_psprintf(pool, "%u.%u.%u", major, minor, micro);
}
return apr_psprintf(pool, "%u.%u.%u.%u", major, minor, micro, nano);
}
/* List the shared libraries loaded by the current process. */
static const apr_array_header_t *
win32_shared_libs(apr_pool_t *pool)
{
apr_array_header_t *array = NULL;
wchar_t buffer[MAX_PATH + 1];
HMODULE *handles = enum_loaded_modules(pool);
HMODULE *module;
for (module = handles; module && *module; ++module)
{
const char *filename;
const char *version;
if (GetModuleFileNameW(*module, buffer, MAX_PATH))
{
buffer[MAX_PATH] = 0;
version = file_version_number(buffer, pool);
filename = wcs_to_utf8(buffer, pool);
if (filename)
{
svn_version_ext_loaded_lib_t *lib;
if (!array)
{
array = apr_array_make(pool, 32, sizeof(*lib));
}
lib = &APR_ARRAY_PUSH(array, svn_version_ext_loaded_lib_t);
lib->name = svn_dirent_local_style(filename, pool);
lib->version = version;
}
}
}
return array;
}
#endif /* WIN32 */
#ifdef SVN_HAVE_MACOS_PLIST
/* implements svn_write_fn_t to copy the data into a CFMutableDataRef that's
* in the baton. */
static svn_error_t *
write_to_cfmutabledata(void *baton, const char *data, apr_size_t *len)
{
CFMutableDataRef *resource = (CFMutableDataRef *) baton;
CFDataAppendBytes(*resource, (UInt8 *)data, *len);
return SVN_NO_ERROR;
}
/* Load the SystemVersion.plist or ServerVersion.plist file into a
property list. Set SERVER to TRUE if the file read was
ServerVersion.plist. */
static CFDictionaryRef
system_version_plist(svn_boolean_t *server, apr_pool_t *pool)
{
static const char server_version[] =
"/System/Library/CoreServices/ServerVersion.plist";
static const char system_version[] =
"/System/Library/CoreServices/SystemVersion.plist";
svn_stream_t *read_stream, *write_stream;
svn_error_t *err;
CFPropertyListRef plist = NULL;
CFMutableDataRef resource = CFDataCreateMutable(kCFAllocatorDefault, 0);
/* failed getting the CFMutableDataRef, shouldn't happen */
if (!resource)
return NULL;
/* Try to open the plist files to get the data */
err = svn_stream_open_readonly(&read_stream, server_version, pool, pool);
if (err)
{
if (!APR_STATUS_IS_ENOENT(err->apr_err))
{
svn_error_clear(err);
CFRelease(resource);
return NULL;
}
else
{
svn_error_clear(err);
err = svn_stream_open_readonly(&read_stream, system_version,
pool, pool);
if (err)
{
svn_error_clear(err);
CFRelease(resource);
return NULL;
}
*server = FALSE;
}
}
else
{
*server = TRUE;
}
/* copy the data onto the CFMutableDataRef to allow us to provide it to
* the CoreFoundation functions that parse proprerty lists */
write_stream = svn_stream_create(&resource, pool);
svn_stream_set_write(write_stream, write_to_cfmutabledata);
err = svn_stream_copy3(read_stream, write_stream, NULL, NULL, pool);
if (err)
{
svn_error_clear(err);
return NULL;
}
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
/* This function is only available from Mac OS 10.6 onward. */
plist = CFPropertyListCreateWithData(kCFAllocatorDefault, resource,
kCFPropertyListImmutable,
NULL, NULL);
#else /* Mac OS 10.5 or earlier */
/* This function obsolete and deprecated since Mac OS 10.10. */
plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, resource,
kCFPropertyListImmutable,
NULL);
#endif /* MAC_OS_X_VERSION_10_6 */
if (resource)
CFRelease(resource);
if (!plist)
return NULL;
if (CFDictionaryGetTypeID() != CFGetTypeID(plist))
{
/* Oops ... this really should be a dict. */
CFRelease(plist);
return NULL;
}
return plist;
}
/* Return the value for KEY from PLIST, or NULL if not available. */
static const char *
value_from_dict(CFDictionaryRef plist, CFStringRef key, apr_pool_t *pool)
{
CFStringRef valref;
CFIndex bufsize;
const void *valptr;
const char *value;
if (!CFDictionaryGetValueIfPresent(plist, key, &valptr))
return NULL;
valref = valptr;
if (CFStringGetTypeID() != CFGetTypeID(valref))
return NULL;
value = CFStringGetCStringPtr(valref, kCFStringEncodingUTF8);
if (value)
return apr_pstrdup(pool, value);
bufsize = 5 * CFStringGetLength(valref) + 1;
value = apr_palloc(pool, bufsize);
if (!CFStringGetCString(valref, (char*)value, bufsize,
kCFStringEncodingUTF8))
value = NULL;
return value;
}
/* Return the commercial name of the OS, given the version number in
a format that matches the regular expression /^10\.\d+(\..*)?$/ */
static const char *
release_name_from_version(const char *osver)
{
char *end = NULL;
unsigned long num = strtoul(osver, &end, 10);
if (!end || *end != '.' || num != 10)
return NULL;
osver = end + 1;
end = NULL;
num = strtoul(osver, &end, 10);
if (!end || (*end && *end != '.'))
return NULL;
/* See http://en.wikipedia.org/wiki/History_of_OS_X#Release_timeline */
switch(num)
{
case 0: return "Cheetah";
case 1: return "Puma";
case 2: return "Jaguar";
case 3: return "Panther";
case 4: return "Tiger";
case 5: return "Leopard";
case 6: return "Snow Leopard";
case 7: return "Lion";
case 8: return "Mountain Lion";
case 9: return "Mavericks";
case 10: return "Yosemite";
+ case 11: return "El Capitan";
+ case 12: return "Sierra";
}
return NULL;
}
/* Construct the release name from information stored in the Mac OS X
"SystemVersion.plist" file (or ServerVersion.plist, for Mac Os
Server. */
static const char *
macos_release_name(apr_pool_t *pool)
{
svn_boolean_t server;
CFDictionaryRef plist = system_version_plist(&server, pool);
if (plist)
{
const char *osname = value_from_dict(plist, CFSTR("ProductName"), pool);
const char *osver = value_from_dict(plist,
CFSTR("ProductUserVisibleVersion"),
pool);
const char *build = value_from_dict(plist,
CFSTR("ProductBuildVersion"),
pool);
const char *release;
if (!osver)
osver = value_from_dict(plist, CFSTR("ProductVersion"), pool);
release = release_name_from_version(osver);
CFRelease(plist);
return apr_psprintf(pool, "%s%s%s%s%s%s%s%s",
(osname ? osname : ""),
(osver ? (osname ? " " : "") : ""),
(osver ? osver : ""),
(release ? (osname||osver ? " " : "") : ""),
(release ? release : ""),
(build
? (osname||osver||release ? ", " : "")
: ""),
(build
? (server ? "server build " : "build ")
: ""),
(build ? build : ""));
}
return NULL;
}
#endif /* SVN_HAVE_MACOS_PLIST */
#ifdef SVN_HAVE_MACHO_ITERATE
/* List the shared libraries loaded by the current process.
Ignore frameworks and system libraries, they're just clutter. */
static const apr_array_header_t *
macos_shared_libs(apr_pool_t *pool)
{
static const char slb_prefix[] = "/usr/lib/system/";
static const char fwk_prefix[] = "/System/Library/Frameworks/";
static const char pfk_prefix[] = "/System/Library/PrivateFrameworks/";
const size_t slb_prefix_len = strlen(slb_prefix);
const size_t fwk_prefix_len = strlen(fwk_prefix);
const size_t pfk_prefix_len = strlen(pfk_prefix);
apr_array_header_t *result = NULL;
apr_array_header_t *dylibs = NULL;
uint32_t i;
for (i = 0;; ++i)
{
const struct mach_header *header = _dyld_get_image_header(i);
const char *filename = _dyld_get_image_name(i);
const char *version;
char *truename;
svn_version_ext_loaded_lib_t *lib;
if (!(header && filename))
break;
switch (header->cputype)
{
case CPU_TYPE_I386: version = _("Intel"); break;
case CPU_TYPE_X86_64: version = _("Intel 64-bit"); break;
case CPU_TYPE_POWERPC: version = _("PowerPC"); break;
case CPU_TYPE_POWERPC64: version = _("PowerPC 64-bit"); break;
default:
version = NULL;
}
if (0 == apr_filepath_merge(&truename, "", filename,
APR_FILEPATH_NATIVE
| APR_FILEPATH_TRUENAME,
pool))
filename = truename;
else
filename = apr_pstrdup(pool, filename);
if (0 == strncmp(filename, slb_prefix, slb_prefix_len)
|| 0 == strncmp(filename, fwk_prefix, fwk_prefix_len)
|| 0 == strncmp(filename, pfk_prefix, pfk_prefix_len))
{
/* Ignore frameworks and system libraries. */
continue;
}
if (header->filetype == MH_EXECUTE)
{
/* Make sure the program filename is first in the list */
if (!result)
{
result = apr_array_make(pool, 32, sizeof(*lib));
}
lib = &APR_ARRAY_PUSH(result, svn_version_ext_loaded_lib_t);
}
else
{
if (!dylibs)
{
dylibs = apr_array_make(pool, 32, sizeof(*lib));
}
lib = &APR_ARRAY_PUSH(dylibs, svn_version_ext_loaded_lib_t);
}
lib->name = filename;
lib->version = version;
}
/* Gather results into one array. */
if (dylibs)
{
if (result)
apr_array_cat(result, dylibs);
else
result = dylibs;
}
return result;
}
#endif /* SVN_HAVE_MACHO_ITERATE */
Index: stable/11/contrib/subversion/subversion/libsvn_subr/win32_crashrpt.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/win32_crashrpt.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/win32_crashrpt.c (revision 309511)
@@ -1,810 +1,810 @@
/*
* win32_crashrpt.c : provides information after a crash
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* prevent "empty compilation unit" warning on e.g. UNIX */
typedef int win32_crashrpt__dummy;
#ifdef WIN32
#ifdef SVN_USE_WIN32_CRASHHANDLER
/*** Includes. ***/
#include <apr.h>
#include <dbghelp.h>
#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "svn_version.h"
#include "sysinfo.h"
#include "win32_crashrpt.h"
#include "win32_crashrpt_dll.h"
/*** Global variables ***/
HANDLE dbghelp_dll = INVALID_HANDLE_VALUE;
/* Email address where the crash reports should be sent too. */
#define CRASHREPORT_EMAIL "users@subversion.apache.org"
#define DBGHELP_DLL "dbghelp.dll"
#define LOGFILE_PREFIX "svn-crash-log"
#if defined(_M_IX86)
-#define FORMAT_PTR "0x%08x"
+#define FORMAT_PTR "0x%08Ix"
#elif defined(_M_X64)
-#define FORMAT_PTR "0x%016I64x"
+#define FORMAT_PTR "0x%016Ix"
#endif
/*** Code. ***/
/* Convert a wide-character string to the current windows locale, suitable
* for directly using stdio. This function will create a buffer large
* enough to hold the result string, the caller should free this buffer.
* If the string can't be converted, NULL is returned.
*/
static char *
convert_wbcs_to_ansi(const wchar_t *str)
{
size_t len = wcslen(str);
char *utf8_str = malloc(sizeof(wchar_t) * len + 1);
len = wcstombs(utf8_str, str, len);
if (len == -1)
return NULL;
utf8_str[len] = '\0';
return utf8_str;
}
/* Convert the exception code to a string */
static const char *
exception_string(int exception)
{
#define EXCEPTION(x) case EXCEPTION_##x: return (#x);
switch (exception)
{
EXCEPTION(ACCESS_VIOLATION)
EXCEPTION(DATATYPE_MISALIGNMENT)
EXCEPTION(BREAKPOINT)
EXCEPTION(SINGLE_STEP)
EXCEPTION(ARRAY_BOUNDS_EXCEEDED)
EXCEPTION(FLT_DENORMAL_OPERAND)
EXCEPTION(FLT_DIVIDE_BY_ZERO)
EXCEPTION(FLT_INEXACT_RESULT)
EXCEPTION(FLT_INVALID_OPERATION)
EXCEPTION(FLT_OVERFLOW)
EXCEPTION(FLT_STACK_CHECK)
EXCEPTION(FLT_UNDERFLOW)
EXCEPTION(INT_DIVIDE_BY_ZERO)
EXCEPTION(INT_OVERFLOW)
EXCEPTION(PRIV_INSTRUCTION)
EXCEPTION(IN_PAGE_ERROR)
EXCEPTION(ILLEGAL_INSTRUCTION)
EXCEPTION(NONCONTINUABLE_EXCEPTION)
EXCEPTION(STACK_OVERFLOW)
EXCEPTION(INVALID_DISPOSITION)
EXCEPTION(GUARD_PAGE)
EXCEPTION(INVALID_HANDLE)
default:
return "UNKNOWN_ERROR";
}
#undef EXCEPTION
}
/* Write the minidump to file. The callback function will at the same time
write the list of modules to the log file. */
static BOOL
write_minidump_file(const char *file, PEXCEPTION_POINTERS ptrs,
MINIDUMP_CALLBACK_ROUTINE module_callback,
void *data)
{
/* open minidump file */
HANDLE minidump_file = CreateFile(file, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (minidump_file != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION expt_info;
MINIDUMP_CALLBACK_INFORMATION dump_cb_info;
expt_info.ThreadId = GetCurrentThreadId();
expt_info.ExceptionPointers = ptrs;
expt_info.ClientPointers = FALSE;
dump_cb_info.CallbackRoutine = module_callback;
dump_cb_info.CallbackParam = data;
MiniDumpWriteDump_(GetCurrentProcess(),
GetCurrentProcessId(),
minidump_file,
MiniDumpNormal,
ptrs ? &expt_info : NULL,
NULL,
&dump_cb_info);
CloseHandle(minidump_file);
return TRUE;
}
return FALSE;
}
/* Write module information to the log file */
static BOOL CALLBACK
write_module_info_callback(void *data,
CONST PMINIDUMP_CALLBACK_INPUT callback_input,
PMINIDUMP_CALLBACK_OUTPUT callback_output)
{
if (data != NULL &&
callback_input != NULL &&
callback_input->CallbackType == ModuleCallback)
{
FILE *log_file = (FILE *)data;
MINIDUMP_MODULE_CALLBACK module = callback_input->Module;
char *buf = convert_wbcs_to_ansi(module.FullPath);
- fprintf(log_file, FORMAT_PTR, module.BaseOfImage);
+ fprintf(log_file, FORMAT_PTR, (UINT_PTR)module.BaseOfImage);
fprintf(log_file, " %s", buf);
free(buf);
fprintf(log_file, " (%d.%d.%d.%d, %d bytes)\n",
HIWORD(module.VersionInfo.dwFileVersionMS),
LOWORD(module.VersionInfo.dwFileVersionMS),
HIWORD(module.VersionInfo.dwFileVersionLS),
LOWORD(module.VersionInfo.dwFileVersionLS),
module.SizeOfImage);
}
return TRUE;
}
/* Write details about the current process, platform and the exception */
static void
write_process_info(EXCEPTION_RECORD *exception, CONTEXT *context,
FILE *log_file)
{
OSVERSIONINFOEXW oi;
const char *cmd_line;
char workingdir[8192];
/* write the command line */
cmd_line = GetCommandLine();
fprintf(log_file,
"Cmd line: %s\n", cmd_line);
_getcwd(workingdir, sizeof(workingdir));
fprintf(log_file,
"Working Dir: %s\n", workingdir);
/* write the svn version number info. */
fprintf(log_file,
"Version: %s, compiled %s, %s\n",
SVN_VERSION, __DATE__, __TIME__);
/* write information about the OS */
if (svn_sysinfo___fill_windows_version(&oi))
fprintf(log_file,
"Platform: Windows OS version %d.%d build %d %S\n\n",
oi.dwMajorVersion, oi.dwMinorVersion, oi.dwBuildNumber,
oi.szCSDVersion);
/* write the exception code */
fprintf(log_file,
"Exception: %s\n\n",
exception_string(exception->ExceptionCode));
/* write the register info. */
fprintf(log_file,
"Registers:\n");
#if defined(_M_IX86)
fprintf(log_file,
"eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n",
context->Eax, context->Ebx, context->Ecx,
context->Edx, context->Esi, context->Edi);
fprintf(log_file,
"eip=%08x esp=%08x ebp=%08x efl=%08x\n",
context->Eip, context->Esp,
context->Ebp, context->EFlags);
fprintf(log_file,
"cs=%04x ss=%04x ds=%04x es=%04x fs=%04x gs=%04x\n",
context->SegCs, context->SegSs, context->SegDs,
context->SegEs, context->SegFs, context->SegGs);
#elif defined(_M_X64)
fprintf(log_file,
"Rax=%016I64x Rcx=%016I64x Rdx=%016I64x Rbx=%016I64x\n",
context->Rax, context->Rcx, context->Rdx, context->Rbx);
fprintf(log_file,
"Rsp=%016I64x Rbp=%016I64x Rsi=%016I64x Rdi=%016I64x\n",
context->Rsp, context->Rbp, context->Rsi, context->Rdi);
fprintf(log_file,
"R8= %016I64x R9= %016I64x R10=%016I64x R11=%016I64x\n",
context->R8, context->R9, context->R10, context->R11);
fprintf(log_file,
"R12=%016I64x R13=%016I64x R14=%016I64x R15=%016I64x\n",
context->R12, context->R13, context->R14, context->R15);
fprintf(log_file,
"cs=%04x ss=%04x ds=%04x es=%04x fs=%04x gs=%04x\n",
context->SegCs, context->SegSs, context->SegDs,
context->SegEs, context->SegFs, context->SegGs);
#else
#error Unknown processortype, please disable SVN_USE_WIN32_CRASHHANDLER
#endif
}
-/* Formats the value at address based on the specified basic type
- * (char, int, long ...). */
+/* Writes the value at address based on the specified basic type
+ * (char, int, long ...) to LOG_FILE. */
static void
-format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address)
+write_basic_type(FILE *log_file, DWORD basic_type, DWORD64 length,
+ void *address)
{
switch(length)
{
case 1:
- sprintf(buf, "0x%02x", (int)*(unsigned char *)address);
+ fprintf(log_file, "0x%02x", (int)*(unsigned char *)address);
break;
case 2:
- sprintf(buf, "0x%04x", (int)*(unsigned short *)address);
+ fprintf(log_file, "0x%04x", (int)*(unsigned short *)address);
break;
case 4:
switch(basic_type)
{
case 2: /* btChar */
{
if (!IsBadStringPtr(*(PSTR*)address, 32))
- sprintf(buf, "\"%.31s\"", *(const char **)address);
+ fprintf(log_file, "\"%.31s\"", *(const char **)address);
else
- sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)address);
}
case 6: /* btInt */
- sprintf(buf, "%d", *(int *)address);
+ fprintf(log_file, "%d", *(int *)address);
break;
case 8: /* btFloat */
- sprintf(buf, "%f", *(float *)address);
+ fprintf(log_file, "%f", *(float *)address);
break;
default:
- sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)address);
break;
}
break;
case 8:
if (basic_type == 8) /* btFloat */
- sprintf(buf, "%lf", *(double *)address);
+ fprintf(log_file, "%lf", *(double *)address);
else
- sprintf(buf, "0x%016I64X", *(unsigned __int64 *)address);
+ fprintf(log_file, "0x%016I64X", *(unsigned __int64 *)address);
break;
default:
- sprintf(buf, "[unhandled type 0x%08x of length " FORMAT_PTR "]",
- basic_type, length);
+ fprintf(log_file, "[unhandled type 0x%08x of length " FORMAT_PTR "]",
+ basic_type, (UINT_PTR)length);
break;
}
}
-/* Formats the value at address based on the type (pointer, user defined,
- * basic type). */
+/* Writes the value at address based on the type (pointer, user defined,
+ * basic type) to LOG_FILE. */
static void
-format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr)
+write_value(FILE *log_file, DWORD64 mod_base, DWORD type, void *value_addr)
{
DWORD tag = 0;
int ptr = 0;
HANDLE proc = GetCurrentProcess();
while (SymGetTypeInfo_(proc, mod_base, type, TI_GET_SYMTAG, &tag))
{
/* SymTagPointerType */
if (tag == 14)
{
ptr++;
SymGetTypeInfo_(proc, mod_base, type, TI_GET_TYPE, &type);
continue;
}
break;
}
switch(tag)
{
case 11: /* SymTagUDT */
{
WCHAR *type_name_wbcs;
if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_SYMNAME,
&type_name_wbcs))
{
char *type_name = convert_wbcs_to_ansi(type_name_wbcs);
LocalFree(type_name_wbcs);
if (ptr == 0)
- sprintf(value_str, "(%s) " FORMAT_PTR,
- type_name, (DWORD_PTR *)value_addr);
+ fprintf(log_file, "(%s) " FORMAT_PTR,
+ type_name, (UINT_PTR)(DWORD_PTR *)value_addr);
else if (ptr == 1)
- sprintf(value_str, "(%s *) " FORMAT_PTR,
+ fprintf(log_file, "(%s *) " FORMAT_PTR,
type_name, *(DWORD_PTR *)value_addr);
else
- sprintf(value_str, "(%s **) " FORMAT_PTR,
+ fprintf(log_file, "(%s **) " FORMAT_PTR,
type_name, *(DWORD_PTR *)value_addr);
free(type_name);
}
else
- sprintf(value_str, "[no symbol tag]");
+ fprintf(log_file, "[no symbol tag]");
}
break;
case 16: /* SymTagBaseType */
{
DWORD bt;
ULONG64 length;
SymGetTypeInfo_(proc, mod_base, type, TI_GET_LENGTH, &length);
/* print a char * as a string */
if (ptr == 1 && length == 1)
{
- sprintf(value_str, FORMAT_PTR " \"%s\"",
+ fprintf(log_file, FORMAT_PTR " \"%s\"",
*(DWORD_PTR *)value_addr, *(const char **)value_addr);
}
else if (ptr >= 1)
{
- sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)value_addr);
}
else if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_BASETYPE, &bt))
{
- format_basic_type(value_str, bt, length, value_addr);
+ write_basic_type(log_file, bt, length, value_addr);
}
}
break;
case 12: /* SymTagEnum */
- sprintf(value_str, "%d", *(DWORD_PTR *)value_addr);
+ fprintf(log_file, "%d", *(DWORD_PTR *)value_addr);
break;
case 13: /* SymTagFunctionType */
- sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)value_addr);
break;
default:
- sprintf(value_str, "[unhandled tag: %d]", tag);
+ fprintf(log_file, "[unhandled tag: %d]", tag);
break;
}
}
/* Internal structure used to pass some data to the enumerate symbols
* callback */
typedef struct symbols_baton_t {
STACKFRAME64 *stack_frame;
FILE *log_file;
int nr_of_frame;
BOOL log_params;
} symbols_baton_t;
/* Write the details of one parameter or local variable to the log file */
static BOOL WINAPI
write_var_values(PSYMBOL_INFO sym_info, ULONG sym_size, void *baton)
{
static int last_nr_of_frame = 0;
DWORD_PTR var_data = 0; /* Will point to the variable's data in memory */
STACKFRAME64 *stack_frame = ((symbols_baton_t*)baton)->stack_frame;
FILE *log_file = ((symbols_baton_t*)baton)->log_file;
int nr_of_frame = ((symbols_baton_t*)baton)->nr_of_frame;
BOOL log_params = ((symbols_baton_t*)baton)->log_params;
- char value_str[256] = "";
/* get the variable's data */
if (sym_info->Flags & SYMFLAG_REGREL)
{
var_data = (DWORD_PTR)stack_frame->AddrFrame.Offset;
var_data += (DWORD_PTR)sym_info->Address;
}
else
return FALSE;
if (log_params && sym_info->Flags & SYMFLAG_PARAMETER)
{
if (last_nr_of_frame == nr_of_frame)
- fprintf(log_file, ", ", 2);
+ fprintf(log_file, ", ");
else
last_nr_of_frame = nr_of_frame;
- format_value(value_str, sym_info->ModBase, sym_info->TypeIndex,
- (void *)var_data);
- fprintf(log_file, "%.*s=%s", (int)sym_info->NameLen, sym_info->Name,
- value_str);
+ fprintf(log_file, "%.*s=", (int)sym_info->NameLen, sym_info->Name);
+ write_value(log_file, sym_info->ModBase, sym_info->TypeIndex,
+ (void *)var_data);
}
if (!log_params && sym_info->Flags & SYMFLAG_LOCAL)
{
- format_value(value_str, sym_info->ModBase, sym_info->TypeIndex,
- (void *)var_data);
- fprintf(log_file, " %.*s = %s\n", (int)sym_info->NameLen,
- sym_info->Name, value_str);
+ fprintf(log_file, " %.*s = ", (int)sym_info->NameLen,
+ sym_info->Name);
+ write_value(log_file, sym_info->ModBase, sym_info->TypeIndex,
+ (void *)var_data);
+ fprintf(log_file, "\n");
}
return TRUE;
}
/* Write the details of one function to the log file */
static void
write_function_detail(STACKFRAME64 stack_frame, int nr_of_frame, FILE *log_file)
{
ULONG64 symbolBuffer[(sizeof(SYMBOL_INFO) +
MAX_SYM_NAME +
sizeof(ULONG64) - 1) /
sizeof(ULONG64)];
PSYMBOL_INFO pIHS = (PSYMBOL_INFO)symbolBuffer;
DWORD64 func_disp=0;
IMAGEHLP_STACK_FRAME ih_stack_frame;
IMAGEHLP_LINE64 ih_line;
DWORD line_disp=0;
HANDLE proc = GetCurrentProcess();
symbols_baton_t ensym;
nr_of_frame++; /* We need a 1 based index here */
/* log the function name */
pIHS->SizeOfStruct = sizeof(SYMBOL_INFO);
pIHS->MaxNameLen = MAX_SYM_NAME;
if (SymFromAddr_(proc, stack_frame.AddrPC.Offset, &func_disp, pIHS))
{
fprintf(log_file,
"#%d 0x%08I64x in %.*s(",
nr_of_frame, stack_frame.AddrPC.Offset,
pIHS->NameLen > 200 ? 200 : (int)pIHS->NameLen,
pIHS->Name);
/* restrict symbol enumeration to this frame only */
ih_stack_frame.InstructionOffset = stack_frame.AddrPC.Offset;
SymSetContext_(proc, &ih_stack_frame, 0);
ensym.log_file = log_file;
ensym.stack_frame = &stack_frame;
ensym.nr_of_frame = nr_of_frame;
/* log all function parameters */
ensym.log_params = TRUE;
SymEnumSymbols_(proc, 0, 0, write_var_values, &ensym);
fprintf(log_file, ")");
}
else
{
fprintf(log_file,
"#%d 0x%08I64x in (unknown function)",
nr_of_frame, stack_frame.AddrPC.Offset);
}
/* find the source line for this function. */
ih_line.SizeOfStruct = sizeof(IMAGEHLP_LINE);
if (SymGetLineFromAddr64_(proc, stack_frame.AddrPC.Offset,
&line_disp, &ih_line) != 0)
{
fprintf(log_file,
" at %s:%d\n", ih_line.FileName, ih_line.LineNumber);
}
else
{
fprintf(log_file, "\n");
}
/* log all function local variables */
ensym.log_params = FALSE;
SymEnumSymbols_(proc, 0, 0, write_var_values, &ensym);
}
/* Walk over the stack and log all relevant information to the log file */
static void
write_stacktrace(CONTEXT *context, FILE *log_file)
{
#if defined (_M_IX86) || defined(_M_X64) || defined(_M_IA64)
HANDLE proc = GetCurrentProcess();
STACKFRAME64 stack_frame;
DWORD machine;
CONTEXT ctx;
int skip = 0, i = 0;
/* The thread information - if not supplied. */
if (context == NULL)
{
/* If no context is supplied, skip 1 frame */
skip = 1;
ctx.ContextFlags = CONTEXT_FULL;
if (!GetThreadContext(GetCurrentThread(), &ctx))
return;
}
else
{
ctx = *context;
}
if (context == NULL)
return;
/* Write the stack trace */
ZeroMemory(&stack_frame, sizeof(STACKFRAME64));
stack_frame.AddrPC.Mode = AddrModeFlat;
stack_frame.AddrStack.Mode = AddrModeFlat;
stack_frame.AddrFrame.Mode = AddrModeFlat;
#if defined(_M_IX86)
machine = IMAGE_FILE_MACHINE_I386;
stack_frame.AddrPC.Offset = context->Eip;
stack_frame.AddrStack.Offset = context->Esp;
stack_frame.AddrFrame.Offset = context->Ebp;
#elif defined(_M_X64)
machine = IMAGE_FILE_MACHINE_AMD64;
stack_frame.AddrPC.Offset = context->Rip;
stack_frame.AddrStack.Offset = context->Rsp;
stack_frame.AddrFrame.Offset = context->Rbp;
#elif defined(_M_IA64)
machine = IMAGE_FILE_MACHINE_IA64;
stack_frame.AddrPC.Offset = context->StIIP;
stack_frame.AddrStack.Offset = context->SP;
stack_frame.AddrBStore.Mode = AddrModeFlat;
stack_frame.AddrBStore.Offset = context->RsBSP;
#else
#error Unknown processortype, please disable SVN_USE_WIN32_CRASHHANDLER
#endif
while (1)
{
if (! StackWalk64_(machine, proc, GetCurrentThread(),
&stack_frame, &ctx, NULL,
SymFunctionTableAccess64_, SymGetModuleBase64_, NULL))
{
break;
}
if (i >= skip)
{
/* Try to include symbolic information.
Also check that the address is not zero. Sometimes StackWalk
returns TRUE with a frame of zero. */
if (stack_frame.AddrPC.Offset != 0)
{
write_function_detail(stack_frame, i, log_file);
}
}
i++;
}
#else
#error Unknown processortype, please disable SVN_USE_WIN32_CRASHHANDLER
#endif
}
/* Check if a debugger is attached to this process */
static BOOL
is_debugger_present()
{
HANDLE kernel32_dll = LoadLibrary("kernel32.dll");
BOOL result;
ISDEBUGGERPRESENT IsDebuggerPresent_ =
(ISDEBUGGERPRESENT)GetProcAddress(kernel32_dll, "IsDebuggerPresent");
if (IsDebuggerPresent_ && IsDebuggerPresent_())
result = TRUE;
else
result = FALSE;
FreeLibrary(kernel32_dll);
return result;
}
/* Load the dbghelp.dll file, try to find a version that matches our
requirements. */
static BOOL
load_dbghelp_dll()
{
dbghelp_dll = LoadLibrary(DBGHELP_DLL);
if (dbghelp_dll != INVALID_HANDLE_VALUE)
{
DWORD opts;
/* load the functions */
MiniDumpWriteDump_ =
(MINIDUMPWRITEDUMP)GetProcAddress(dbghelp_dll, "MiniDumpWriteDump");
SymInitialize_ =
(SYMINITIALIZE)GetProcAddress(dbghelp_dll, "SymInitialize");
SymSetOptions_ =
(SYMSETOPTIONS)GetProcAddress(dbghelp_dll, "SymSetOptions");
SymGetOptions_ =
(SYMGETOPTIONS)GetProcAddress(dbghelp_dll, "SymGetOptions");
SymCleanup_ =
(SYMCLEANUP)GetProcAddress(dbghelp_dll, "SymCleanup");
SymGetTypeInfo_ =
(SYMGETTYPEINFO)GetProcAddress(dbghelp_dll, "SymGetTypeInfo");
SymGetLineFromAddr64_ =
(SYMGETLINEFROMADDR64)GetProcAddress(dbghelp_dll,
"SymGetLineFromAddr64");
SymEnumSymbols_ =
(SYMENUMSYMBOLS)GetProcAddress(dbghelp_dll, "SymEnumSymbols");
SymSetContext_ =
(SYMSETCONTEXT)GetProcAddress(dbghelp_dll, "SymSetContext");
SymFromAddr_ = (SYMFROMADDR)GetProcAddress(dbghelp_dll, "SymFromAddr");
StackWalk64_ = (STACKWALK64)GetProcAddress(dbghelp_dll, "StackWalk64");
SymFunctionTableAccess64_ =
(SYMFUNCTIONTABLEACCESS64)GetProcAddress(dbghelp_dll,
"SymFunctionTableAccess64");
SymGetModuleBase64_ =
(SYMGETMODULEBASE64)GetProcAddress(dbghelp_dll, "SymGetModuleBase64");
if (! (MiniDumpWriteDump_ &&
SymInitialize_ && SymSetOptions_ && SymGetOptions_ &&
SymCleanup_ && SymGetTypeInfo_ && SymGetLineFromAddr64_ &&
SymEnumSymbols_ && SymSetContext_ && SymFromAddr_ &&
SymGetModuleBase64_ && StackWalk64_ &&
SymFunctionTableAccess64_))
goto cleanup;
/* initialize the symbol loading code */
opts = SymGetOptions_();
/* Set the 'load lines' option to retrieve line number information;
set the Deferred Loads option to map the debug info in memory only
when needed. */
SymSetOptions_(opts | SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS);
/* Initialize the debughlp DLL with the default path and automatic
module enumeration (and loading of symbol tables) for this process.
*/
SymInitialize_(GetCurrentProcess(), NULL, TRUE);
return TRUE;
}
cleanup:
if (dbghelp_dll)
FreeLibrary(dbghelp_dll);
return FALSE;
}
/* Cleanup the dbghelp.dll library */
static void
cleanup_debughlp()
{
SymCleanup_(GetCurrentProcess());
FreeLibrary(dbghelp_dll);
}
/* Create a filename based on a prefix, the timestamp and an extension.
check if the filename was already taken, retry 3 times. */
BOOL
get_temp_filename(char *filename, const char *prefix, const char *ext)
{
char temp_dir[MAX_PATH - 64];
int i;
if (! GetTempPath(MAX_PATH - 64, temp_dir))
return FALSE;
for (i = 0;i < 3;i++)
{
HANDLE file;
time_t now;
char time_str[64];
time(&now);
strftime(time_str, 64, "%Y%m%d%H%M%S", localtime(&now));
sprintf(filename, "%s%s%s.%s", temp_dir, prefix, time_str, ext);
file = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL);
if (file != INVALID_HANDLE_VALUE)
{
CloseHandle(file);
return TRUE;
}
}
filename[0] = '\0';
return FALSE;
}
/* Unhandled exception callback set with SetUnhandledExceptionFilter() */
LONG WINAPI
svn__unhandled_exception_filter(PEXCEPTION_POINTERS ptrs)
{
char dmp_filename[MAX_PATH];
char log_filename[MAX_PATH];
FILE *log_file;
/* Check if the crash handler was already loaded (crash while handling the
crash) */
if (dbghelp_dll != INVALID_HANDLE_VALUE)
return EXCEPTION_CONTINUE_SEARCH;
/* don't log anything if we're running inside a debugger ... */
if (is_debugger_present())
return EXCEPTION_CONTINUE_SEARCH;
/* ... or if we can't create the log files ... */
if (!get_temp_filename(dmp_filename, LOGFILE_PREFIX, "dmp") ||
!get_temp_filename(log_filename, LOGFILE_PREFIX, "log"))
return EXCEPTION_CONTINUE_SEARCH;
/* If we can't load a recent version of the dbghelp.dll, pass on this
exception */
if (!load_dbghelp_dll())
return EXCEPTION_CONTINUE_SEARCH;
/* open log file */
log_file = fopen(log_filename, "w+");
/* write information about the process */
fprintf(log_file, "\nProcess info:\n");
write_process_info(ptrs ? ptrs->ExceptionRecord : NULL,
ptrs ? ptrs->ContextRecord : NULL,
log_file);
/* write the stacktrace, if available */
fprintf(log_file, "\nStacktrace:\n");
write_stacktrace(ptrs ? ptrs->ContextRecord : NULL, log_file);
/* write the minidump file and use the callback to write the list of modules
to the log file */
fprintf(log_file, "\n\nLoaded modules:\n");
write_minidump_file(dmp_filename, ptrs,
write_module_info_callback, (void *)log_file);
fclose(log_file);
/* inform the user */
fprintf(stderr, "This application has halted due to an unexpected error.\n"
"A crash report and minidump file were saved to disk, you"
" can find them here:\n"
"%s\n%s\n"
"Please send the log file to %s to help us analyze\nand "
"solve this problem.\n\n"
"NOTE: The crash report and minidump files can contain some"
" sensitive information\n(filenames, partial file content, "
"usernames and passwords etc.)\n",
log_filename,
dmp_filename,
CRASHREPORT_EMAIL);
if (getenv("SVN_DBG_STACKTRACES_TO_STDERR") != NULL)
{
fprintf(stderr, "\nProcess info:\n");
write_process_info(ptrs ? ptrs->ExceptionRecord : NULL,
ptrs ? ptrs->ContextRecord : NULL,
stderr);
fprintf(stderr, "\nStacktrace:\n");
write_stacktrace(ptrs ? ptrs->ContextRecord : NULL, stderr);
}
fflush(stderr);
fflush(stdout);
cleanup_debughlp();
/* terminate the application */
return EXCEPTION_EXECUTE_HANDLER;
}
#endif /* SVN_USE_WIN32_CRASHHANDLER */
#endif /* WIN32 */
Index: stable/11/contrib/subversion/subversion/libsvn_subr/xml.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_subr/xml.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_subr/xml.c (revision 309511)
@@ -1,678 +1,717 @@
/*
* xml.c: xml helper code shared among the Subversion libraries.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <string.h>
#include <assert.h>
#include "svn_private_config.h" /* for SVN_HAVE_OLD_EXPAT */
#include "svn_hash.h"
#include "svn_pools.h"
#include "svn_xml.h"
#include "svn_error.h"
#include "svn_ctype.h"
#include "private/svn_utf_private.h"
#include "private/svn_subr_private.h"
#ifdef SVN_HAVE_OLD_EXPAT
#include <xmlparse.h>
#else
#include <expat.h>
#endif
#ifdef XML_UNICODE
#error Expat is unusable -- it has been compiled for wide characters
#endif
+#ifndef XML_VERSION_AT_LEAST
+#define XML_VERSION_AT_LEAST(major,minor,patch) \
+(((major) < XML_MAJOR_VERSION) \
+ || ((major) == XML_MAJOR_VERSION && (minor) < XML_MINOR_VERSION) \
+ || ((major) == XML_MAJOR_VERSION && (minor) == XML_MINOR_VERSION && \
+ (patch) <= XML_MICRO_VERSION))
+#endif /* XML_VERSION_AT_LEAST */
+
const char *
svn_xml__compiled_version(void)
{
static const char xml_version_str[] = APR_STRINGIFY(XML_MAJOR_VERSION)
"." APR_STRINGIFY(XML_MINOR_VERSION)
"." APR_STRINGIFY(XML_MICRO_VERSION);
return xml_version_str;
}
const char *
svn_xml__runtime_version(void)
{
const char *expat_version = XML_ExpatVersion();
if (!strncmp(expat_version, "expat_", 6))
expat_version += 6;
return expat_version;
}
/* The private internals for a parser object. */
struct svn_xml_parser_t
{
/** the expat parser */
XML_Parser parser;
/** the SVN callbacks to call from the Expat callbacks */
svn_xml_start_elem start_handler;
svn_xml_end_elem end_handler;
svn_xml_char_data data_handler;
/** the user's baton for private data */
void *baton;
/** if non-@c NULL, an error happened while parsing */
svn_error_t *error;
/** where this object is allocated, so we can free it easily */
apr_pool_t *pool;
};
/*** XML character validation ***/
svn_boolean_t
svn_xml_is_xml_safe(const char *data, apr_size_t len)
{
const char *end = data + len;
const char *p;
if (! svn_utf__is_valid(data, len))
return FALSE;
for (p = data; p < end; p++)
{
unsigned char c = *p;
if (svn_ctype_iscntrl(c))
{
if ((c != SVN_CTYPE_ASCII_TAB)
&& (c != SVN_CTYPE_ASCII_LINEFEED)
&& (c != SVN_CTYPE_ASCII_CARRIAGERETURN)
&& (c != SVN_CTYPE_ASCII_DELETE))
return FALSE;
}
}
return TRUE;
}
/*** XML escaping. ***/
/* ### ...?
*
* If *OUTSTR is @c NULL, set *OUTSTR to a new stringbuf allocated
* in POOL, else append to the existing stringbuf there.
*/
static void
xml_escape_cdata(svn_stringbuf_t **outstr,
const char *data,
apr_size_t len,
apr_pool_t *pool)
{
const char *end = data + len;
const char *p = data, *q;
if (*outstr == NULL)
*outstr = svn_stringbuf_create_empty(pool);
while (1)
{
/* Find a character which needs to be quoted and append bytes up
to that point. Strictly speaking, '>' only needs to be
quoted if it follows "]]", but it's easier to quote it all
the time.
So, why are we escaping '\r' here? Well, according to the
XML spec, '\r\n' gets converted to '\n' during XML parsing.
Also, any '\r' not followed by '\n' is converted to '\n'. By
golly, if we say we want to escape a '\r', we want to make
sure it remains a '\r'! */
q = p;
while (q < end && *q != '&' && *q != '<' && *q != '>' && *q != '\r')
q++;
svn_stringbuf_appendbytes(*outstr, p, q - p);
/* We may already be a winner. */
if (q == end)
break;
/* Append the entity reference for the character. */
if (*q == '&')
svn_stringbuf_appendcstr(*outstr, "&amp;");
else if (*q == '<')
svn_stringbuf_appendcstr(*outstr, "&lt;");
else if (*q == '>')
svn_stringbuf_appendcstr(*outstr, "&gt;");
else if (*q == '\r')
svn_stringbuf_appendcstr(*outstr, "&#13;");
p = q + 1;
}
}
/* Essentially the same as xml_escape_cdata, with the addition of
whitespace and quote characters. */
static void
xml_escape_attr(svn_stringbuf_t **outstr,
const char *data,
apr_size_t len,
apr_pool_t *pool)
{
const char *end = data + len;
const char *p = data, *q;
if (*outstr == NULL)
*outstr = svn_stringbuf_create_ensure(len, pool);
while (1)
{
/* Find a character which needs to be quoted and append bytes up
to that point. */
q = p;
while (q < end && *q != '&' && *q != '<' && *q != '>'
&& *q != '"' && *q != '\'' && *q != '\r'
&& *q != '\n' && *q != '\t')
q++;
svn_stringbuf_appendbytes(*outstr, p, q - p);
/* We may already be a winner. */
if (q == end)
break;
/* Append the entity reference for the character. */
if (*q == '&')
svn_stringbuf_appendcstr(*outstr, "&amp;");
else if (*q == '<')
svn_stringbuf_appendcstr(*outstr, "&lt;");
else if (*q == '>')
svn_stringbuf_appendcstr(*outstr, "&gt;");
else if (*q == '"')
svn_stringbuf_appendcstr(*outstr, "&quot;");
else if (*q == '\'')
svn_stringbuf_appendcstr(*outstr, "&apos;");
else if (*q == '\r')
svn_stringbuf_appendcstr(*outstr, "&#13;");
else if (*q == '\n')
svn_stringbuf_appendcstr(*outstr, "&#10;");
else if (*q == '\t')
svn_stringbuf_appendcstr(*outstr, "&#9;");
p = q + 1;
}
}
void
svn_xml_escape_cdata_stringbuf(svn_stringbuf_t **outstr,
const svn_stringbuf_t *string,
apr_pool_t *pool)
{
xml_escape_cdata(outstr, string->data, string->len, pool);
}
void
svn_xml_escape_cdata_string(svn_stringbuf_t **outstr,
const svn_string_t *string,
apr_pool_t *pool)
{
xml_escape_cdata(outstr, string->data, string->len, pool);
}
void
svn_xml_escape_cdata_cstring(svn_stringbuf_t **outstr,
const char *string,
apr_pool_t *pool)
{
xml_escape_cdata(outstr, string, (apr_size_t) strlen(string), pool);
}
void
svn_xml_escape_attr_stringbuf(svn_stringbuf_t **outstr,
const svn_stringbuf_t *string,
apr_pool_t *pool)
{
xml_escape_attr(outstr, string->data, string->len, pool);
}
void
svn_xml_escape_attr_string(svn_stringbuf_t **outstr,
const svn_string_t *string,
apr_pool_t *pool)
{
xml_escape_attr(outstr, string->data, string->len, pool);
}
void
svn_xml_escape_attr_cstring(svn_stringbuf_t **outstr,
const char *string,
apr_pool_t *pool)
{
xml_escape_attr(outstr, string, (apr_size_t) strlen(string), pool);
}
const char *
svn_xml_fuzzy_escape(const char *string, apr_pool_t *pool)
{
const char *end = string + strlen(string);
const char *p = string, *q;
svn_stringbuf_t *outstr;
char escaped_char[6]; /* ? \ u u u \0 */
for (q = p; q < end; q++)
{
if (svn_ctype_iscntrl(*q)
&& ! ((*q == '\n') || (*q == '\r') || (*q == '\t')))
break;
}
/* Return original string if no unsafe characters found. */
if (q == end)
return string;
outstr = svn_stringbuf_create_empty(pool);
while (1)
{
q = p;
/* Traverse till either unsafe character or eos. */
while ((q < end)
&& ((! svn_ctype_iscntrl(*q))
|| (*q == '\n') || (*q == '\r') || (*q == '\t')))
q++;
/* copy chunk before marker */
svn_stringbuf_appendbytes(outstr, p, q - p);
if (q == end)
break;
/* Append an escaped version of the unsafe character.
### This format was chosen for consistency with
### svn_utf__cstring_from_utf8_fuzzy(). The two functions
### should probably share code, even though they escape
### different characters.
*/
apr_snprintf(escaped_char, sizeof(escaped_char), "?\\%03u",
(unsigned char) *q);
svn_stringbuf_appendcstr(outstr, escaped_char);
p = q + 1;
}
return outstr->data;
}
/*** Map from the Expat callback types to the SVN XML types. ***/
static void expat_start_handler(void *userData,
const XML_Char *name,
const XML_Char **atts)
{
svn_xml_parser_t *svn_parser = userData;
(*svn_parser->start_handler)(svn_parser->baton, name, atts);
}
static void expat_end_handler(void *userData, const XML_Char *name)
{
svn_xml_parser_t *svn_parser = userData;
(*svn_parser->end_handler)(svn_parser->baton, name);
}
static void expat_data_handler(void *userData, const XML_Char *s, int len)
{
svn_xml_parser_t *svn_parser = userData;
(*svn_parser->data_handler)(svn_parser->baton, s, (apr_size_t)len);
}
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+static void expat_entity_declaration(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity,
+ const XML_Char *value,
+ int value_length,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName)
+{
+ svn_xml_parser_t *svn_parser = userData;
+
+ /* Stop the parser if an entity declaration is hit. */
+ XML_StopParser(svn_parser->parser, 0 /* resumable */);
+}
+#else
+/* A noop default_handler. */
+static void expat_default_handler(void *userData, const XML_Char *s, int len)
+{
+}
+#endif
/*** Making a parser. ***/
svn_xml_parser_t *
svn_xml_make_parser(void *baton,
svn_xml_start_elem start_handler,
svn_xml_end_elem end_handler,
svn_xml_char_data data_handler,
apr_pool_t *pool)
{
svn_xml_parser_t *svn_parser;
apr_pool_t *subpool;
XML_Parser parser = XML_ParserCreate(NULL);
XML_SetElementHandler(parser,
start_handler ? expat_start_handler : NULL,
end_handler ? expat_end_handler : NULL);
XML_SetCharacterDataHandler(parser,
data_handler ? expat_data_handler : NULL);
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ XML_SetEntityDeclHandler(parser, expat_entity_declaration);
+#else
+ XML_SetDefaultHandler(parser, expat_default_handler);
+#endif
+
/* ### we probably don't want this pool; or at least we should pass it
### to the callbacks and clear it periodically. */
subpool = svn_pool_create(pool);
svn_parser = apr_pcalloc(subpool, sizeof(*svn_parser));
svn_parser->parser = parser;
svn_parser->start_handler = start_handler;
svn_parser->end_handler = end_handler;
svn_parser->data_handler = data_handler;
svn_parser->baton = baton;
svn_parser->pool = subpool;
/* store our parser info as the UserData in the Expat parser */
XML_SetUserData(parser, svn_parser);
return svn_parser;
}
/* Free a parser */
void
svn_xml_free_parser(svn_xml_parser_t *svn_parser)
{
/* Free the expat parser */
XML_ParserFree(svn_parser->parser);
/* Free the subversion parser */
svn_pool_destroy(svn_parser->pool);
}
svn_error_t *
svn_xml_parse(svn_xml_parser_t *svn_parser,
const char *buf,
apr_size_t len,
svn_boolean_t is_final)
{
svn_error_t *err;
int success;
/* Parse some xml data */
success = XML_Parse(svn_parser->parser, buf, (int) len, is_final);
/* If expat choked internally, return its error. */
if (! success)
{
/* Line num is "int" in Expat v1, "long" in v2; hide the difference. */
long line = XML_GetCurrentLineNumber(svn_parser->parser);
err = svn_error_createf
(SVN_ERR_XML_MALFORMED, NULL,
_("Malformed XML: %s at line %ld"),
XML_ErrorString(XML_GetErrorCode(svn_parser->parser)), line);
/* Kill all parsers and return the expat error */
svn_xml_free_parser(svn_parser);
return err;
}
/* Did an error occur somewhere *inside* the expat callbacks? */
if (svn_parser->error)
{
err = svn_parser->error;
svn_xml_free_parser(svn_parser);
return err;
}
return SVN_NO_ERROR;
}
void svn_xml_signal_bailout(svn_error_t *error,
svn_xml_parser_t *svn_parser)
{
/* This will cause the current XML_Parse() call to finish quickly! */
XML_SetElementHandler(svn_parser->parser, NULL, NULL);
XML_SetCharacterDataHandler(svn_parser->parser, NULL);
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ XML_SetEntityDeclHandler(svn_parser->parser, NULL);
+#endif
/* Once outside of XML_Parse(), the existence of this field will
cause svn_delta_parse()'s main read-loop to return error. */
svn_parser->error = error;
}
/*** Attribute walking. ***/
const char *
svn_xml_get_attr_value(const char *name, const char *const *atts)
{
while (atts && (*atts))
{
if (strcmp(atts[0], name) == 0)
return atts[1];
else
atts += 2; /* continue looping */
}
/* Else no such attribute name seen. */
return NULL;
}
/*** Printing XML ***/
void
svn_xml_make_header2(svn_stringbuf_t **str, const char *encoding,
apr_pool_t *pool)
{
if (*str == NULL)
*str = svn_stringbuf_create_empty(pool);
svn_stringbuf_appendcstr(*str, "<?xml version=\"1.0\"");
if (encoding)
{
encoding = apr_psprintf(pool, " encoding=\"%s\"", encoding);
svn_stringbuf_appendcstr(*str, encoding);
}
svn_stringbuf_appendcstr(*str, "?>\n");
}
/*** Creating attribute hashes. ***/
/* Combine an existing attribute list ATTS with a HASH that itself
represents an attribute list. Iff PRESERVE is true, then no value
already in HASH will be changed, else values from ATTS will
override previous values in HASH. */
static void
amalgamate(const char **atts,
apr_hash_t *ht,
svn_boolean_t preserve,
apr_pool_t *pool)
{
const char *key;
if (atts)
for (key = *atts; key; key = *(++atts))
{
const char *val = *(++atts);
size_t keylen;
assert(key != NULL);
/* kff todo: should we also insist that val be non-null here?
Probably. */
keylen = strlen(key);
if (preserve && ((apr_hash_get(ht, key, keylen)) != NULL))
continue;
else
apr_hash_set(ht, apr_pstrndup(pool, key, keylen), keylen,
val ? apr_pstrdup(pool, val) : NULL);
}
}
apr_hash_t *
svn_xml_ap_to_hash(va_list ap, apr_pool_t *pool)
{
apr_hash_t *ht = apr_hash_make(pool);
const char *key;
while ((key = va_arg(ap, char *)) != NULL)
{
const char *val = va_arg(ap, const char *);
svn_hash_sets(ht, key, val);
}
return ht;
}
apr_hash_t *
svn_xml_make_att_hash(const char **atts, apr_pool_t *pool)
{
apr_hash_t *ht = apr_hash_make(pool);
amalgamate(atts, ht, 0, pool); /* third arg irrelevant in this case */
return ht;
}
void
svn_xml_hash_atts_overlaying(const char **atts,
apr_hash_t *ht,
apr_pool_t *pool)
{
amalgamate(atts, ht, 0, pool);
}
void
svn_xml_hash_atts_preserving(const char **atts,
apr_hash_t *ht,
apr_pool_t *pool)
{
amalgamate(atts, ht, 1, pool);
}
/*** Making XML tags. ***/
void
svn_xml_make_open_tag_hash(svn_stringbuf_t **str,
apr_pool_t *pool,
enum svn_xml_open_tag_style style,
const char *tagname,
apr_hash_t *attributes)
{
apr_hash_index_t *hi;
apr_size_t est_size = strlen(tagname) + 4 + apr_hash_count(attributes) * 30;
if (*str == NULL)
*str = svn_stringbuf_create_ensure(est_size, pool);
svn_stringbuf_appendcstr(*str, "<");
svn_stringbuf_appendcstr(*str, tagname);
for (hi = apr_hash_first(pool, attributes); hi; hi = apr_hash_next(hi))
{
const void *key;
void *val;
apr_hash_this(hi, &key, NULL, &val);
assert(val != NULL);
svn_stringbuf_appendcstr(*str, "\n ");
svn_stringbuf_appendcstr(*str, key);
svn_stringbuf_appendcstr(*str, "=\"");
svn_xml_escape_attr_cstring(str, val, pool);
svn_stringbuf_appendcstr(*str, "\"");
}
if (style == svn_xml_self_closing)
svn_stringbuf_appendcstr(*str, "/");
svn_stringbuf_appendcstr(*str, ">");
if (style != svn_xml_protect_pcdata)
svn_stringbuf_appendcstr(*str, "\n");
}
void
svn_xml_make_open_tag_v(svn_stringbuf_t **str,
apr_pool_t *pool,
enum svn_xml_open_tag_style style,
const char *tagname,
va_list ap)
{
apr_pool_t *subpool = svn_pool_create(pool);
apr_hash_t *ht = svn_xml_ap_to_hash(ap, subpool);
svn_xml_make_open_tag_hash(str, pool, style, tagname, ht);
svn_pool_destroy(subpool);
}
void
svn_xml_make_open_tag(svn_stringbuf_t **str,
apr_pool_t *pool,
enum svn_xml_open_tag_style style,
const char *tagname,
...)
{
va_list ap;
va_start(ap, tagname);
svn_xml_make_open_tag_v(str, pool, style, tagname, ap);
va_end(ap);
}
void svn_xml_make_close_tag(svn_stringbuf_t **str,
apr_pool_t *pool,
const char *tagname)
{
if (*str == NULL)
*str = svn_stringbuf_create_empty(pool);
svn_stringbuf_appendcstr(*str, "</");
svn_stringbuf_appendcstr(*str, tagname);
svn_stringbuf_appendcstr(*str, ">\n");
}
Index: stable/11/contrib/subversion/subversion/libsvn_wc/conflicts.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_wc/conflicts.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_wc/conflicts.c (revision 309511)
@@ -1,3312 +1,3328 @@
/*
* conflicts.c: routines for managing conflict data.
* NOTE: this code doesn't know where the conflict is
* actually stored.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <string.h>
#include <apr_pools.h>
#include <apr_tables.h>
#include <apr_hash.h>
#include <apr_errno.h>
#include "svn_hash.h"
#include "svn_types.h"
#include "svn_pools.h"
#include "svn_string.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
#include "svn_wc.h"
#include "svn_io.h"
#include "svn_diff.h"
#include "wc.h"
#include "wc_db.h"
#include "conflicts.h"
#include "workqueue.h"
#include "props.h"
#include "private/svn_wc_private.h"
#include "private/svn_skel.h"
#include "private/svn_string_private.h"
#include "svn_private_config.h"
/* --------------------------------------------------------------------
* Conflict skel management
*/
svn_skel_t *
svn_wc__conflict_skel_create(apr_pool_t *result_pool)
{
svn_skel_t *conflict_skel = svn_skel__make_empty_list(result_pool);
/* Add empty CONFLICTS list */
svn_skel__prepend(svn_skel__make_empty_list(result_pool), conflict_skel);
/* Add empty WHY list */
svn_skel__prepend(svn_skel__make_empty_list(result_pool), conflict_skel);
return conflict_skel;
}
svn_error_t *
svn_wc__conflict_skel_is_complete(svn_boolean_t *complete,
const svn_skel_t *conflict_skel)
{
*complete = FALSE;
if (svn_skel__list_length(conflict_skel) < 2)
return svn_error_create(SVN_ERR_INCOMPLETE_DATA, NULL,
_("Not a conflict skel"));
if (svn_skel__list_length(conflict_skel->children) < 2)
return SVN_NO_ERROR; /* WHY is not set */
if (svn_skel__list_length(conflict_skel->children->next) == 0)
return SVN_NO_ERROR; /* No conflict set */
*complete = TRUE;
return SVN_NO_ERROR;
}
/* Serialize a svn_wc_conflict_version_t before the existing data in skel */
static svn_error_t *
conflict__prepend_location(svn_skel_t *skel,
const svn_wc_conflict_version_t *location,
svn_boolean_t allow_NULL,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *loc;
SVN_ERR_ASSERT(location || allow_NULL);
if (!location)
{
svn_skel__prepend(svn_skel__make_empty_list(result_pool), skel);
return SVN_NO_ERROR;
}
/* ("subversion" repos_root_url repos_uuid repos_relpath rev kind) */
loc = svn_skel__make_empty_list(result_pool);
svn_skel__prepend_str(svn_node_kind_to_word(location->node_kind),
loc, result_pool);
svn_skel__prepend_int(location->peg_rev, loc, result_pool);
svn_skel__prepend_str(apr_pstrdup(result_pool, location->path_in_repos), loc,
result_pool);
if (!location->repos_uuid) /* Can theoretically be NULL */
svn_skel__prepend(svn_skel__make_empty_list(result_pool), loc);
else
svn_skel__prepend_str(location->repos_uuid, loc, result_pool);
svn_skel__prepend_str(apr_pstrdup(result_pool, location->repos_url), loc,
result_pool);
svn_skel__prepend_str(SVN_WC__CONFLICT_SRC_SUBVERSION, loc, result_pool);
svn_skel__prepend(loc, skel);
return SVN_NO_ERROR;
}
/* Deserialize a svn_wc_conflict_version_t from the skel.
Set *LOCATION to NULL when the data is not a svn_wc_conflict_version_t. */
static svn_error_t *
conflict__read_location(svn_wc_conflict_version_t **location,
const svn_skel_t *skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *repos_root_url;
const char *repos_uuid;
const char *repos_relpath;
svn_revnum_t revision;
apr_int64_t v;
svn_node_kind_t node_kind; /* note that 'none' is a legitimate value */
const char *kind_str;
const svn_skel_t *c = skel->children;
if (!svn_skel__matches_atom(c, SVN_WC__CONFLICT_SRC_SUBVERSION))
{
*location = NULL;
return SVN_NO_ERROR;
}
c = c->next;
repos_root_url = apr_pstrmemdup(result_pool, c->data, c->len);
c = c->next;
if (c->is_atom)
repos_uuid = apr_pstrmemdup(result_pool, c->data, c->len);
else
repos_uuid = NULL;
c = c->next;
repos_relpath = apr_pstrmemdup(result_pool, c->data, c->len);
c = c->next;
SVN_ERR(svn_skel__parse_int(&v, c, scratch_pool));
revision = (svn_revnum_t)v;
c = c->next;
kind_str = apr_pstrmemdup(scratch_pool, c->data, c->len);
node_kind = svn_node_kind_from_word(kind_str);
*location = svn_wc_conflict_version_create2(repos_root_url,
repos_uuid,
repos_relpath,
revision,
node_kind,
result_pool);
return SVN_NO_ERROR;
}
/* Get the operation part of CONFLICT_SKELL or NULL if no operation is set
at this time */
static svn_error_t *
conflict__get_operation(svn_skel_t **why,
const svn_skel_t *conflict_skel)
{
SVN_ERR_ASSERT(conflict_skel
&& conflict_skel->children
&& conflict_skel->children->next
&& !conflict_skel->children->next->is_atom);
*why = conflict_skel->children;
if (!(*why)->children)
*why = NULL; /* Operation is not set yet */
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_skel_set_op_update(svn_skel_t *conflict_skel,
const svn_wc_conflict_version_t *original,
const svn_wc_conflict_version_t *target,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *why;
svn_skel_t *origins;
SVN_ERR_ASSERT(conflict_skel
&& conflict_skel->children
&& conflict_skel->children->next
&& !conflict_skel->children->next->is_atom);
SVN_ERR(conflict__get_operation(&why, conflict_skel));
SVN_ERR_ASSERT(why == NULL); /* No operation set */
why = conflict_skel->children;
origins = svn_skel__make_empty_list(result_pool);
SVN_ERR(conflict__prepend_location(origins, target, TRUE,
result_pool, scratch_pool));
SVN_ERR(conflict__prepend_location(origins, original, TRUE,
result_pool, scratch_pool));
svn_skel__prepend(origins, why);
svn_skel__prepend_str(SVN_WC__CONFLICT_OP_UPDATE, why, result_pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_skel_set_op_switch(svn_skel_t *conflict_skel,
const svn_wc_conflict_version_t *original,
const svn_wc_conflict_version_t *target,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *why;
svn_skel_t *origins;
SVN_ERR_ASSERT(conflict_skel
&& conflict_skel->children
&& conflict_skel->children->next
&& !conflict_skel->children->next->is_atom);
SVN_ERR(conflict__get_operation(&why, conflict_skel));
SVN_ERR_ASSERT(why == NULL); /* No operation set */
why = conflict_skel->children;
origins = svn_skel__make_empty_list(result_pool);
SVN_ERR(conflict__prepend_location(origins, target, TRUE,
result_pool, scratch_pool));
SVN_ERR(conflict__prepend_location(origins, original, TRUE,
result_pool, scratch_pool));
svn_skel__prepend(origins, why);
svn_skel__prepend_str(SVN_WC__CONFLICT_OP_SWITCH, why, result_pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_skel_set_op_merge(svn_skel_t *conflict_skel,
const svn_wc_conflict_version_t *left,
const svn_wc_conflict_version_t *right,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *why;
svn_skel_t *origins;
SVN_ERR_ASSERT(conflict_skel
&& conflict_skel->children
&& conflict_skel->children->next
&& !conflict_skel->children->next->is_atom);
SVN_ERR(conflict__get_operation(&why, conflict_skel));
SVN_ERR_ASSERT(why == NULL); /* No operation set */
why = conflict_skel->children;
origins = svn_skel__make_empty_list(result_pool);
SVN_ERR(conflict__prepend_location(origins, right, TRUE,
result_pool, scratch_pool));
SVN_ERR(conflict__prepend_location(origins, left, TRUE,
result_pool, scratch_pool));
svn_skel__prepend(origins, why);
svn_skel__prepend_str(SVN_WC__CONFLICT_OP_MERGE, why, result_pool);
return SVN_NO_ERROR;
}
/* Gets the conflict data of the specified type CONFLICT_TYPE from
CONFLICT_SKEL, or NULL if no such conflict is recorded */
static svn_error_t *
conflict__get_conflict(svn_skel_t **conflict,
const svn_skel_t *conflict_skel,
const char *conflict_type)
{
svn_skel_t *c;
SVN_ERR_ASSERT(conflict_skel
&& conflict_skel->children
&& conflict_skel->children->next
&& !conflict_skel->children->next->is_atom);
for(c = conflict_skel->children->next->children;
c;
c = c->next)
{
if (svn_skel__matches_atom(c->children, conflict_type))
{
*conflict = c;
return SVN_NO_ERROR;
}
}
*conflict = NULL;
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_skel_add_text_conflict(svn_skel_t *conflict_skel,
svn_wc__db_t *db,
const char *wri_abspath,
const char *mine_abspath,
const char *their_old_abspath,
const char *their_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *text_conflict;
svn_skel_t *markers;
SVN_ERR(conflict__get_conflict(&text_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_TEXT));
SVN_ERR_ASSERT(!text_conflict); /* ### Use proper error? */
/* Current skel format
("text"
(OLD MINE OLD-THEIRS THEIRS)) */
text_conflict = svn_skel__make_empty_list(result_pool);
markers = svn_skel__make_empty_list(result_pool);
if (their_abspath)
{
const char *their_relpath;
SVN_ERR(svn_wc__db_to_relpath(&their_relpath,
db, wri_abspath, their_abspath,
result_pool, scratch_pool));
svn_skel__prepend_str(their_relpath, markers, result_pool);
}
else
svn_skel__prepend(svn_skel__make_empty_list(result_pool), markers);
if (mine_abspath)
{
const char *mine_relpath;
SVN_ERR(svn_wc__db_to_relpath(&mine_relpath,
db, wri_abspath, mine_abspath,
result_pool, scratch_pool));
svn_skel__prepend_str(mine_relpath, markers, result_pool);
}
else
svn_skel__prepend(svn_skel__make_empty_list(result_pool), markers);
if (their_old_abspath)
{
const char *original_relpath;
SVN_ERR(svn_wc__db_to_relpath(&original_relpath,
db, wri_abspath, their_old_abspath,
result_pool, scratch_pool));
svn_skel__prepend_str(original_relpath, markers, result_pool);
}
else
svn_skel__prepend(svn_skel__make_empty_list(result_pool), markers);
svn_skel__prepend(markers, text_conflict);
svn_skel__prepend_str(SVN_WC__CONFLICT_KIND_TEXT, text_conflict,
result_pool);
/* And add it to the conflict skel */
svn_skel__prepend(text_conflict, conflict_skel->children->next);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_skel_add_prop_conflict(svn_skel_t *conflict_skel,
svn_wc__db_t *db,
const char *wri_abspath,
const char *marker_abspath,
const apr_hash_t *mine_props,
const apr_hash_t *their_old_props,
const apr_hash_t *their_props,
const apr_hash_t *conflicted_prop_names,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *prop_conflict;
svn_skel_t *props;
svn_skel_t *conflict_names;
svn_skel_t *markers;
apr_hash_index_t *hi;
SVN_ERR(conflict__get_conflict(&prop_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_PROP));
SVN_ERR_ASSERT(!prop_conflict); /* ### Use proper error? */
/* This function currently implements:
("prop"
("marker_relpath")
prop-conflicted_prop_names
old-props
mine-props
their-props)
NULL lists are recorded as "" */
/* ### Seems that this may not match what we read out. Read-out of
* 'theirs-old' comes as NULL. */
prop_conflict = svn_skel__make_empty_list(result_pool);
if (their_props)
{
SVN_ERR(svn_skel__unparse_proplist(&props, their_props, result_pool));
svn_skel__prepend(props, prop_conflict);
}
else
svn_skel__prepend_str("", prop_conflict, result_pool); /* No their_props */
if (mine_props)
{
SVN_ERR(svn_skel__unparse_proplist(&props, mine_props, result_pool));
svn_skel__prepend(props, prop_conflict);
}
else
svn_skel__prepend_str("", prop_conflict, result_pool); /* No mine_props */
if (their_old_props)
{
SVN_ERR(svn_skel__unparse_proplist(&props, their_old_props,
result_pool));
svn_skel__prepend(props, prop_conflict);
}
else
svn_skel__prepend_str("", prop_conflict, result_pool); /* No old_props */
conflict_names = svn_skel__make_empty_list(result_pool);
for (hi = apr_hash_first(scratch_pool, (apr_hash_t *)conflicted_prop_names);
hi;
hi = apr_hash_next(hi))
{
svn_skel__prepend_str(apr_pstrdup(result_pool, apr_hash_this_key(hi)),
conflict_names,
result_pool);
}
svn_skel__prepend(conflict_names, prop_conflict);
markers = svn_skel__make_empty_list(result_pool);
if (marker_abspath)
{
const char *marker_relpath;
SVN_ERR(svn_wc__db_to_relpath(&marker_relpath, db, wri_abspath,
marker_abspath,
result_pool, scratch_pool));
svn_skel__prepend_str(marker_relpath, markers, result_pool);
}
/*else // ### set via svn_wc__conflict_create_markers
svn_skel__prepend(svn_skel__make_empty_list(result_pool), markers);*/
svn_skel__prepend(markers, prop_conflict);
svn_skel__prepend_str(SVN_WC__CONFLICT_KIND_PROP, prop_conflict, result_pool);
/* And add it to the conflict skel */
svn_skel__prepend(prop_conflict, conflict_skel->children->next);
return SVN_NO_ERROR;
}
/* A map for svn_wc_conflict_reason_t values. */
static const svn_token_map_t reason_map[] =
{
{ "edited", svn_wc_conflict_reason_edited },
{ "obstructed", svn_wc_conflict_reason_obstructed },
{ "deleted", svn_wc_conflict_reason_deleted },
{ "missing", svn_wc_conflict_reason_missing },
{ "unversioned", svn_wc_conflict_reason_unversioned },
{ "added", svn_wc_conflict_reason_added },
{ "replaced", svn_wc_conflict_reason_replaced },
{ "moved-away", svn_wc_conflict_reason_moved_away },
{ "moved-here", svn_wc_conflict_reason_moved_here },
{ NULL }
};
static const svn_token_map_t action_map[] =
{
{ "edited", svn_wc_conflict_action_edit },
{ "added", svn_wc_conflict_action_add },
{ "deleted", svn_wc_conflict_action_delete },
{ "replaced", svn_wc_conflict_action_replace },
{ NULL }
};
svn_error_t *
svn_wc__conflict_skel_add_tree_conflict(svn_skel_t *conflict_skel,
svn_wc__db_t *db,
const char *wri_abspath,
svn_wc_conflict_reason_t reason,
svn_wc_conflict_action_t action,
const char *move_src_op_root_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *tree_conflict;
svn_skel_t *markers;
SVN_ERR(conflict__get_conflict(&tree_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_TREE));
SVN_ERR_ASSERT(!tree_conflict); /* ### Use proper error? */
SVN_ERR_ASSERT(reason == svn_wc_conflict_reason_moved_away
|| !move_src_op_root_abspath); /* ### Use proper error? */
tree_conflict = svn_skel__make_empty_list(result_pool);
if (reason == svn_wc_conflict_reason_moved_away
&& move_src_op_root_abspath)
{
const char *move_src_op_root_relpath;
SVN_ERR(svn_wc__db_to_relpath(&move_src_op_root_relpath,
db, wri_abspath,
move_src_op_root_abspath,
result_pool, scratch_pool));
svn_skel__prepend_str(move_src_op_root_relpath, tree_conflict,
result_pool);
}
svn_skel__prepend_str(svn_token__to_word(action_map, action),
tree_conflict, result_pool);
svn_skel__prepend_str(svn_token__to_word(reason_map, reason),
tree_conflict, result_pool);
/* Tree conflicts have no marker files */
markers = svn_skel__make_empty_list(result_pool);
svn_skel__prepend(markers, tree_conflict);
svn_skel__prepend_str(SVN_WC__CONFLICT_KIND_TREE, tree_conflict,
result_pool);
/* And add it to the conflict skel */
svn_skel__prepend(tree_conflict, conflict_skel->children->next);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_skel_resolve(svn_boolean_t *completely_resolved,
svn_skel_t *conflict_skel,
svn_wc__db_t *db,
const char *wri_abspath,
svn_boolean_t resolve_text,
const char *resolve_prop,
svn_boolean_t resolve_tree,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *op;
svn_skel_t **pconflict;
SVN_ERR(conflict__get_operation(&op, conflict_skel));
if (!op)
return svn_error_create(SVN_ERR_INCOMPLETE_DATA, NULL,
_("Not a completed conflict skel"));
/* We are going to drop items from a linked list. Instead of keeping
a pointer to the item we want to drop we store a pointer to the
pointer of what we may drop, to allow setting it to the next item. */
pconflict = &(conflict_skel->children->next->children);
while (*pconflict)
{
svn_skel_t *c = (*pconflict)->children;
if (resolve_text
&& svn_skel__matches_atom(c, SVN_WC__CONFLICT_KIND_TEXT))
{
/* Remove the text conflict from the linked list */
*pconflict = (*pconflict)->next;
continue;
}
else if (resolve_prop
&& svn_skel__matches_atom(c, SVN_WC__CONFLICT_KIND_PROP))
{
svn_skel_t **ppropnames = &(c->next->next->children);
if (resolve_prop[0] == '\0')
*ppropnames = NULL; /* remove all conflicted property names */
else
while (*ppropnames)
{
if (svn_skel__matches_atom(*ppropnames, resolve_prop))
{
*ppropnames = (*ppropnames)->next;
break;
}
ppropnames = &((*ppropnames)->next);
}
/* If no conflicted property names left */
if (!c->next->next->children)
{
/* Remove the propery conflict skel from the linked list */
*pconflict = (*pconflict)->next;
continue;
}
}
else if (resolve_tree
&& svn_skel__matches_atom(c, SVN_WC__CONFLICT_KIND_TREE))
{
/* Remove the tree conflict from the linked list */
*pconflict = (*pconflict)->next;
continue;
}
pconflict = &((*pconflict)->next);
}
if (completely_resolved)
{
/* Nice, we can just call the complete function */
svn_boolean_t complete_conflict;
SVN_ERR(svn_wc__conflict_skel_is_complete(&complete_conflict,
conflict_skel));
*completely_resolved = !complete_conflict;
}
return SVN_NO_ERROR;
}
/* A map for svn_wc_operation_t values. */
static const svn_token_map_t operation_map[] =
{
{ "", svn_wc_operation_none },
{ SVN_WC__CONFLICT_OP_UPDATE, svn_wc_operation_update },
{ SVN_WC__CONFLICT_OP_SWITCH, svn_wc_operation_switch },
{ SVN_WC__CONFLICT_OP_MERGE, svn_wc_operation_merge },
{ NULL }
};
svn_error_t *
svn_wc__conflict_read_info(svn_wc_operation_t *operation,
const apr_array_header_t **locations,
svn_boolean_t *text_conflicted,
svn_boolean_t *prop_conflicted,
svn_boolean_t *tree_conflicted,
svn_wc__db_t *db,
const char *wri_abspath,
const svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *op;
const svn_skel_t *c;
SVN_ERR(conflict__get_operation(&op, conflict_skel));
if (!op)
return svn_error_create(SVN_ERR_INCOMPLETE_DATA, NULL,
_("Not a completed conflict skel"));
c = op->children;
if (operation)
{
int value = svn_token__from_mem(operation_map, c->data, c->len);
if (value != SVN_TOKEN_UNKNOWN)
*operation = value;
else
*operation = svn_wc_operation_none;
}
c = c->next;
if (locations && c->children)
{
const svn_skel_t *loc_skel;
svn_wc_conflict_version_t *loc;
apr_array_header_t *locs = apr_array_make(result_pool, 2, sizeof(loc));
for (loc_skel = c->children; loc_skel; loc_skel = loc_skel->next)
{
SVN_ERR(conflict__read_location(&loc, loc_skel, result_pool,
scratch_pool));
APR_ARRAY_PUSH(locs, svn_wc_conflict_version_t *) = loc;
}
*locations = locs;
}
else if (locations)
*locations = NULL;
if (text_conflicted)
{
svn_skel_t *c_skel;
SVN_ERR(conflict__get_conflict(&c_skel, conflict_skel,
SVN_WC__CONFLICT_KIND_TEXT));
*text_conflicted = (c_skel != NULL);
}
if (prop_conflicted)
{
svn_skel_t *c_skel;
SVN_ERR(conflict__get_conflict(&c_skel, conflict_skel,
SVN_WC__CONFLICT_KIND_PROP));
*prop_conflicted = (c_skel != NULL);
}
if (tree_conflicted)
{
svn_skel_t *c_skel;
SVN_ERR(conflict__get_conflict(&c_skel, conflict_skel,
SVN_WC__CONFLICT_KIND_TREE));
*tree_conflicted = (c_skel != NULL);
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_read_text_conflict(const char **mine_abspath,
const char **their_old_abspath,
const char **their_abspath,
svn_wc__db_t *db,
const char *wri_abspath,
const svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *text_conflict;
const svn_skel_t *m;
SVN_ERR(conflict__get_conflict(&text_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_TEXT));
if (!text_conflict)
return svn_error_create(SVN_ERR_WC_MISSING, NULL, _("Conflict not set"));
m = text_conflict->children->next->children;
if (their_old_abspath)
{
if (m->is_atom)
{
const char *original_relpath;
original_relpath = apr_pstrmemdup(scratch_pool, m->data, m->len);
SVN_ERR(svn_wc__db_from_relpath(their_old_abspath,
db, wri_abspath, original_relpath,
result_pool, scratch_pool));
}
else
*their_old_abspath = NULL;
}
m = m->next;
if (mine_abspath)
{
if (m->is_atom)
{
const char *mine_relpath;
mine_relpath = apr_pstrmemdup(scratch_pool, m->data, m->len);
SVN_ERR(svn_wc__db_from_relpath(mine_abspath,
db, wri_abspath, mine_relpath,
result_pool, scratch_pool));
}
else
*mine_abspath = NULL;
}
m = m->next;
if (their_abspath)
{
if (m->is_atom)
{
const char *their_relpath;
their_relpath = apr_pstrmemdup(scratch_pool, m->data, m->len);
SVN_ERR(svn_wc__db_from_relpath(their_abspath,
db, wri_abspath, their_relpath,
result_pool, scratch_pool));
}
else
*their_abspath = NULL;
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_read_prop_conflict(const char **marker_abspath,
apr_hash_t **mine_props,
apr_hash_t **their_old_props,
apr_hash_t **their_props,
apr_hash_t **conflicted_prop_names,
svn_wc__db_t *db,
const char *wri_abspath,
const svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *prop_conflict;
const svn_skel_t *c;
SVN_ERR(conflict__get_conflict(&prop_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_PROP));
if (!prop_conflict)
return svn_error_create(SVN_ERR_WC_MISSING, NULL, _("Conflict not set"));
c = prop_conflict->children;
c = c->next; /* Skip "prop" */
/* Get marker file */
if (marker_abspath)
{
const char *marker_relpath;
if (c->children && c->children->is_atom)
{
marker_relpath = apr_pstrmemdup(result_pool, c->children->data,
c->children->len);
SVN_ERR(svn_wc__db_from_relpath(marker_abspath, db, wri_abspath,
marker_relpath,
result_pool, scratch_pool));
}
else
*marker_abspath = NULL;
}
c = c->next;
/* Get conflicted properties */
if (conflicted_prop_names)
{
const svn_skel_t *name;
*conflicted_prop_names = apr_hash_make(result_pool);
for (name = c->children; name; name = name->next)
{
svn_hash_sets(*conflicted_prop_names,
apr_pstrmemdup(result_pool, name->data, name->len),
"");
}
}
c = c->next;
/* Get original properties */
if (their_old_props)
{
if (c->is_atom)
*their_old_props = apr_hash_make(result_pool);
else
SVN_ERR(svn_skel__parse_proplist(their_old_props, c, result_pool));
}
c = c->next;
/* Get mine properties */
if (mine_props)
{
if (c->is_atom)
*mine_props = apr_hash_make(result_pool);
else
SVN_ERR(svn_skel__parse_proplist(mine_props, c, result_pool));
}
c = c->next;
/* Get their properties */
if (their_props)
{
if (c->is_atom)
*their_props = apr_hash_make(result_pool);
else
SVN_ERR(svn_skel__parse_proplist(their_props, c, result_pool));
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_read_tree_conflict(svn_wc_conflict_reason_t *reason,
svn_wc_conflict_action_t *action,
const char **move_src_op_root_abspath,
svn_wc__db_t *db,
const char *wri_abspath,
const svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *tree_conflict;
const svn_skel_t *c;
svn_boolean_t is_moved_away = FALSE;
SVN_ERR(conflict__get_conflict(&tree_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_TREE));
if (!tree_conflict)
return svn_error_create(SVN_ERR_WC_MISSING, NULL, _("Conflict not set"));
c = tree_conflict->children;
c = c->next; /* Skip "tree" */
c = c->next; /* Skip markers */
{
int value = svn_token__from_mem(reason_map, c->data, c->len);
if (reason)
{
if (value != SVN_TOKEN_UNKNOWN)
*reason = value;
else
*reason = svn_wc_conflict_reason_edited;
}
is_moved_away = (value == svn_wc_conflict_reason_moved_away);
}
c = c->next;
if (action)
{
int value = svn_token__from_mem(action_map, c->data, c->len);
if (value != SVN_TOKEN_UNKNOWN)
*action = value;
else
*action = svn_wc_conflict_action_edit;
}
c = c->next;
if (move_src_op_root_abspath)
{
/* Only set for update and switch tree conflicts */
if (c && is_moved_away)
{
const char *move_src_op_root_relpath
= apr_pstrmemdup(scratch_pool, c->data, c->len);
SVN_ERR(svn_wc__db_from_relpath(move_src_op_root_abspath,
db, wri_abspath,
move_src_op_root_relpath,
result_pool, scratch_pool));
}
else
*move_src_op_root_abspath = NULL;
}
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__conflict_read_markers(const apr_array_header_t **markers,
svn_wc__db_t *db,
const char *wri_abspath,
const svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const svn_skel_t *conflict;
apr_array_header_t *list = NULL;
SVN_ERR_ASSERT(conflict_skel != NULL);
/* Walk the conflicts */
for (conflict = conflict_skel->children->next->children;
conflict;
conflict = conflict->next)
{
const svn_skel_t *marker;
/* Get the list of markers stored per conflict */
for (marker = conflict->children->next->children;
marker;
marker = marker->next)
{
/* Skip placeholders */
if (! marker->is_atom)
continue;
if (! list)
list = apr_array_make(result_pool, 4, sizeof(const char *));
SVN_ERR(svn_wc__db_from_relpath(
&APR_ARRAY_PUSH(list, const char*),
db, wri_abspath,
apr_pstrmemdup(scratch_pool, marker->data,
marker->len),
result_pool, scratch_pool));
}
}
*markers = list;
return SVN_NO_ERROR;
}
/* --------------------------------------------------------------------
*/
svn_error_t *
svn_wc__conflict_create_markers(svn_skel_t **work_items,
svn_wc__db_t *db,
const char *local_abspath,
svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_boolean_t prop_conflicted;
svn_wc_operation_t operation;
*work_items = NULL;
SVN_ERR(svn_wc__conflict_read_info(&operation, NULL,
NULL, &prop_conflicted, NULL,
db, local_abspath,
conflict_skel,
scratch_pool, scratch_pool));
if (prop_conflicted)
{
const char *marker_abspath = NULL;
svn_node_kind_t kind;
const char *marker_dir;
const char *marker_name;
const char *marker_relpath;
/* Ok, currently we have to do a few things for property conflicts:
- Create a marker file
- Store the name in the conflict_skel
- Create a WQ item that fills the marker with the expected data */
SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool));
if (kind == svn_node_dir)
{
marker_dir = local_abspath;
marker_name = SVN_WC__THIS_DIR_PREJ;
}
else
svn_dirent_split(&marker_dir, &marker_name, local_abspath,
scratch_pool);
SVN_ERR(svn_io_open_uniquely_named(NULL, &marker_abspath,
marker_dir,
marker_name,
SVN_WC__PROP_REJ_EXT,
svn_io_file_del_none,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__db_to_relpath(&marker_relpath, db, local_abspath,
marker_abspath, result_pool, result_pool));
/* And store the marker in the skel */
{
svn_skel_t *prop_conflict;
SVN_ERR(conflict__get_conflict(&prop_conflict, conflict_skel,
SVN_WC__CONFLICT_KIND_PROP));
svn_skel__prepend_str(marker_relpath, prop_conflict->children->next,
result_pool);
}
SVN_ERR(svn_wc__wq_build_prej_install(work_items,
db, local_abspath,
scratch_pool, scratch_pool));
}
return SVN_NO_ERROR;
}
/* Helper function for the three apply_* functions below, used when
* merging properties together.
*
* Given property PROPNAME on LOCAL_ABSPATH, and four possible property
* values, generate four tmpfiles and pass them to CONFLICT_FUNC callback.
* This gives the client an opportunity to interactively resolve the
* property conflict.
*
* BASE_VAL/WORKING_VAL represent the current state of the working
* copy, and INCOMING_OLD_VAL/INCOMING_NEW_VAL represents the incoming
* propchange. Any of these values might be NULL, indicating either
* non-existence or intent-to-delete.
*
* If the callback isn't available, or if it responds with
* 'choose_postpone', then set *CONFLICT_REMAINS to TRUE and return.
*
* If the callback responds with a choice of 'base', 'theirs', 'mine',
* or 'merged', then install the proper value into ACTUAL_PROPS and
* set *CONFLICT_REMAINS to FALSE.
*/
static svn_error_t *
generate_propconflict(svn_boolean_t *conflict_remains,
svn_wc__db_t *db,
const char *local_abspath,
svn_node_kind_t kind,
svn_wc_operation_t operation,
const svn_wc_conflict_version_t *left_version,
const svn_wc_conflict_version_t *right_version,
const char *propname,
const svn_string_t *base_val,
const svn_string_t *working_val,
const svn_string_t *incoming_old_val,
const svn_string_t *incoming_new_val,
svn_wc_conflict_resolver_func2_t conflict_func,
void *conflict_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_wc_conflict_result_t *result = NULL;
svn_wc_conflict_description2_t *cdesc;
const char *dirpath = svn_dirent_dirname(local_abspath, scratch_pool);
const svn_string_t *new_value = NULL;
cdesc = svn_wc_conflict_description_create_prop2(
local_abspath,
kind,
propname, scratch_pool);
cdesc->operation = operation;
cdesc->src_left_version = left_version;
cdesc->src_right_version = right_version;
/* Create a tmpfile for each of the string_t's we've got. */
if (working_val)
{
const char *file_name;
SVN_ERR(svn_io_write_unique(&file_name, dirpath, working_val->data,
working_val->len,
svn_io_file_del_on_pool_cleanup,
scratch_pool));
cdesc->my_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
cdesc->prop_value_working = working_val;
}
if (incoming_new_val)
{
const char *file_name;
SVN_ERR(svn_io_write_unique(&file_name, dirpath, incoming_new_val->data,
incoming_new_val->len,
svn_io_file_del_on_pool_cleanup,
scratch_pool));
/* ### For property conflicts, cd2 stores prop_reject_abspath in
* ### their_abspath, and stores theirs_abspath in merged_file. */
cdesc->merged_file = svn_dirent_join(dirpath, file_name, scratch_pool);
cdesc->prop_value_incoming_new = incoming_new_val;
}
if (!base_val && !incoming_old_val)
{
/* If base and old are both NULL, then that's fine, we just let
base_file stay NULL as-is. Both agents are attempting to add a
new property. */
}
else if ((base_val && !incoming_old_val)
|| (!base_val && incoming_old_val))
{
/* If only one of base and old are defined, then we've got a
situation where one agent is attempting to add the property
for the first time, and the other agent is changing a
property it thinks already exists. In this case, we return
whichever older-value happens to be defined, so that the
conflict-callback can still attempt a 3-way merge. */
const svn_string_t *conflict_base_val = base_val ? base_val
: incoming_old_val;
const char *file_name;
SVN_ERR(svn_io_write_unique(&file_name, dirpath,
conflict_base_val->data,
conflict_base_val->len,
svn_io_file_del_on_pool_cleanup,
scratch_pool));
cdesc->base_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
}
else /* base and old are both non-NULL */
{
const svn_string_t *conflict_base_val;
const char *file_name;
if (! svn_string_compare(base_val, incoming_old_val))
{
/* What happens if 'base' and 'old' don't match up? In an
ideal situation, they would. But if they don't, this is
a classic example of a patch 'hunk' failing to apply due
to a lack of context. For example: imagine that the user
is busy changing the property from a value of "cat" to
"dog", but the incoming propchange wants to change the
same property value from "red" to "green". Total context
mismatch.
HOWEVER: we can still pass one of the two base values as
'base_file' to the callback anyway. It's still useful to
present the working and new values to the user to
compare. */
if (working_val && svn_string_compare(base_val, working_val))
conflict_base_val = incoming_old_val;
else
conflict_base_val = base_val;
}
else
{
conflict_base_val = base_val;
}
SVN_ERR(svn_io_write_unique(&file_name, dirpath, conflict_base_val->data,
conflict_base_val->len,
svn_io_file_del_on_pool_cleanup, scratch_pool));
cdesc->base_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
cdesc->prop_value_base = base_val;
cdesc->prop_value_incoming_old = incoming_old_val;
if (working_val && incoming_new_val)
{
svn_stream_t *mergestream;
svn_diff_t *diff;
svn_diff_file_options_t *options =
svn_diff_file_options_create(scratch_pool);
SVN_ERR(svn_stream_open_unique(&mergestream, &cdesc->prop_reject_abspath,
NULL, svn_io_file_del_on_pool_cleanup,
scratch_pool, scratch_pool));
SVN_ERR(svn_diff_mem_string_diff3(&diff, conflict_base_val,
working_val,
incoming_new_val, options, scratch_pool));
SVN_ERR(svn_diff_mem_string_output_merge3(mergestream, diff,
conflict_base_val, working_val,
incoming_new_val, NULL, NULL, NULL, NULL,
svn_diff_conflict_display_modified_latest,
cancel_func, cancel_baton, scratch_pool));
SVN_ERR(svn_stream_close(mergestream));
/* ### For property conflicts, cd2 stores prop_reject_abspath in
* ### their_abspath, and stores theirs_abspath in merged_file. */
cdesc->their_abspath = cdesc->prop_reject_abspath;
}
}
if (!incoming_old_val && incoming_new_val)
cdesc->action = svn_wc_conflict_action_add;
else if (incoming_old_val && !incoming_new_val)
cdesc->action = svn_wc_conflict_action_delete;
else
cdesc->action = svn_wc_conflict_action_edit;
if (base_val && !working_val)
cdesc->reason = svn_wc_conflict_reason_deleted;
else if (!base_val && working_val)
cdesc->reason = svn_wc_conflict_reason_obstructed;
else
cdesc->reason = svn_wc_conflict_reason_edited;
/* Invoke the interactive conflict callback. */
SVN_ERR(conflict_func(&result, cdesc, conflict_baton, scratch_pool,
scratch_pool));
if (result == NULL)
{
*conflict_remains = TRUE;
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL, _("Conflict callback violated API:"
" returned no results"));
}
switch (result->choice)
{
default:
case svn_wc_conflict_choose_postpone:
{
*conflict_remains = TRUE;
break;
}
case svn_wc_conflict_choose_mine_full:
{
/* No need to change actual_props; it already contains working_val */
*conflict_remains = FALSE;
new_value = working_val;
break;
}
/* I think _mine_full and _theirs_full are appropriate for prop
behavior as well as the text behavior. There should even be
analogous behaviors for _mine and _theirs when those are
ready, namely: fold in all non-conflicting prop changes, and
then choose _mine side or _theirs side for conflicting ones. */
case svn_wc_conflict_choose_theirs_full:
{
*conflict_remains = FALSE;
new_value = incoming_new_val;
break;
}
case svn_wc_conflict_choose_base:
{
*conflict_remains = FALSE;
new_value = base_val;
break;
}
case svn_wc_conflict_choose_merged:
{
svn_stringbuf_t *merged_stringbuf;
if (!cdesc->merged_file
&& (!result->merged_file && !result->merged_value))
return svn_error_create
(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL, _("Conflict callback violated API:"
" returned no merged file"));
if (result->merged_value)
new_value = result->merged_value;
else
{
SVN_ERR(svn_stringbuf_from_file2(&merged_stringbuf,
result->merged_file ?
result->merged_file :
cdesc->merged_file,
scratch_pool));
new_value = svn_stringbuf__morph_into_string(merged_stringbuf);
}
*conflict_remains = FALSE;
break;
}
}
if (!*conflict_remains)
{
apr_hash_t *props;
/* For now, just set the property values. This should really do some of the
more advanced things from svn_wc_prop_set() */
SVN_ERR(svn_wc__db_read_props(&props, db, local_abspath, scratch_pool,
scratch_pool));
svn_hash_sets(props, propname, new_value);
SVN_ERR(svn_wc__db_op_set_props(db, local_abspath, props,
FALSE, NULL, NULL,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Perform a 3-way merge in which conflicts are expected, showing the
* conflicts in the way specified by STYLE, and using MERGE_OPTIONS.
*
* The three input files are LEFT_ABSPATH (the base), DETRANSLATED_TARGET
* and RIGHT_ABSPATH. The output is stored in a new temporary file,
* whose name is put into *CHOSEN_ABSPATH.
*
* The output file will be deleted according to DELETE_WHEN. If
* DELETE_WHEN is 'on pool cleanup', it refers to RESULT_POOL.
*
* DB and WRI_ABSPATH are used to choose a directory for the output file.
*
* Allocate *CHOSEN_ABSPATH in RESULT_POOL. Use SCRATCH_POOL for temporary
* allocations.
*/
static svn_error_t *
merge_showing_conflicts(const char **chosen_abspath,
svn_wc__db_t *db,
const char *wri_abspath,
svn_diff_conflict_display_style_t style,
const apr_array_header_t *merge_options,
const char *left_abspath,
const char *detranslated_target,
const char *right_abspath,
svn_io_file_del_t delete_when,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *temp_dir;
svn_stream_t *chosen_stream;
svn_diff_t *diff;
svn_diff_file_options_t *diff3_options;
diff3_options = svn_diff_file_options_create(scratch_pool);
if (merge_options)
SVN_ERR(svn_diff_file_options_parse(diff3_options,
merge_options,
scratch_pool));
SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir, db,
wri_abspath,
scratch_pool, scratch_pool));
/* We need to open the stream in RESULT_POOL because that controls the
* lifetime of the file if DELETE_WHEN is 'on pool cleanup'. (We also
* want to allocate CHOSEN_ABSPATH in RESULT_POOL, but we don't care
* about the stream itself.) */
SVN_ERR(svn_stream_open_unique(&chosen_stream, chosen_abspath,
temp_dir, delete_when,
result_pool, scratch_pool));
SVN_ERR(svn_diff_file_diff3_2(&diff,
left_abspath,
detranslated_target, right_abspath,
diff3_options, scratch_pool));
SVN_ERR(svn_diff_file_output_merge3(chosen_stream, diff,
left_abspath,
detranslated_target,
right_abspath,
NULL, NULL, NULL, NULL, /* markers */
style, cancel_func, cancel_baton,
scratch_pool));
SVN_ERR(svn_stream_close(chosen_stream));
return SVN_NO_ERROR;
}
/* Prepare to delete an artifact file at ARTIFACT_FILE_ABSPATH in the
* working copy at DB/WRI_ABSPATH.
*
* Set *WORK_ITEMS to a new work item that, when run, will delete the
* artifact file; or to NULL if there is no file to delete.
*
* Set *FILE_FOUND to TRUE if the artifact file is found on disk and its
* node kind is 'file'; otherwise do not change *FILE_FOUND. FILE_FOUND
* may be NULL if not required.
*/
static svn_error_t *
remove_artifact_file_if_exists(svn_skel_t **work_items,
svn_boolean_t *file_found,
svn_wc__db_t *db,
const char *wri_abspath,
const char *artifact_file_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
*work_items = NULL;
if (artifact_file_abspath)
{
svn_node_kind_t node_kind;
SVN_ERR(svn_io_check_path(artifact_file_abspath, &node_kind,
scratch_pool));
if (node_kind == svn_node_file)
{
SVN_ERR(svn_wc__wq_build_file_remove(work_items,
db, wri_abspath,
artifact_file_abspath,
result_pool, scratch_pool));
if (file_found)
*file_found = TRUE;
}
}
return SVN_NO_ERROR;
}
/* Create a new file in the same directory as LOCAL_ABSPATH, with the
same basename as LOCAL_ABSPATH, with a ".edited" extension, and set
*WORK_ITEM to a new work item that will copy and translate from the file
SOURCE_ABSPATH to that new file. It will be translated from repository-
normal form to working-copy form according to the versioned properties
of LOCAL_ABSPATH that are current when the work item is executed.
DB should have a write lock for the directory containing SOURCE.
Allocate *WORK_ITEM in RESULT_POOL. */
static svn_error_t *
save_merge_result(svn_skel_t **work_item,
svn_wc__db_t *db,
const char *local_abspath,
const char *source_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *edited_copy_abspath;
const char *dir_abspath;
const char *filename;
svn_dirent_split(&dir_abspath, &filename, local_abspath, scratch_pool);
/* ### Should use preserved-conflict-file-exts. */
/* Create the .edited file within this file's DIR_ABSPATH */
SVN_ERR(svn_io_open_uniquely_named(NULL,
&edited_copy_abspath,
dir_abspath,
filename,
".edited",
svn_io_file_del_none,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__wq_build_file_copy_translated(work_item,
db, local_abspath,
source_abspath,
edited_copy_abspath,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Resolve the text conflict in CONFLICT, which is currently recorded
* on DB/LOCAL_ABSPATH in the manner specified by CHOICE.
*
* Set *WORK_ITEMS to new work items that will make the on-disk changes
* needed to complete the resolution (but not to mark it as resolved).
*
* Set *FOUND_ARTIFACT to true if conflict markers are removed; otherwise
* (which is only if CHOICE is 'postpone') to false.
*
* CHOICE, MERGED_FILE and SAVE_MERGED are typically values provided by
* the conflict resolver.
*
* MERGE_OPTIONS allows customizing the diff handling when using
* per hunk conflict resolving.
*/
static svn_error_t *
build_text_conflict_resolve_items(svn_skel_t **work_items,
svn_boolean_t *found_artifact,
svn_wc__db_t *db,
const char *local_abspath,
const svn_skel_t *conflict,
svn_wc_conflict_choice_t choice,
const char *merged_file,
svn_boolean_t save_merged,
const apr_array_header_t *merge_options,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *mine_abspath;
const char *their_old_abspath;
const char *their_abspath;
svn_skel_t *work_item;
const char *install_from_abspath = NULL;
svn_boolean_t remove_source = FALSE;
*work_items = NULL;
if (found_artifact)
*found_artifact = FALSE;
SVN_ERR(svn_wc__conflict_read_text_conflict(&mine_abspath,
&their_old_abspath,
&their_abspath,
db, local_abspath,
conflict,
scratch_pool, scratch_pool));
if (save_merged)
SVN_ERR(save_merge_result(work_items,
db, local_abspath,
merged_file
? merged_file
: local_abspath,
result_pool, scratch_pool));
if (choice == svn_wc_conflict_choose_postpone)
return SVN_NO_ERROR;
switch (choice)
{
/* If the callback wants to use one of the fulltexts
to resolve the conflict, so be it.*/
case svn_wc_conflict_choose_base:
{
install_from_abspath = their_old_abspath;
break;
}
case svn_wc_conflict_choose_theirs_full:
{
install_from_abspath = their_abspath;
break;
}
case svn_wc_conflict_choose_mine_full:
{
- install_from_abspath = mine_abspath;
+ /* In case of selecting to resolve the conflict choosing the full
+ own file, allow the text conflict resolution to just take the
+ existing local file if no merged file was present (case: binary
+ file conflicts do not generate a locally merge file).
+ */
+ install_from_abspath = mine_abspath
+ ? mine_abspath
+ : local_abspath;
break;
}
case svn_wc_conflict_choose_theirs_conflict:
case svn_wc_conflict_choose_mine_conflict:
{
svn_diff_conflict_display_style_t style
= choice == svn_wc_conflict_choose_theirs_conflict
? svn_diff_conflict_display_latest
: svn_diff_conflict_display_modified;
+
+ if (mine_abspath == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Conflict on '%s' cannot be resolved to "
+ "'theirs-conflict' or 'mine-conflict' "
+ "because a merged version of the file "
+ "cannot be created."),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
SVN_ERR(merge_showing_conflicts(&install_from_abspath,
db, local_abspath,
style, merge_options,
their_old_abspath,
mine_abspath,
their_abspath,
/* ### why not same as other caller? */
svn_io_file_del_none,
cancel_func, cancel_baton,
scratch_pool, scratch_pool));
remove_source = TRUE;
break;
}
/* For the case of 3-way file merging, we don't
really distinguish between these return values;
if the callback claims to have "generally
resolved" the situation, we still interpret
that as "OK, we'll assume the merged version is
good to use". */
case svn_wc_conflict_choose_merged:
{
install_from_abspath = merged_file
? merged_file
: local_abspath;
break;
}
case svn_wc_conflict_choose_postpone:
{
/* Assume conflict remains. */
return SVN_NO_ERROR;
}
default:
SVN_ERR_ASSERT(choice == svn_wc_conflict_choose_postpone);
}
if (install_from_abspath == NULL)
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("Conflict on '%s' could not be resolved "
"because the chosen version of the file "
"is not available."),
svn_dirent_local_style(local_abspath,
scratch_pool));
/* ### It would be nice if we could somehow pass RECORD_FILEINFO
as true in some easy cases. */
SVN_ERR(svn_wc__wq_build_file_install(&work_item,
db, local_abspath,
install_from_abspath,
FALSE /* use_commit_times */,
FALSE /* record_fileinfo */,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
if (remove_source)
{
SVN_ERR(svn_wc__wq_build_file_remove(&work_item,
db, local_abspath,
install_from_abspath,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
}
SVN_ERR(remove_artifact_file_if_exists(&work_item, found_artifact,
db, local_abspath,
their_old_abspath,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
SVN_ERR(remove_artifact_file_if_exists(&work_item, found_artifact,
db, local_abspath,
their_abspath,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
SVN_ERR(remove_artifact_file_if_exists(&work_item, found_artifact,
db, local_abspath,
mine_abspath,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
return SVN_NO_ERROR;
}
/* Set *DESC to a new description of the text conflict in
* CONFLICT_SKEL. If there is no text conflict in CONFLICT_SKEL, return
* an error.
*
* Use OPERATION and shallow copies of LEFT_VERSION and RIGHT_VERSION,
* rather than reading them from CONFLICT_SKEL. Use IS_BINARY and
* MIME_TYPE for the corresponding fields of *DESC.
*
* Allocate results in RESULT_POOL. SCRATCH_POOL is used for temporary
* allocations. */
static svn_error_t *
read_text_conflict_desc(svn_wc_conflict_description2_t **desc,
svn_wc__db_t *db,
const char *local_abspath,
const svn_skel_t *conflict_skel,
const char *mime_type,
svn_wc_operation_t operation,
const svn_wc_conflict_version_t *left_version,
const svn_wc_conflict_version_t *right_version,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
*desc = svn_wc_conflict_description_create_text2(local_abspath, result_pool);
(*desc)->mime_type = mime_type;
(*desc)->is_binary = mime_type ? svn_mime_type_is_binary(mime_type) : FALSE;
(*desc)->operation = operation;
(*desc)->src_left_version = left_version;
(*desc)->src_right_version = right_version;
SVN_ERR(svn_wc__conflict_read_text_conflict(&(*desc)->my_abspath,
&(*desc)->base_abspath,
&(*desc)->their_abspath,
db, local_abspath,
conflict_skel,
result_pool, scratch_pool));
(*desc)->merged_file = apr_pstrdup(result_pool, local_abspath);
return SVN_NO_ERROR;
}
/* Set *CONFLICT_DESC to a new description of the tree conflict in
* CONFLICT_SKEL. If there is no tree conflict in CONFLICT_SKEL, return
* an error.
*
* Use OPERATION and shallow copies of LEFT_VERSION and RIGHT_VERSION,
* rather than reading them from CONFLICT_SKEL.
*
* Allocate results in RESULT_POOL. SCRATCH_POOL is used for temporary
* allocations. */
static svn_error_t *
read_tree_conflict_desc(svn_wc_conflict_description2_t **desc,
svn_wc__db_t *db,
const char *local_abspath,
svn_node_kind_t node_kind,
const svn_skel_t *conflict_skel,
svn_wc_operation_t operation,
const svn_wc_conflict_version_t *left_version,
const svn_wc_conflict_version_t *right_version,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_node_kind_t local_kind;
svn_wc_conflict_reason_t reason;
svn_wc_conflict_action_t action;
SVN_ERR(svn_wc__conflict_read_tree_conflict(
&reason, &action, NULL,
db, local_abspath, conflict_skel, scratch_pool, scratch_pool));
if (reason == svn_wc_conflict_reason_missing)
local_kind = svn_node_none;
else if (reason == svn_wc_conflict_reason_unversioned ||
reason == svn_wc_conflict_reason_obstructed)
SVN_ERR(svn_io_check_path(local_abspath, &local_kind, scratch_pool));
else if (action == svn_wc_conflict_action_delete
&& left_version
&& (operation == svn_wc_operation_update
||operation == svn_wc_operation_switch)
&& (reason == svn_wc_conflict_reason_deleted
|| reason == svn_wc_conflict_reason_moved_away))
{
/* We have nothing locally to take the kind from */
local_kind = left_version->node_kind;
}
else
local_kind = node_kind;
*desc = svn_wc_conflict_description_create_tree2(local_abspath, local_kind,
operation,
left_version, right_version,
result_pool);
(*desc)->reason = reason;
(*desc)->action = action;
return SVN_NO_ERROR;
}
/* Forward definition */
static svn_error_t *
resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
svn_wc__db_t *db,
const char *local_abspath,
const svn_skel_t *conflict,
svn_wc_conflict_choice_t conflict_choice,
apr_hash_t *resolve_later,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool);
svn_error_t *
svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
const char *local_abspath,
svn_node_kind_t kind,
const svn_skel_t *conflict_skel,
const apr_array_header_t *merge_options,
svn_wc_conflict_resolver_func2_t resolver_func,
void *resolver_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_boolean_t text_conflicted;
svn_boolean_t prop_conflicted;
svn_boolean_t tree_conflicted;
svn_wc_operation_t operation;
const apr_array_header_t *locations;
const svn_wc_conflict_version_t *left_version = NULL;
const svn_wc_conflict_version_t *right_version = NULL;
SVN_ERR(svn_wc__conflict_read_info(&operation, &locations,
&text_conflicted, &prop_conflicted,
&tree_conflicted,
db, local_abspath, conflict_skel,
scratch_pool, scratch_pool));
if (locations && locations->nelts > 0)
left_version = APR_ARRAY_IDX(locations, 0, const svn_wc_conflict_version_t *);
if (locations && locations->nelts > 1)
right_version = APR_ARRAY_IDX(locations, 1, const svn_wc_conflict_version_t *);
/* Quick and dirty compatibility wrapper. My guess would be that most resolvers
would want to look at all properties at the same time.
### svn currently only invokes this from the merge code to collect the list of
### conflicted paths. Eventually this code will be the base for 'svn resolve'
### and at that time the test coverage will improve
*/
if (prop_conflicted)
{
apr_hash_t *old_props;
apr_hash_t *mine_props;
apr_hash_t *their_props;
apr_hash_t *old_their_props;
apr_hash_t *conflicted;
apr_pool_t *iterpool;
apr_hash_index_t *hi;
svn_boolean_t mark_resolved = TRUE;
SVN_ERR(svn_wc__conflict_read_prop_conflict(NULL,
&mine_props,
&old_their_props,
&their_props,
&conflicted,
db, local_abspath,
conflict_skel,
scratch_pool, scratch_pool));
if (operation == svn_wc_operation_merge)
SVN_ERR(svn_wc__db_read_pristine_props(&old_props, db, local_abspath,
scratch_pool, scratch_pool));
else
old_props = old_their_props;
iterpool = svn_pool_create(scratch_pool);
for (hi = apr_hash_first(scratch_pool, conflicted);
hi;
hi = apr_hash_next(hi))
{
const char *propname = apr_hash_this_key(hi);
svn_boolean_t conflict_remains = TRUE;
svn_pool_clear(iterpool);
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
SVN_ERR(generate_propconflict(&conflict_remains,
db, local_abspath, kind,
operation,
left_version,
right_version,
propname,
old_props
? svn_hash_gets(old_props, propname)
: NULL,
mine_props
? svn_hash_gets(mine_props, propname)
: NULL,
old_their_props
? svn_hash_gets(old_their_props, propname)
: NULL,
their_props
? svn_hash_gets(their_props, propname)
: NULL,
resolver_func, resolver_baton,
cancel_func, cancel_baton,
iterpool));
if (conflict_remains)
mark_resolved = FALSE;
}
if (mark_resolved)
{
SVN_ERR(svn_wc__mark_resolved_prop_conflicts(db, local_abspath,
scratch_pool));
}
svn_pool_destroy(iterpool);
}
if (text_conflicted)
{
svn_skel_t *work_items;
svn_boolean_t was_resolved;
svn_wc_conflict_description2_t *desc;
apr_hash_t *props;
svn_wc_conflict_result_t *result;
SVN_ERR(svn_wc__db_read_props(&props, db, local_abspath,
scratch_pool, scratch_pool));
SVN_ERR(read_text_conflict_desc(&desc,
db, local_abspath, conflict_skel,
svn_prop_get_value(props,
SVN_PROP_MIME_TYPE),
operation, left_version, right_version,
scratch_pool, scratch_pool));
work_items = NULL;
was_resolved = FALSE;
/* Give the conflict resolution callback a chance to clean
up the conflicts before we mark the file 'conflicted' */
SVN_ERR(resolver_func(&result, desc, resolver_baton, scratch_pool,
scratch_pool));
if (result == NULL)
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("Conflict callback violated API:"
" returned no results"));
SVN_ERR(build_text_conflict_resolve_items(&work_items, &was_resolved,
db, local_abspath,
conflict_skel, result->choice,
result->merged_file,
result->save_merged,
merge_options,
cancel_func, cancel_baton,
scratch_pool, scratch_pool));
if (result->choice != svn_wc_conflict_choose_postpone)
{
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
TRUE, FALSE, FALSE,
work_items, scratch_pool));
SVN_ERR(svn_wc__wq_run(db, local_abspath,
cancel_func, cancel_baton,
scratch_pool));
}
}
if (tree_conflicted)
{
svn_wc_conflict_result_t *result;
svn_wc_conflict_description2_t *desc;
svn_boolean_t resolved;
svn_node_kind_t node_kind;
SVN_ERR(svn_wc__db_read_kind(&node_kind, db, local_abspath, TRUE,
TRUE, FALSE, scratch_pool));
SVN_ERR(read_tree_conflict_desc(&desc,
db, local_abspath, node_kind,
conflict_skel,
operation, left_version, right_version,
scratch_pool, scratch_pool));
/* Tell the resolver func about this conflict. */
SVN_ERR(resolver_func(&result, desc, resolver_baton, scratch_pool,
scratch_pool));
if (result == NULL)
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("Conflict callback violated API:"
" returned no results"));
/* Pass retry hash to avoid erroring out on cases where update
can continue safely. ### Need notify handling */
if (result->choice != svn_wc_conflict_choose_postpone)
SVN_ERR(resolve_tree_conflict_on_node(&resolved,
db, local_abspath, conflict_skel,
result->choice,
apr_hash_make(scratch_pool),
NULL, NULL, /* ### notify */
cancel_func, cancel_baton,
scratch_pool));
}
return SVN_NO_ERROR;
}
/* Read all property conflicts contained in CONFLICT_SKEL into
* individual conflict descriptions, and append those descriptions
* to the CONFLICTS array. If there is no property conflict in
* CONFLICT_SKEL, return an error.
*
* If NOT create_tempfiles, always create a legacy property conflict
* descriptor.
*
* Use NODE_KIND, OPERATION and shallow copies of LEFT_VERSION and
* RIGHT_VERSION, rather than reading them from CONFLICT_SKEL.
*
* Allocate results in RESULT_POOL. SCRATCH_POOL is used for temporary
* allocations. */
static svn_error_t *
read_prop_conflict_descs(apr_array_header_t *conflicts,
svn_wc__db_t *db,
const char *local_abspath,
svn_skel_t *conflict_skel,
svn_boolean_t create_tempfiles,
svn_node_kind_t node_kind,
svn_wc_operation_t operation,
const svn_wc_conflict_version_t *left_version,
const svn_wc_conflict_version_t *right_version,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *prop_reject_abspath;
apr_hash_t *base_props;
apr_hash_t *my_props;
apr_hash_t *their_old_props;
apr_hash_t *their_props;
apr_hash_t *conflicted_props;
apr_hash_index_t *hi;
apr_pool_t *iterpool;
svn_boolean_t prop_conflicted;
SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, &prop_conflicted,
NULL, db, local_abspath, conflict_skel,
scratch_pool, scratch_pool));
if (!prop_conflicted)
return SVN_NO_ERROR;
SVN_ERR(svn_wc__conflict_read_prop_conflict(&prop_reject_abspath,
&my_props,
&their_old_props,
&their_props,
&conflicted_props,
db, local_abspath,
conflict_skel,
scratch_pool, scratch_pool));
prop_reject_abspath = apr_pstrdup(result_pool, prop_reject_abspath);
if (apr_hash_count(conflicted_props) == 0)
{
/* Legacy prop conflict with only a .reject file. */
svn_wc_conflict_description2_t *desc;
desc = svn_wc_conflict_description_create_prop2(local_abspath,
node_kind,
"", result_pool);
/* ### For property conflicts, cd2 stores prop_reject_abspath in
* ### their_abspath, and stores theirs_abspath in merged_file. */
desc->prop_reject_abspath = prop_reject_abspath; /* in result_pool */
desc->their_abspath = desc->prop_reject_abspath;
desc->operation = operation;
desc->src_left_version = left_version;
desc->src_right_version = right_version;
APR_ARRAY_PUSH(conflicts, svn_wc_conflict_description2_t *) = desc;
return SVN_NO_ERROR;
}
if (operation == svn_wc_operation_merge)
SVN_ERR(svn_wc__db_read_pristine_props(&base_props, db, local_abspath,
result_pool, scratch_pool));
else
base_props = NULL;
iterpool = svn_pool_create(scratch_pool);
for (hi = apr_hash_first(scratch_pool, conflicted_props);
hi;
hi = apr_hash_next(hi))
{
const char *propname = apr_hash_this_key(hi);
svn_string_t *old_value;
svn_string_t *my_value;
svn_string_t *their_value;
svn_wc_conflict_description2_t *desc;
svn_pool_clear(iterpool);
desc = svn_wc_conflict_description_create_prop2(local_abspath,
node_kind,
propname,
result_pool);
desc->operation = operation;
desc->src_left_version = left_version;
desc->src_right_version = right_version;
desc->property_name = apr_pstrdup(result_pool, propname);
my_value = svn_hash_gets(my_props, propname);
their_value = svn_hash_gets(their_props, propname);
old_value = svn_hash_gets(their_old_props, propname);
/* Compute the incoming side of the conflict ('action'). */
if (their_value == NULL)
desc->action = svn_wc_conflict_action_delete;
else if (old_value == NULL)
desc->action = svn_wc_conflict_action_add;
else
desc->action = svn_wc_conflict_action_edit;
/* Compute the local side of the conflict ('reason'). */
if (my_value == NULL)
desc->reason = svn_wc_conflict_reason_deleted;
else if (old_value == NULL)
desc->reason = svn_wc_conflict_reason_added;
else
desc->reason = svn_wc_conflict_reason_edited;
/* ### For property conflicts, cd2 stores prop_reject_abspath in
* ### their_abspath, and stores theirs_abspath in merged_file. */
desc->prop_reject_abspath = prop_reject_abspath; /* in result_pool */
desc->their_abspath = desc->prop_reject_abspath;
desc->prop_value_base = base_props ? svn_hash_gets(base_props, propname)
: desc->prop_value_incoming_old;
if (my_value)
{
svn_stream_t *s;
apr_size_t len;
if (create_tempfiles)
{
SVN_ERR(svn_stream_open_unique(&s, &desc->my_abspath, NULL,
svn_io_file_del_on_pool_cleanup,
result_pool, iterpool));
len = my_value->len;
SVN_ERR(svn_stream_write(s, my_value->data, &len));
SVN_ERR(svn_stream_close(s));
}
desc->prop_value_working = svn_string_dup(my_value, result_pool);
}
if (their_value)
{
svn_stream_t *s;
apr_size_t len;
/* ### For property conflicts, cd2 stores prop_reject_abspath in
* ### their_abspath, and stores theirs_abspath in merged_file. */
if (create_tempfiles)
{
SVN_ERR(svn_stream_open_unique(&s, &desc->merged_file, NULL,
svn_io_file_del_on_pool_cleanup,
result_pool, iterpool));
len = their_value->len;
SVN_ERR(svn_stream_write(s, their_value->data, &len));
SVN_ERR(svn_stream_close(s));
}
desc->prop_value_incoming_new = svn_string_dup(their_value, result_pool);
}
if (old_value)
{
svn_stream_t *s;
apr_size_t len;
if (create_tempfiles)
{
SVN_ERR(svn_stream_open_unique(&s, &desc->base_abspath, NULL,
svn_io_file_del_on_pool_cleanup,
result_pool, iterpool));
len = old_value->len;
SVN_ERR(svn_stream_write(s, old_value->data, &len));
SVN_ERR(svn_stream_close(s));
}
desc->prop_value_incoming_old = svn_string_dup(old_value, result_pool);
}
APR_ARRAY_PUSH(conflicts, svn_wc_conflict_description2_t *) = desc;
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__read_conflicts(const apr_array_header_t **conflicts,
svn_skel_t **conflict_skel,
svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t create_tempfiles,
svn_boolean_t only_tree_conflict,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_skel_t *the_conflict_skel;
apr_array_header_t *cflcts;
svn_boolean_t prop_conflicted;
svn_boolean_t text_conflicted;
svn_boolean_t tree_conflicted;
svn_wc_operation_t operation;
const apr_array_header_t *locations;
const svn_wc_conflict_version_t *left_version = NULL;
const svn_wc_conflict_version_t *right_version = NULL;
svn_node_kind_t node_kind;
apr_hash_t *props;
if (!conflict_skel)
conflict_skel = &the_conflict_skel;
SVN_ERR(svn_wc__db_read_conflict(conflict_skel, &node_kind, &props,
db, local_abspath,
(conflict_skel == &the_conflict_skel)
? scratch_pool
: result_pool,
scratch_pool));
if (!*conflict_skel)
{
/* Some callers expect not NULL */
*conflicts = apr_array_make(result_pool, 0,
sizeof(svn_wc_conflict_description2_t *));
return SVN_NO_ERROR;
}
SVN_ERR(svn_wc__conflict_read_info(&operation, &locations, &text_conflicted,
&prop_conflicted, &tree_conflicted,
db, local_abspath, *conflict_skel,
result_pool, scratch_pool));
cflcts = apr_array_make(result_pool, 4,
sizeof(svn_wc_conflict_description2_t *));
if (locations && locations->nelts > 0)
left_version = APR_ARRAY_IDX(locations, 0, const svn_wc_conflict_version_t *);
if (locations && locations->nelts > 1)
right_version = APR_ARRAY_IDX(locations, 1, const svn_wc_conflict_version_t *);
if (prop_conflicted && !only_tree_conflict)
{
SVN_ERR(read_prop_conflict_descs(cflcts,
db, local_abspath, *conflict_skel,
create_tempfiles, node_kind,
operation, left_version, right_version,
result_pool, scratch_pool));
}
if (text_conflicted && !only_tree_conflict)
{
svn_wc_conflict_description2_t *desc;
SVN_ERR(read_text_conflict_desc(&desc,
db, local_abspath, *conflict_skel,
svn_prop_get_value(props,
SVN_PROP_MIME_TYPE),
operation, left_version, right_version,
result_pool, scratch_pool));
APR_ARRAY_PUSH(cflcts, svn_wc_conflict_description2_t *) = desc;
}
if (tree_conflicted)
{
svn_wc_conflict_description2_t *desc;
SVN_ERR(read_tree_conflict_desc(&desc,
db, local_abspath, node_kind,
*conflict_skel,
operation, left_version, right_version,
result_pool, scratch_pool));
APR_ARRAY_PUSH(cflcts, const svn_wc_conflict_description2_t *) = desc;
}
*conflicts = cflcts;
return SVN_NO_ERROR;
}
/*** Resolving a conflict automatically ***/
/*
* Resolve the property conflicts found in DB/LOCAL_ABSPATH according
* to CONFLICT_CHOICE.
*
* It is not an error if there is no prop conflict. If a prop conflict
* existed and was resolved, set *DID_RESOLVE to TRUE, else set it to FALSE.
*
* Note: When there are no conflict markers on-disk to remove there is
* no existing text conflict (unless we are still in the process of
* creating the text conflict and we didn't register a marker file yet).
* In this case the database contains old information, which we should
* remove to avoid checking the next time. Resolving a property conflict
* by just removing the marker file is a fully supported scenario since
* Subversion 1.0.
*
* ### TODO [JAF] The '*_full' and '*_conflict' choices should differ.
* In my opinion, 'mine_full'/'theirs_full' should select
* the entire set of properties from 'mine' or 'theirs' respectively,
* while 'mine_conflict'/'theirs_conflict' should select just the
* properties that are in conflict. Or, '_full' should select the
* entire property whereas '_conflict' should do a text merge within
* each property, selecting hunks. Or all three kinds of behaviour
* should be available (full set of props, full value of conflicting
* props, or conflicting text hunks).
* ### BH: If we make *_full select the full set of properties, we should
* check if we shouldn't make it also select the full text for files.
*
* ### TODO [JAF] All this complexity should not be down here in libsvn_wc
* but in a layer above.
*
* ### TODO [JAF] Options for 'base' should be like options for 'mine' and
* for 'theirs' -- choose full set of props, full value of conflicting
* props, or conflicting text hunks.
*
*/
static svn_error_t *
resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
svn_wc__db_t *db,
const char *local_abspath,
svn_skel_t *conflicts,
const char *conflicted_propname,
svn_wc_conflict_choice_t conflict_choice,
const char *merged_file,
const svn_string_t *merged_value,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
const char *prop_reject_file;
apr_hash_t *mine_props;
apr_hash_t *their_old_props;
apr_hash_t *their_props;
apr_hash_t *conflicted_props;
apr_hash_t *old_props;
apr_hash_t *resolve_from = NULL;
svn_skel_t *work_items = NULL;
svn_wc_operation_t operation;
svn_boolean_t prop_conflicted;
apr_hash_t *actual_props;
svn_boolean_t resolved_all, resolved_all_prop;
*did_resolve = FALSE;
SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, &prop_conflicted,
NULL, db, local_abspath, conflicts,
scratch_pool, scratch_pool));
if (!prop_conflicted)
return SVN_NO_ERROR;
SVN_ERR(svn_wc__conflict_read_prop_conflict(&prop_reject_file,
&mine_props, &their_old_props,
&their_props, &conflicted_props,
db, local_abspath, conflicts,
scratch_pool, scratch_pool));
if (!conflicted_props)
{
/* We have a pre 1.8 property conflict. Just mark it resolved */
SVN_ERR(remove_artifact_file_if_exists(&work_items, did_resolve,
db, local_abspath, prop_reject_file,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, FALSE, TRUE, FALSE,
work_items, scratch_pool));
SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
scratch_pool));
return SVN_NO_ERROR;
}
if (conflicted_propname[0] != '\0'
&& !svn_hash_gets(conflicted_props, conflicted_propname))
{
return SVN_NO_ERROR; /* This property is not conflicted! */
}
if (operation == svn_wc_operation_merge)
SVN_ERR(svn_wc__db_read_pristine_props(&old_props, db, local_abspath,
scratch_pool, scratch_pool));
else
old_props = their_old_props;
SVN_ERR(svn_wc__db_read_props(&actual_props, db, local_abspath,
scratch_pool, scratch_pool));
/* We currently handle *_conflict as *_full as this argument is currently
always applied for all conflicts on a node at the same time. Giving
an error would break some tests that assumed that this would just
resolve property conflicts to working.
An alternative way to handle these conflicts would be to just copy all
property state from mine/theirs on the _full option instead of just the
conflicted properties. In some ways this feels like a sensible option as
that would take both properties and text from mine/theirs, but when not
both properties and text are conflicted we would fail in doing so.
*/
switch (conflict_choice)
{
case svn_wc_conflict_choose_base:
resolve_from = their_old_props ? their_old_props : old_props;
break;
case svn_wc_conflict_choose_mine_full:
case svn_wc_conflict_choose_mine_conflict:
resolve_from = mine_props;
break;
case svn_wc_conflict_choose_theirs_full:
case svn_wc_conflict_choose_theirs_conflict:
resolve_from = their_props;
break;
case svn_wc_conflict_choose_merged:
if ((merged_file || merged_value) && conflicted_propname[0] != '\0')
{
resolve_from = apr_hash_copy(scratch_pool, actual_props);
if (!merged_value)
{
svn_stream_t *stream;
svn_string_t *merged_propval;
SVN_ERR(svn_stream_open_readonly(&stream, merged_file,
scratch_pool, scratch_pool));
SVN_ERR(svn_string_from_stream(&merged_propval, stream,
scratch_pool, scratch_pool));
merged_value = merged_propval;
}
svn_hash_sets(resolve_from, conflicted_propname, merged_value);
}
else
resolve_from = NULL;
break;
default:
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Invalid 'conflict_result' argument"));
}
if (resolve_from)
{
apr_hash_index_t *hi;
apr_hash_t *apply_on_props;
if (conflicted_propname[0] == '\0')
{
/* Apply to all conflicted properties */
apply_on_props = conflicted_props;
}
else
{
/* Apply to a single property */
apply_on_props = apr_hash_make(scratch_pool);
svn_hash_sets(apply_on_props, conflicted_propname, "");
}
/* Apply the selected changes */
for (hi = apr_hash_first(scratch_pool, apply_on_props);
hi;
hi = apr_hash_next(hi))
{
const char *propname = apr_hash_this_key(hi);
svn_string_t *new_value = NULL;
new_value = svn_hash_gets(resolve_from, propname);
svn_hash_sets(actual_props, propname, new_value);
}
}
/*else the user accepted the properties as-is */
/* This function handles conflicted_propname "" as resolving
all property conflicts... Just what we need here */
SVN_ERR(svn_wc__conflict_skel_resolve(&resolved_all, conflicts,
db, local_abspath,
FALSE, conflicted_propname,
FALSE,
scratch_pool, scratch_pool));
if (!resolved_all)
{
/* Are there still property conflicts left? (or only...) */
SVN_ERR(svn_wc__conflict_read_info(NULL, NULL, NULL, &prop_conflicted,
NULL, db, local_abspath, conflicts,
scratch_pool, scratch_pool));
resolved_all_prop = (! prop_conflicted);
}
else
{
resolved_all_prop = TRUE;
conflicts = NULL;
}
if (resolved_all_prop)
{
/* Legacy behavior: Only report property conflicts as resolved when the
property reject file exists
If not the UI shows the conflict as already resolved
(and in this case we just remove the in-db conflict) */
SVN_ERR(remove_artifact_file_if_exists(&work_items, did_resolve,
db, local_abspath,
prop_reject_file,
scratch_pool, scratch_pool));
}
else
{
/* Create a new prej file, based on the remaining conflicts */
SVN_ERR(svn_wc__wq_build_prej_install(&work_items,
db, local_abspath,
scratch_pool, scratch_pool));
*did_resolve = TRUE; /* We resolved a property conflict */
}
/* This installs the updated conflict skel */
SVN_ERR(svn_wc__db_op_set_props(db, local_abspath, actual_props,
FALSE, conflicts, work_items,
scratch_pool));
if (resolved_all)
{
/* Remove the whole conflict. Should probably be integrated
into the op_set_props() call */
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
FALSE, TRUE, FALSE,
NULL, scratch_pool));
}
SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
scratch_pool));
return SVN_NO_ERROR;
}
/*
* Resolve the tree conflict found in DB/LOCAL_ABSPATH according to
* CONFLICT_CHOICE.
*
* It is not an error if there is no tree conflict. If a tree conflict
* existed and was resolved, set *DID_RESOLVE to TRUE, else set it to FALSE.
*
* It is not an error if there is no tree conflict.
*
* If the conflict can't be resolved yet because another tree conflict is
* blocking a storage location, store the tree conflict in the RESOLVE_LATER
* hash.
*/
static svn_error_t *
resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
svn_wc__db_t *db,
const char *local_abspath,
const svn_skel_t *conflicts,
svn_wc_conflict_choice_t conflict_choice,
apr_hash_t *resolve_later,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_wc_conflict_reason_t reason;
svn_wc_conflict_action_t action;
svn_wc_operation_t operation;
svn_boolean_t tree_conflicted;
const char *src_op_root_abspath;
*did_resolve = FALSE;
SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, NULL,
&tree_conflicted, db, local_abspath,
conflicts, scratch_pool, scratch_pool));
if (!tree_conflicted)
return SVN_NO_ERROR;
SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
&src_op_root_abspath,
db, local_abspath,
conflicts,
scratch_pool, scratch_pool));
if (operation == svn_wc_operation_update
|| operation == svn_wc_operation_switch)
{
svn_error_t *err;
if (reason == svn_wc_conflict_reason_deleted ||
reason == svn_wc_conflict_reason_replaced)
{
if (conflict_choice == svn_wc_conflict_choose_merged)
{
/* Break moves for any children moved out of this directory,
* and leave this directory deleted. */
if (action != svn_wc_conflict_action_delete)
{
SVN_ERR(svn_wc__db_op_break_moved_away(
db, local_abspath, src_op_root_abspath, TRUE,
notify_func, notify_baton,
scratch_pool));
*did_resolve = TRUE;
return SVN_NO_ERROR; /* Marked resolved by function*/
}
/* else # The move is/moves are already broken */
*did_resolve = TRUE;
}
else if (conflict_choice == svn_wc_conflict_choose_mine_conflict)
{
svn_skel_t *new_conflicts;
/* Raise moved-away conflicts on any children moved out of
* this directory, and leave this directory as-is.
*
* The newly conflicted moved-away children will be updated
* if they are resolved with 'mine_conflict' as well. */
err = svn_wc__db_op_raise_moved_away(
db, local_abspath, notify_func, notify_baton,
scratch_pool);
if (err)
{
const char *dup_abspath;
if (!resolve_later
|| err->apr_err != SVN_ERR_WC_OBSTRUCTED_UPDATE)
return svn_error_trace(err);
svn_error_clear(err);
dup_abspath = apr_pstrdup(apr_hash_pool_get(resolve_later),
local_abspath);
svn_hash_sets(resolve_later, dup_abspath, dup_abspath);
return SVN_NO_ERROR; /* Retry after other conflicts */
}
/* We might now have a moved-away on *this* path, let's
try to resolve that directly if that is the case */
SVN_ERR(svn_wc__db_read_conflict(&new_conflicts, NULL, NULL,
db, local_abspath,
scratch_pool, scratch_pool));
if (new_conflicts)
SVN_ERR(svn_wc__conflict_read_info(NULL, NULL, NULL, NULL,
&tree_conflicted,
db, local_abspath,
new_conflicts,
scratch_pool,
scratch_pool));
if (!new_conflicts || !tree_conflicted)
{
/* TC is marked resolved by calling
svn_wc__db_resolve_delete_raise_moved_away */
*did_resolve = TRUE;
return SVN_NO_ERROR;
}
SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
&src_op_root_abspath,
db, local_abspath,
new_conflicts,
scratch_pool,
scratch_pool));
if (reason != svn_wc_conflict_reason_moved_away)
{
*did_resolve = TRUE;
return SVN_NO_ERROR; /* We fixed one, but... */
}
conflicts = new_conflicts;
/* Fall through in moved_away handling */
}
else
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL,
_("Tree conflict can only be resolved to "
"'working' or 'mine-conflict' state; "
"'%s' not resolved"),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
if (reason == svn_wc_conflict_reason_moved_away
&& action == svn_wc_conflict_action_edit)
{
/* After updates, we can resolve local moved-away
* vs. any incoming change, either by updating the
* moved-away node (mine-conflict) or by breaking the
* move (theirs-conflict). */
if (conflict_choice == svn_wc_conflict_choose_mine_conflict)
{
err = svn_wc__db_update_moved_away_conflict_victim(
db, local_abspath, src_op_root_abspath,
operation, action, reason,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool);
if (err)
{
const char *dup_abspath;
if (!resolve_later
|| err->apr_err != SVN_ERR_WC_OBSTRUCTED_UPDATE)
return svn_error_trace(err);
svn_error_clear(err);
dup_abspath = apr_pstrdup(apr_hash_pool_get(resolve_later),
local_abspath);
svn_hash_sets(resolve_later, dup_abspath, dup_abspath);
return SVN_NO_ERROR; /* Retry after other conflicts */
}
else
*did_resolve = TRUE;
}
else if (conflict_choice == svn_wc_conflict_choose_merged)
{
/* We must break the move if the user accepts the current
* working copy state instead of updating the move.
* Else the move would be left in an invalid state. */
SVN_ERR(svn_wc__db_op_break_moved_away(db, local_abspath,
src_op_root_abspath, TRUE,
notify_func, notify_baton,
scratch_pool));
*did_resolve = TRUE;
return SVN_NO_ERROR; /* Conflict is marked resolved */
}
else
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL,
_("Tree conflict can only be resolved to "
"'working' or 'mine-conflict' state; "
"'%s' not resolved"),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
else if (reason == svn_wc_conflict_reason_moved_away
&& action != svn_wc_conflict_action_edit)
{
/* action added is impossible, because that would imply that
something was added, but before that already moved...
(which would imply a replace) */
SVN_ERR_ASSERT(action == svn_wc_conflict_action_delete
|| action == svn_wc_conflict_action_replace);
if (conflict_choice == svn_wc_conflict_choose_merged)
{
/* Whatever was moved is removed at its original location by the
update. That must also remove the recording of the move, so
we don't have to do anything here. */
*did_resolve = TRUE;
}
else if (conflict_choice == svn_wc_conflict_choose_mine_conflict)
{
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL,
_("Tree conflict can only be "
"resolved to 'working' state; "
"'%s' is no longer moved"),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
}
}
if (! *did_resolve)
{
if (conflict_choice != svn_wc_conflict_choose_merged)
{
/* For other tree conflicts, there is no way to pick
* theirs-full or mine-full, etc. Throw an error if the
* user expects us to be smarter than we really are. */
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL,
_("Tree conflict can only be "
"resolved to 'working' state; "
"'%s' not resolved"),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
else
*did_resolve = TRUE;
}
SVN_ERR_ASSERT(*did_resolve);
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, FALSE, FALSE, TRUE,
NULL, scratch_pool));
SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
scratch_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__mark_resolved_text_conflict(svn_wc__db_t *db,
const char *local_abspath,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_skel_t *work_items;
svn_skel_t *conflict;
SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
db, local_abspath,
scratch_pool, scratch_pool));
if (!conflict)
return SVN_NO_ERROR;
SVN_ERR(build_text_conflict_resolve_items(&work_items, NULL,
db, local_abspath, conflict,
svn_wc_conflict_choose_merged,
NULL, FALSE, NULL,
cancel_func, cancel_baton,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, TRUE, FALSE, FALSE,
work_items, scratch_pool));
return svn_error_trace(svn_wc__wq_run(db, local_abspath,
cancel_func, cancel_baton,
scratch_pool));
}
svn_error_t *
svn_wc__mark_resolved_prop_conflicts(svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
svn_boolean_t ignored_result;
svn_skel_t *conflicts;
SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL,
db, local_abspath,
scratch_pool, scratch_pool));
if (!conflicts)
return SVN_NO_ERROR;
return svn_error_trace(resolve_prop_conflict_on_node(
&ignored_result,
db, local_abspath, conflicts, "",
svn_wc_conflict_choose_merged,
NULL, NULL,
NULL, NULL,
scratch_pool));
}
/* Baton for conflict_status_walker */
struct conflict_status_walker_baton
{
svn_wc__db_t *db;
svn_boolean_t resolve_text;
const char *resolve_prop;
svn_boolean_t resolve_tree;
svn_wc_conflict_choice_t conflict_choice;
svn_wc_conflict_resolver_func2_t conflict_func;
void *conflict_baton;
svn_cancel_func_t cancel_func;
void *cancel_baton;
svn_wc_notify_func2_t notify_func;
void *notify_baton;
svn_boolean_t resolved_one;
apr_hash_t *resolve_later;
};
/* Implements svn_wc_notify_func2_t to collect new conflicts caused by
resolving a tree conflict. */
static void
tree_conflict_collector(void *baton,
const svn_wc_notify_t *notify,
apr_pool_t *pool)
{
struct conflict_status_walker_baton *cswb = baton;
if (cswb->notify_func)
cswb->notify_func(cswb->notify_baton, notify, pool);
if (cswb->resolve_later
&& (notify->action == svn_wc_notify_tree_conflict
|| notify->prop_state == svn_wc_notify_state_conflicted
|| notify->content_state == svn_wc_notify_state_conflicted))
{
if (!svn_hash_gets(cswb->resolve_later, notify->path))
{
const char *dup_path;
dup_path = apr_pstrdup(apr_hash_pool_get(cswb->resolve_later),
notify->path);
svn_hash_sets(cswb->resolve_later, dup_path, dup_path);
}
}
}
/* Implements svn_wc_status4_t to walk all conflicts to resolve.
*/
static svn_error_t *
conflict_status_walker(void *baton,
const char *local_abspath,
const svn_wc_status3_t *status,
apr_pool_t *scratch_pool)
{
struct conflict_status_walker_baton *cswb = baton;
svn_wc__db_t *db = cswb->db;
const apr_array_header_t *conflicts;
apr_pool_t *iterpool;
int i;
svn_boolean_t resolved = FALSE;
svn_skel_t *conflict;
if (!status->conflicted)
return SVN_NO_ERROR;
iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_wc__read_conflicts(&conflicts, &conflict,
db, local_abspath,
(cswb->conflict_func != NULL) /* tmp files */,
FALSE /* only tree conflicts */,
scratch_pool, iterpool));
for (i = 0; i < conflicts->nelts; i++)
{
const svn_wc_conflict_description2_t *cd;
svn_boolean_t did_resolve;
svn_wc_conflict_choice_t my_choice = cswb->conflict_choice;
svn_wc_conflict_result_t *result = NULL;
svn_skel_t *work_items;
cd = APR_ARRAY_IDX(conflicts, i, const svn_wc_conflict_description2_t *);
if ((cd->kind == svn_wc_conflict_kind_property
&& (!cswb->resolve_prop
|| (*cswb->resolve_prop != '\0'
&& strcmp(cswb->resolve_prop, cd->property_name) != 0)))
|| (cd->kind == svn_wc_conflict_kind_text && !cswb->resolve_text)
|| (cd->kind == svn_wc_conflict_kind_tree && !cswb->resolve_tree))
{
continue; /* Easy out. Don't call resolver func and ignore result */
}
svn_pool_clear(iterpool);
if (my_choice == svn_wc_conflict_choose_unspecified)
{
if (!cswb->conflict_func)
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("No conflict-callback and no "
"pre-defined conflict-choice provided"));
SVN_ERR(cswb->conflict_func(&result, cd, cswb->conflict_baton,
iterpool, iterpool));
my_choice = result->choice;
}
if (my_choice == svn_wc_conflict_choose_postpone)
continue;
switch (cd->kind)
{
case svn_wc_conflict_kind_tree:
SVN_ERR(resolve_tree_conflict_on_node(&did_resolve,
db,
local_abspath, conflict,
my_choice,
cswb->resolve_later,
tree_conflict_collector,
cswb,
cswb->cancel_func,
cswb->cancel_baton,
iterpool));
if (did_resolve)
resolved = TRUE;
break;
case svn_wc_conflict_kind_text:
SVN_ERR(build_text_conflict_resolve_items(
&work_items,
&resolved,
db, local_abspath, conflict,
my_choice,
result ? result->merged_file
: NULL,
result ? result->save_merged
: FALSE,
NULL /* merge_options */,
cswb->cancel_func,
cswb->cancel_baton,
iterpool, iterpool));
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
TRUE, FALSE, FALSE,
work_items, iterpool));
SVN_ERR(svn_wc__wq_run(db, local_abspath,
cswb->cancel_func, cswb->cancel_baton,
iterpool));
break;
case svn_wc_conflict_kind_property:
SVN_ERR(resolve_prop_conflict_on_node(&did_resolve,
db,
local_abspath,
conflict,
cd->property_name,
my_choice,
result
? result->merged_file
: NULL,
result
? result->merged_value
: NULL,
cswb->cancel_func,
cswb->cancel_baton,
iterpool));
if (did_resolve)
resolved = TRUE;
break;
default:
/* We can't resolve other conflict types */
break;
}
}
/* Notify */
if (cswb->notify_func && resolved)
cswb->notify_func(cswb->notify_baton,
svn_wc_create_notify(local_abspath,
svn_wc_notify_resolved,
iterpool),
iterpool);
if (resolved)
cswb->resolved_one = TRUE;
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__resolve_conflicts(svn_wc_context_t *wc_ctx,
const char *local_abspath,
svn_depth_t depth,
svn_boolean_t resolve_text,
const char *resolve_prop,
svn_boolean_t resolve_tree,
svn_wc_conflict_choice_t conflict_choice,
svn_wc_conflict_resolver_func2_t conflict_func,
void *conflict_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool)
{
svn_node_kind_t kind;
svn_boolean_t conflicted;
struct conflict_status_walker_baton cswb;
apr_pool_t *iterpool = NULL;
svn_error_t *err;
/* ### Just a versioned check? */
/* Conflicted is set to allow invoking on actual only nodes */
SVN_ERR(svn_wc__db_read_info(NULL, &kind, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, &conflicted,
NULL, NULL, NULL, NULL, NULL, NULL,
wc_ctx->db, local_abspath,
scratch_pool, scratch_pool));
/* When the implementation still used the entry walker, depth
unknown was translated to infinity. */
if (kind != svn_node_dir)
depth = svn_depth_empty;
else if (depth == svn_depth_unknown)
depth = svn_depth_infinity;
cswb.db = wc_ctx->db;
cswb.resolve_text = resolve_text;
cswb.resolve_prop = resolve_prop;
cswb.resolve_tree = resolve_tree;
cswb.conflict_choice = conflict_choice;
cswb.conflict_func = conflict_func;
cswb.conflict_baton = conflict_baton;
cswb.cancel_func = cancel_func;
cswb.cancel_baton = cancel_baton;
cswb.notify_func = notify_func;
cswb.notify_baton = notify_baton;
cswb.resolved_one = FALSE;
cswb.resolve_later = (depth != svn_depth_empty)
? apr_hash_make(scratch_pool)
: NULL;
if (notify_func)
notify_func(notify_baton,
svn_wc_create_notify(local_abspath,
svn_wc_notify_conflict_resolver_starting,
scratch_pool),
scratch_pool);
err = svn_wc_walk_status(wc_ctx,
local_abspath,
depth,
FALSE /* get_all */,
FALSE /* no_ignore */,
TRUE /* ignore_text_mods */,
NULL /* ignore_patterns */,
conflict_status_walker, &cswb,
cancel_func, cancel_baton,
scratch_pool);
/* If we got new tree conflicts (or delayed conflicts) during the initial
walk, we now walk them one by one as closure. */
while (!err && cswb.resolve_later && apr_hash_count(cswb.resolve_later))
{
apr_hash_index_t *hi;
svn_wc_status3_t *status = NULL;
const char *tc_abspath = NULL;
if (iterpool)
svn_pool_clear(iterpool);
else
iterpool = svn_pool_create(scratch_pool);
hi = apr_hash_first(scratch_pool, cswb.resolve_later);
cswb.resolve_later = apr_hash_make(scratch_pool);
cswb.resolved_one = FALSE;
for (; hi && !err; hi = apr_hash_next(hi))
{
const char *relpath;
svn_pool_clear(iterpool);
tc_abspath = apr_hash_this_key(hi);
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
relpath = svn_dirent_skip_ancestor(local_abspath,
tc_abspath);
if (!relpath
|| (depth >= svn_depth_empty
&& depth < svn_depth_infinity
&& strchr(relpath, '/')))
{
continue;
}
SVN_ERR(svn_wc_status3(&status, wc_ctx, tc_abspath,
iterpool, iterpool));
if (depth == svn_depth_files
&& status->kind == svn_node_dir)
continue;
err = svn_error_trace(conflict_status_walker(&cswb, tc_abspath,
status, scratch_pool));
}
/* None of the remaining conflicts got resolved, and non did provide
an error...
We can fix that if we disable the 'resolve_later' option...
*/
if (!cswb.resolved_one && !err && tc_abspath
&& apr_hash_count(cswb.resolve_later))
{
/* Run the last resolve operation again. We still have status
and tc_abspath for that one. */
cswb.resolve_later = NULL; /* Produce proper error! */
/* Recreate the error */
err = svn_error_trace(conflict_status_walker(&cswb, tc_abspath,
status, scratch_pool));
SVN_ERR_ASSERT(err != NULL);
err = svn_error_createf(
SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, err,
_("Unable to resolve pending conflict on '%s'"),
svn_dirent_local_style(tc_abspath, scratch_pool));
break;
}
}
if (iterpool)
svn_pool_destroy(iterpool);
if (err && err->apr_err != SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE)
err = svn_error_createf(
SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, err,
_("Unable to resolve conflicts on '%s'"),
svn_dirent_local_style(local_abspath, scratch_pool));
SVN_ERR(err);
if (notify_func)
notify_func(notify_baton,
svn_wc_create_notify(local_abspath,
svn_wc_notify_conflict_resolver_done,
scratch_pool),
scratch_pool);
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc_resolved_conflict5(svn_wc_context_t *wc_ctx,
const char *local_abspath,
svn_depth_t depth,
svn_boolean_t resolve_text,
const char *resolve_prop,
svn_boolean_t resolve_tree,
svn_wc_conflict_choice_t conflict_choice,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool)
{
return svn_error_trace(svn_wc__resolve_conflicts(wc_ctx, local_abspath,
depth, resolve_text,
resolve_prop, resolve_tree,
conflict_choice,
NULL, NULL,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool));
}
/* Constructor for the result-structure returned by conflict callbacks. */
svn_wc_conflict_result_t *
svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice,
const char *merged_file,
apr_pool_t *pool)
{
svn_wc_conflict_result_t *result = apr_pcalloc(pool, sizeof(*result));
result->choice = choice;
result->merged_file = apr_pstrdup(pool, merged_file);
result->save_merged = FALSE;
/* If we add more fields to svn_wc_conflict_result_t, add them here. */
return result;
}
Index: stable/11/contrib/subversion/subversion/libsvn_wc/update_editor.c
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_wc/update_editor.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_wc/update_editor.c (revision 309511)
@@ -1,5605 +1,5628 @@
/*
* update_editor.c : main editor for checkouts and updates
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <stdlib.h>
#include <string.h>
#include <apr_pools.h>
#include <apr_hash.h>
#include <apr_md5.h>
#include <apr_tables.h>
#include <apr_strings.h>
#include "svn_types.h"
#include "svn_pools.h"
#include "svn_hash.h"
#include "svn_string.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_error.h"
#include "svn_io.h"
#include "svn_private_config.h"
#include "svn_time.h"
#include "wc.h"
#include "adm_files.h"
#include "conflicts.h"
#include "translate.h"
#include "workqueue.h"
#include "private/svn_subr_private.h"
#include "private/svn_wc_private.h"
#include "private/svn_editor.h"
/* Checks whether a svn_wc__db_status_t indicates whether a node is
present in a working copy. Used by the editor implementation */
#define IS_NODE_PRESENT(status) \
((status) != svn_wc__db_status_server_excluded &&\
(status) != svn_wc__db_status_excluded && \
(status) != svn_wc__db_status_not_present)
static svn_error_t *
path_join_under_root(const char **result_path,
const char *base_path,
const char *add_path,
apr_pool_t *result_pool);
/*
* This code handles "checkout" and "update" and "switch".
* A checkout is similar to an update that is only adding new items.
*
* The intended behaviour of "update" and "switch", focusing on the checks
* to be made before applying a change, is:
*
* For each incoming change:
* if target is already in conflict or obstructed:
* skip this change
* else
* if this action will cause a tree conflict:
* record the tree conflict
* skip this change
* else:
* make this change
*
* In more detail:
*
* For each incoming change:
*
* 1. if # Incoming change is inside an item already in conflict:
* a. tree/text/prop change to node beneath tree-conflicted dir
* then # Skip all changes in this conflicted subtree [*1]:
* do not update the Base nor the Working
* notify "skipped because already in conflict" just once
* for the whole conflicted subtree
*
* if # Incoming change affects an item already in conflict:
* b. tree/text/prop change to tree-conflicted dir/file, or
* c. tree change to a text/prop-conflicted file/dir, or
* d. text/prop change to a text/prop-conflicted file/dir [*2], or
* e. tree change to a dir tree containing any conflicts,
* then # Skip this change [*1]:
* do not update the Base nor the Working
* notify "skipped because already in conflict"
*
* 2. if # Incoming change affects an item that's "obstructed":
* a. on-disk node kind doesn't match recorded Working node kind
* (including an absence/presence mis-match),
* then # Skip this change [*1]:
* do not update the Base nor the Working
* notify "skipped because obstructed"
*
* 3. if # Incoming change raises a tree conflict:
* a. tree/text/prop change to node beneath sched-delete dir, or
* b. tree/text/prop change to sched-delete dir/file, or
* c. text/prop change to tree-scheduled dir/file,
* then # Skip this change:
* do not update the Base nor the Working [*3]
* notify "tree conflict"
*
* 4. Apply the change:
* update the Base
* update the Working, possibly raising text/prop conflicts
* notify
*
* Notes:
*
* "Tree change" here refers to an add or delete of the target node,
* including the add or delete part of a copy or move or rename.
*
* [*1] We should skip changes to an entire node, as the base revision number
* applies to the entire node. Not sure how this affects attempts to
* handle text and prop changes separately.
*
* [*2] Details of which combinations of property and text changes conflict
* are not specified here.
*
* [*3] For now, we skip the update, and require the user to:
* - Modify the WC to be compatible with the incoming change;
* - Mark the conflict as resolved;
* - Repeat the update.
* Ideally, it would be possible to resolve any conflict without
* repeating the update. To achieve this, we would have to store the
* necessary data at conflict detection time, and delay the update of
* the Base until the time of resolving.
*/
/*** batons ***/
struct edit_baton
{
/* For updates, the "destination" of the edit is ANCHOR_ABSPATH, the
directory containing TARGET_ABSPATH. If ANCHOR_ABSPATH itself is the
target, the values are identical.
TARGET_BASENAME is the name of TARGET_ABSPATH in ANCHOR_ABSPATH, or "" if
ANCHOR_ABSPATH is the target */
const char *target_basename;
/* Absolute variants of ANCHOR and TARGET */
const char *anchor_abspath;
const char *target_abspath;
/* The DB handle for managing the working copy state. */
svn_wc__db_t *db;
/* Array of file extension patterns to preserve as extensions in
generated conflict files. */
const apr_array_header_t *ext_patterns;
/* Hash mapping const char * absolute working copy paths to depth-first
ordered arrays of svn_prop_inherited_item_t * structures representing
the properties inherited by the base node at that working copy path.
May be NULL. */
apr_hash_t *wcroot_iprops;
/* The revision we're targeting...or something like that. This
starts off as a pointer to the revision to which we are updating,
or SVN_INVALID_REVNUM, but by the end of the edit, should be
pointing to the final revision. */
svn_revnum_t *target_revision;
/* The requested depth of this edit. */
svn_depth_t requested_depth;
/* Is the requested depth merely an operational limitation, or is
also the new sticky ambient depth of the update target? */
svn_boolean_t depth_is_sticky;
/* Need to know if the user wants us to overwrite the 'now' times on
edited/added files with the last-commit-time. */
svn_boolean_t use_commit_times;
/* Was the root actually opened (was this a non-empty edit)? */
svn_boolean_t root_opened;
/* Was the update-target deleted? This is a special situation. */
svn_boolean_t target_deleted;
/* Allow unversioned obstructions when adding a path. */
svn_boolean_t allow_unver_obstructions;
/* Handle local additions as modifications of new nodes */
svn_boolean_t adds_as_modification;
/* If set, we check out into an empty directory. This allows for a number
of conflict checks to be omitted. */
svn_boolean_t clean_checkout;
/* If this is a 'switch' operation, the new relpath of target_abspath,
else NULL. */
const char *switch_repos_relpath;
/* The URL to the root of the repository. */
const char *repos_root;
/* The UUID of the repos, or NULL. */
const char *repos_uuid;
/* External diff3 to use for merges (can be null, in which case
internal merge code is used). */
const char *diff3_cmd;
/* Externals handler */
svn_wc_external_update_t external_func;
void *external_baton;
/* This editor sends back notifications as it edits. */
svn_wc_notify_func2_t notify_func;
void *notify_baton;
/* This editor is normally wrapped in a cancellation editor anyway,
so it doesn't bother to check for cancellation itself. However,
it needs a cancel_func and cancel_baton available to pass to
long-running functions. */
svn_cancel_func_t cancel_func;
void *cancel_baton;
/* This editor will invoke a interactive conflict-resolution
callback, if available. */
svn_wc_conflict_resolver_func2_t conflict_func;
void *conflict_baton;
/* Subtrees that were skipped during the edit, and therefore shouldn't
have their revision/url info updated at the end. If a path is a
directory, its descendants will also be skipped. The keys are paths
relative to the working copy root and the values unspecified. */
apr_hash_t *skipped_trees;
/* A mapping from const char * repos_relpaths to the apr_hash_t * instances
returned from fetch_dirents_func for that repos_relpath. These
are used to avoid issue #3569 in specific update scenarios where a
restricted depth is used. */
apr_hash_t *dir_dirents;
/* Absolute path of the working copy root or NULL if not initialized yet */
const char *wcroot_abspath;
/* After closing the root directory a copy of its edited value */
svn_boolean_t edited;
apr_pool_t *pool;
};
/* Record in the edit baton EB that LOCAL_ABSPATH's base version is not being
* updated.
*
* Add to EB->skipped_trees a copy (allocated in EB->pool) of the string
* LOCAL_ABSPATH.
*/
static svn_error_t *
remember_skipped_tree(struct edit_baton *eb,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
svn_hash_sets(eb->skipped_trees,
apr_pstrdup(eb->pool,
svn_dirent_skip_ancestor(eb->wcroot_abspath,
local_abspath)),
(void *)1);
return SVN_NO_ERROR;
}
/* Per directory baton. Lives in its own subpool of the parent directory
or of the edit baton if there is no parent directory */
struct dir_baton
{
/* Basename of this directory. */
const char *name;
/* Absolute path of this directory */
const char *local_abspath;
/* The repository relative path this directory will correspond to. */
const char *new_repos_relpath;
/* The revision of the directory before updating */
svn_revnum_t old_revision;
/* The repos_relpath before updating/switching */
const char *old_repos_relpath;
/* The global edit baton. */
struct edit_baton *edit_baton;
/* Baton for this directory's parent, or NULL if this is the root
directory. */
struct dir_baton *parent_baton;
/* Set if updates to this directory are skipped */
svn_boolean_t skip_this;
/* Set if there was a previous notification for this directory */
svn_boolean_t already_notified;
/* Set if this directory is being added during this editor drive. */
svn_boolean_t adding_dir;
/* Set on a node and its descendants are not present in the working copy
but should still be updated (not skipped). These nodes should all be
marked as deleted. */
svn_boolean_t shadowed;
/* Set on a node when the existing node is obstructed, and the edit operation
continues as semi-shadowed update */
svn_boolean_t edit_obstructed;
/* The (new) changed_* information, cached to avoid retrieving it later */
svn_revnum_t changed_rev;
apr_time_t changed_date;
const char *changed_author;
/* If not NULL, contains a mapping of const char* basenames of children that
have been deleted to their svn_skel_t* tree conflicts.
We store this hash to allow replacements to continue under a just
installed tree conflict.
The add after the delete will then update the tree conflicts information
and reinstall it. */
apr_hash_t *deletion_conflicts;
/* A hash of file names (only the hash key matters) seen by add_file and
add_directory and not yet added to the database, mapping to a const
char * node kind (via svn_node_kind_to_word(). */
apr_hash_t *not_present_nodes;
/* Set if an unversioned dir of the same name already existed in
this directory. */
svn_boolean_t obstruction_found;
/* Set if a dir of the same name already exists and is
scheduled for addition without history. */
svn_boolean_t add_existed;
/* An array of svn_prop_t structures, representing all the property
changes to be applied to this directory. */
apr_array_header_t *propchanges;
/* A boolean indicating whether this node or one of its children has
received any 'real' changes. Used to avoid tree conflicts for simple
entryprop changes, like lock management */
svn_boolean_t edited;
/* The tree conflict to install once the node is really edited */
svn_skel_t *edit_conflict;
/* The bump information for this directory. */
struct bump_dir_info *bump_info;
/* The depth of the directory in the wc (or inferred if added). Not
used for filtering; we have a separate wrapping editor for that. */
svn_depth_t ambient_depth;
/* Was the directory marked as incomplete before the update?
(In other words, are we resuming an interrupted update?)
If WAS_INCOMPLETE is set to TRUE we expect to receive all child nodes
and properties for/of the directory. If WAS_INCOMPLETE is FALSE then
we only receive the changes in/for children and properties.*/
svn_boolean_t was_incomplete;
/* The pool in which this baton itself is allocated. */
apr_pool_t *pool;
/* how many nodes are referring to baton? */
int ref_count;
};
struct handler_baton
{
svn_txdelta_window_handler_t apply_handler;
void *apply_baton;
apr_pool_t *pool;
struct file_baton *fb;
/* Where we are assembling the new file. */
svn_wc__db_install_data_t *install_data;
/* The expected source checksum of the text source or NULL if no base
checksum is available (MD5 if the server provides a checksum, SHA1 if
the server doesn't) */
svn_checksum_t *expected_source_checksum;
/* Why two checksums?
The editor currently provides an md5 which we use to detect corruption
during transmission. We use the sha1 inside libsvn_wc both for pristine
handling and corruption detection. In the future, the editor will also
provide a sha1, so we may not have to calculate both, but for the time
being, that's the way it is. */
/* The calculated checksum of the text source or NULL if the actual
checksum is not being calculated. The checksum kind is identical to the
kind of expected_source_checksum. */
svn_checksum_t *actual_source_checksum;
/* The stream used to calculate the source checksums */
svn_stream_t *source_checksum_stream;
/* A calculated MD5 digest of NEW_TEXT_BASE_TMP_ABSPATH.
This is initialized to all zeroes when the baton is created, then
populated with the MD5 digest of the resultant fulltext after the
last window is handled by the handler returned from
apply_textdelta(). */
unsigned char new_text_base_md5_digest[APR_MD5_DIGESTSIZE];
/* A calculated SHA-1 of NEW_TEXT_BASE_TMP_ABSPATH, which we'll use for
eventually writing the pristine. */
svn_checksum_t * new_text_base_sha1_checksum;
};
/* Get an empty file in the temporary area for WRI_ABSPATH. The file will
not be set for automatic deletion, and the name will be returned in
TMP_FILENAME.
This implementation creates a new empty file with a unique name.
### This is inefficient for callers that just want an empty file to read
### from. There could be (and there used to be) a permanent, shared
### empty file for this purpose.
### This is inefficient for callers that just want to reserve a unique
### file name to create later. A better way may not be readily available.
*/
static svn_error_t *
get_empty_tmp_file(const char **tmp_filename,
svn_wc__db_t *db,
const char *wri_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *temp_dir_abspath;
SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir_abspath, db, wri_abspath,
scratch_pool, scratch_pool));
SVN_ERR(svn_io_open_unique_file3(NULL, tmp_filename, temp_dir_abspath,
svn_io_file_del_none,
scratch_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* An APR pool cleanup handler. This runs the working queue for an
editor baton. */
static apr_status_t
cleanup_edit_baton(void *edit_baton)
{
struct edit_baton *eb = edit_baton;
svn_error_t *err;
apr_pool_t *pool = apr_pool_parent_get(eb->pool);
err = svn_wc__wq_run(eb->db, eb->wcroot_abspath,
NULL /* cancel_func */, NULL /* cancel_baton */,
pool);
if (err)
{
apr_status_t apr_err = err->apr_err;
svn_error_clear(err);
return apr_err;
}
return APR_SUCCESS;
}
/* Calculate the new repos_relpath for a directory or file */
static svn_error_t *
calculate_repos_relpath(const char **new_repos_relpath,
const char *local_abspath,
const char *old_repos_relpath,
struct edit_baton *eb,
struct dir_baton *pb,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *name = svn_dirent_basename(local_abspath, NULL);
/* Figure out the new_repos_relpath for this directory. */
if (eb->switch_repos_relpath)
{
/* Handle switches... */
if (pb == NULL)
{
if (*eb->target_basename == '\0')
{
/* No parent baton and target_basename=="" means that we are
the target of the switch. Thus, our new_repos_relpath will be
the switch_repos_relpath. */
*new_repos_relpath = eb->switch_repos_relpath;
}
else
{
/* This node is NOT the target of the switch (one of our
children is the target); therefore, it must already exist.
Get its old REPOS_RELPATH, as it won't be changing. */
*new_repos_relpath = apr_pstrdup(result_pool, old_repos_relpath);
}
}
else
{
/* This directory is *not* the root (has a parent). If there is
no grandparent, then we may have anchored at the parent,
and self is the target. If we match the target, then set
new_repos_relpath to the switch_repos_relpath.
Otherwise, we simply extend new_repos_relpath from the parent. */
if (pb->parent_baton == NULL
&& strcmp(eb->target_basename, name) == 0)
*new_repos_relpath = eb->switch_repos_relpath;
else
*new_repos_relpath = svn_relpath_join(pb->new_repos_relpath, name,
result_pool);
}
}
else /* must be an update */
{
/* If we are adding the node, then simply extend the parent's
relpath for our own. */
if (old_repos_relpath == NULL)
{
SVN_ERR_ASSERT(pb != NULL);
*new_repos_relpath = svn_relpath_join(pb->new_repos_relpath, name,
result_pool);
}
else
{
*new_repos_relpath = apr_pstrdup(result_pool, old_repos_relpath);
}
}
return SVN_NO_ERROR;
}
/* Make a new dir baton in a subpool of PB->pool. PB is the parent baton.
If PATH and PB are NULL, this is the root directory of the edit; in this
case, make the new dir baton in a subpool of EB->pool.
ADDING should be TRUE if we are adding this directory. */
static svn_error_t *
make_dir_baton(struct dir_baton **d_p,
const char *path,
struct edit_baton *eb,
struct dir_baton *pb,
svn_boolean_t adding,
apr_pool_t *scratch_pool)
{
apr_pool_t *dir_pool;
struct dir_baton *d;
if (pb != NULL)
dir_pool = svn_pool_create(pb->pool);
else
dir_pool = svn_pool_create(eb->pool);
SVN_ERR_ASSERT(path || (! pb));
/* Okay, no easy out, so allocate and initialize a dir baton. */
d = apr_pcalloc(dir_pool, sizeof(*d));
/* Construct the PATH and baseNAME of this directory. */
if (path)
{
d->name = svn_dirent_basename(path, dir_pool);
SVN_ERR(path_join_under_root(&d->local_abspath,
pb->local_abspath, d->name, dir_pool));
}
else
{
/* This is the root baton. */
d->name = NULL;
d->local_abspath = eb->anchor_abspath;
}
d->edit_baton = eb;
d->parent_baton = pb;
d->pool = dir_pool;
d->propchanges = apr_array_make(dir_pool, 1, sizeof(svn_prop_t));
d->obstruction_found = FALSE;
d->add_existed = FALSE;
d->ref_count = 1;
d->old_revision = SVN_INVALID_REVNUM;
d->adding_dir = adding;
d->changed_rev = SVN_INVALID_REVNUM;
d->not_present_nodes = apr_hash_make(dir_pool);
/* Copy some flags from the parent baton */
if (pb)
{
d->skip_this = pb->skip_this;
d->shadowed = pb->shadowed || pb->edit_obstructed;
/* the parent's bump info has one more referer */
pb->ref_count++;
}
/* The caller of this function needs to fill these in. */
d->ambient_depth = svn_depth_unknown;
d->was_incomplete = FALSE;
*d_p = d;
return SVN_NO_ERROR;
}
/* Forward declarations. */
static svn_error_t *
already_in_a_tree_conflict(svn_boolean_t *conflicted,
svn_boolean_t *ignored,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *scratch_pool);
static void
do_notification(const struct edit_baton *eb,
const char *local_abspath,
svn_node_kind_t kind,
svn_wc_notify_action_t action,
apr_pool_t *scratch_pool)
{
svn_wc_notify_t *notify;
if (eb->notify_func == NULL)
return;
notify = svn_wc_create_notify(local_abspath, action, scratch_pool);
notify->kind = kind;
(*eb->notify_func)(eb->notify_baton, notify, scratch_pool);
}
/* Decrement the directory's reference count. If it hits zero,
then this directory is "done". This means it is safe to clear its pool.
In addition, when the directory is "done", we recurse to possible cleanup
the parent directory.
*/
static svn_error_t *
maybe_release_dir_info(struct dir_baton *db)
{
db->ref_count--;
if (!db->ref_count)
{
struct dir_baton *pb = db->parent_baton;
svn_pool_destroy(db->pool);
if (pb)
SVN_ERR(maybe_release_dir_info(pb));
}
return SVN_NO_ERROR;
}
/* Per file baton. Lives in its own subpool below the pool of the parent
directory */
struct file_baton
{
/* Pool specific to this file_baton. */
apr_pool_t *pool;
/* Name of this file (its entry in the directory). */
const char *name;
/* Absolute path to this file */
const char *local_abspath;
/* The repository relative path this file will correspond to. */
const char *new_repos_relpath;
/* The revision of the file before updating */
svn_revnum_t old_revision;
/* The repos_relpath before updating/switching */
const char *old_repos_relpath;
/* The global edit baton. */
struct edit_baton *edit_baton;
/* The parent directory of this file. */
struct dir_baton *dir_baton;
/* Set if updates to this directory are skipped */
svn_boolean_t skip_this;
/* Set if there was a previous notification */
svn_boolean_t already_notified;
/* Set if this file is new. */
svn_boolean_t adding_file;
/* Set if an unversioned file of the same name already existed in
this directory. */
svn_boolean_t obstruction_found;
/* Set if a file of the same name already exists and is
scheduled for addition without history. */
svn_boolean_t add_existed;
/* Set if this file is being added in the BASE layer, but is not-present
in the working copy (replaced, deleted, etc.). */
svn_boolean_t shadowed;
/* Set on a node when the existing node is obstructed, and the edit operation
continues as semi-shadowed update */
svn_boolean_t edit_obstructed;
/* The (new) changed_* information, cached to avoid retrieving it later */
svn_revnum_t changed_rev;
apr_time_t changed_date;
const char *changed_author;
/* If there are file content changes, these are the checksums of the
resulting new text base, which is in the pristine store, else NULL. */
const svn_checksum_t *new_text_base_md5_checksum;
const svn_checksum_t *new_text_base_sha1_checksum;
/* The checksum of the file before the update */
const svn_checksum_t *original_checksum;
/* An array of svn_prop_t structures, representing all the property
changes to be applied to this file. Once a file baton is
initialized, this is never NULL, but it may have zero elements. */
apr_array_header_t *propchanges;
/* For existing files, whether there are local modifications. FALSE for added
files */
svn_boolean_t local_prop_mods;
/* Bump information for the directory this file lives in */
struct bump_dir_info *bump_info;
/* A boolean indicating whether this node or one of its children has
received any 'real' changes. Used to avoid tree conflicts for simple
entryprop changes, like lock management */
svn_boolean_t edited;
/* The tree conflict to install once the node is really edited */
svn_skel_t *edit_conflict;
};
/* Make a new file baton in a subpool of PB->pool. PB is the parent baton.
* PATH is relative to the root of the edit. ADDING tells whether this file
* is being added. */
static svn_error_t *
make_file_baton(struct file_baton **f_p,
struct dir_baton *pb,
const char *path,
svn_boolean_t adding,
apr_pool_t *scratch_pool)
{
apr_pool_t *file_pool = svn_pool_create(pb->pool);
struct file_baton *f = apr_pcalloc(file_pool, sizeof(*f));
SVN_ERR_ASSERT(path);
/* Make the file's on-disk name. */
f->name = svn_dirent_basename(path, file_pool);
f->old_revision = SVN_INVALID_REVNUM;
SVN_ERR(path_join_under_root(&f->local_abspath,
pb->local_abspath, f->name, file_pool));
f->pool = file_pool;
f->edit_baton = pb->edit_baton;
f->propchanges = apr_array_make(file_pool, 1, sizeof(svn_prop_t));
f->bump_info = pb->bump_info;
f->adding_file = adding;
f->obstruction_found = FALSE;
f->add_existed = FALSE;
f->skip_this = pb->skip_this;
f->shadowed = pb->shadowed || pb->edit_obstructed;
f->dir_baton = pb;
f->changed_rev = SVN_INVALID_REVNUM;
/* the directory has one more referer now */
pb->ref_count++;
*f_p = f;
return SVN_NO_ERROR;
}
/* Complete a conflict skel by describing the update.
*
* LOCAL_KIND is the node kind of the tree conflict victim in the
* working copy.
*
* All temporary allocations are be made in SCRATCH_POOL, while allocations
* needed for the returned conflict struct are made in RESULT_POOL.
*/
static svn_error_t *
complete_conflict(svn_skel_t *conflict,
const struct edit_baton *eb,
const char *local_abspath,
const char *old_repos_relpath,
svn_revnum_t old_revision,
const char *new_repos_relpath,
svn_node_kind_t local_kind,
svn_node_kind_t target_kind,
const svn_skel_t *delete_conflict,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const svn_wc_conflict_version_t *original_version = NULL;
svn_wc_conflict_version_t *target_version;
svn_boolean_t is_complete;
SVN_ERR_ASSERT(new_repos_relpath);
if (!conflict)
return SVN_NO_ERROR; /* Not conflicted */
SVN_ERR(svn_wc__conflict_skel_is_complete(&is_complete, conflict));
if (is_complete)
return SVN_NO_ERROR; /* Already completed */
if (old_repos_relpath)
original_version = svn_wc_conflict_version_create2(eb->repos_root,
eb->repos_uuid,
old_repos_relpath,
old_revision,
local_kind,
result_pool);
else if (delete_conflict)
{
const apr_array_header_t *locations;
SVN_ERR(svn_wc__conflict_read_info(NULL, &locations, NULL, NULL, NULL,
eb->db, local_abspath,
delete_conflict,
scratch_pool, scratch_pool));
if (locations)
{
original_version = APR_ARRAY_IDX(locations, 0,
const svn_wc_conflict_version_t *);
}
}
target_version = svn_wc_conflict_version_create2(eb->repos_root,
eb->repos_uuid,
new_repos_relpath,
*eb->target_revision,
target_kind,
result_pool);
if (eb->switch_repos_relpath)
SVN_ERR(svn_wc__conflict_skel_set_op_switch(conflict,
original_version,
target_version,
result_pool, scratch_pool));
else
SVN_ERR(svn_wc__conflict_skel_set_op_update(conflict,
original_version,
target_version,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Called when a directory is really edited, to avoid marking a
tree conflict on a node for a no-change edit */
static svn_error_t *
mark_directory_edited(struct dir_baton *db, apr_pool_t *scratch_pool)
{
if (db->edited)
return SVN_NO_ERROR;
if (db->parent_baton)
SVN_ERR(mark_directory_edited(db->parent_baton, scratch_pool));
db->edited = TRUE;
if (db->edit_conflict)
{
/* We have a (delayed) tree conflict to install */
SVN_ERR(complete_conflict(db->edit_conflict, db->edit_baton,
db->local_abspath,
db->old_repos_relpath, db->old_revision,
db->new_repos_relpath,
svn_node_dir, svn_node_dir,
NULL,
db->pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_conflict(db->edit_baton->db,
db->local_abspath,
db->edit_conflict, NULL,
scratch_pool));
do_notification(db->edit_baton, db->local_abspath, svn_node_dir,
svn_wc_notify_tree_conflict, scratch_pool);
db->already_notified = TRUE;
}
return SVN_NO_ERROR;
}
/* Called when a file is really edited, to avoid marking a
tree conflict on a node for a no-change edit */
static svn_error_t *
mark_file_edited(struct file_baton *fb, apr_pool_t *scratch_pool)
{
if (fb->edited)
return SVN_NO_ERROR;
SVN_ERR(mark_directory_edited(fb->dir_baton, scratch_pool));
fb->edited = TRUE;
if (fb->edit_conflict)
{
/* We have a (delayed) tree conflict to install */
SVN_ERR(complete_conflict(fb->edit_conflict, fb->edit_baton,
fb->local_abspath, fb->old_repos_relpath,
fb->old_revision, fb->new_repos_relpath,
svn_node_file, svn_node_file,
NULL,
fb->pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_conflict(fb->edit_baton->db,
fb->local_abspath,
fb->edit_conflict, NULL,
scratch_pool));
do_notification(fb->edit_baton, fb->local_abspath, svn_node_file,
svn_wc_notify_tree_conflict, scratch_pool);
fb->already_notified = TRUE;
}
return SVN_NO_ERROR;
}
/* Handle the next delta window of the file described by BATON. If it is
* the end (WINDOW == NULL), then check the checksum, store the text in the
* pristine store and write its details into BATON->fb->new_text_base_*. */
static svn_error_t *
window_handler(svn_txdelta_window_t *window, void *baton)
{
struct handler_baton *hb = baton;
struct file_baton *fb = hb->fb;
svn_error_t *err;
/* Apply this window. We may be done at that point. */
err = hb->apply_handler(window, hb->apply_baton);
if (window != NULL && !err)
return SVN_NO_ERROR;
if (hb->expected_source_checksum)
{
/* Close the stream to calculate HB->actual_source_md5_checksum. */
svn_error_t *err2 = svn_stream_close(hb->source_checksum_stream);
if (!err2)
{
SVN_ERR_ASSERT(hb->expected_source_checksum->kind ==
hb->actual_source_checksum->kind);
if (!svn_checksum_match(hb->expected_source_checksum,
hb->actual_source_checksum))
{
err = svn_error_createf(SVN_ERR_WC_CORRUPT_TEXT_BASE, err,
_("Checksum mismatch while updating '%s':\n"
" expected: %s\n"
" actual: %s\n"),
svn_dirent_local_style(fb->local_abspath, hb->pool),
svn_checksum_to_cstring(hb->expected_source_checksum,
hb->pool),
svn_checksum_to_cstring(hb->actual_source_checksum,
hb->pool));
}
}
err = svn_error_compose_create(err, err2);
}
if (err)
{
/* We failed to apply the delta; clean up the temporary file if it
already created by lazy_open_target(). */
if (hb->install_data)
{
svn_error_clear(svn_wc__db_pristine_install_abort(hb->install_data,
hb->pool));
}
}
else
{
/* Tell the file baton about the new text base's checksums. */
fb->new_text_base_md5_checksum =
svn_checksum__from_digest_md5(hb->new_text_base_md5_digest, fb->pool);
fb->new_text_base_sha1_checksum =
svn_checksum_dup(hb->new_text_base_sha1_checksum, fb->pool);
/* Store the new pristine text in the pristine store now. Later, in a
single transaction we will update the BASE_NODE to include a
reference to this pristine text's checksum. */
SVN_ERR(svn_wc__db_pristine_install(hb->install_data,
fb->new_text_base_sha1_checksum,
fb->new_text_base_md5_checksum,
hb->pool));
}
svn_pool_destroy(hb->pool);
return err;
}
/* Find the last-change info within ENTRY_PROPS, and return then in the
CHANGED_* parameters. Each parameter will be initialized to its "none"
value, and will contain the relavent info if found.
CHANGED_AUTHOR will be allocated in RESULT_POOL. SCRATCH_POOL will be
used for some temporary allocations.
*/
static svn_error_t *
accumulate_last_change(svn_revnum_t *changed_rev,
apr_time_t *changed_date,
const char **changed_author,
const apr_array_header_t *entry_props,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
int i;
*changed_rev = SVN_INVALID_REVNUM;
*changed_date = 0;
*changed_author = NULL;
for (i = 0; i < entry_props->nelts; ++i)
{
const svn_prop_t *prop = &APR_ARRAY_IDX(entry_props, i, svn_prop_t);
/* A prop value of NULL means the information was not
available. We don't remove this field from the entries
file; we have convention just leave it empty. So let's
just skip those entry props that have no values. */
if (! prop->value)
continue;
if (! strcmp(prop->name, SVN_PROP_ENTRY_LAST_AUTHOR))
*changed_author = apr_pstrdup(result_pool, prop->value->data);
else if (! strcmp(prop->name, SVN_PROP_ENTRY_COMMITTED_REV))
{
apr_int64_t rev;
SVN_ERR(svn_cstring_atoi64(&rev, prop->value->data));
*changed_rev = (svn_revnum_t)rev;
}
else if (! strcmp(prop->name, SVN_PROP_ENTRY_COMMITTED_DATE))
SVN_ERR(svn_time_from_cstring(changed_date, prop->value->data,
scratch_pool));
/* Starting with Subversion 1.7 we ignore the SVN_PROP_ENTRY_UUID
property here. */
}
return SVN_NO_ERROR;
}
/* Join ADD_PATH to BASE_PATH. If ADD_PATH is absolute, or if any ".."
* component of it resolves to a path above BASE_PATH, then return
* SVN_ERR_WC_OBSTRUCTED_UPDATE.
*
* This is to prevent the situation where the repository contains,
* say, "..\nastyfile". Although that's perfectly legal on some
* systems, when checked out onto Win32 it would cause "nastyfile" to
* be created in the parent of the current edit directory.
*
* (http://cve.mitre.org/cgi-bin/cvename.cgi?name=2007-3846)
*/
static svn_error_t *
path_join_under_root(const char **result_path,
const char *base_path,
const char *add_path,
apr_pool_t *pool)
{
svn_boolean_t under_root;
SVN_ERR(svn_dirent_is_under_root(&under_root,
result_path, base_path, add_path, pool));
if (! under_root)
{
return svn_error_createf(
SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("Path '%s' is not in the working copy"),
svn_dirent_local_style(svn_dirent_join(base_path, add_path, pool),
pool));
}
/* This catches issue #3288 */
if (strcmp(add_path, svn_dirent_basename(*result_path, NULL)) != 0)
{
return svn_error_createf(
SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("'%s' is not valid as filename in directory '%s'"),
svn_dirent_local_style(add_path, pool),
svn_dirent_local_style(base_path, pool));
}
return SVN_NO_ERROR;
}
/*** The callbacks we'll plug into an svn_delta_editor_t structure. ***/
/* An svn_delta_editor_t function. */
static svn_error_t *
set_target_revision(void *edit_baton,
svn_revnum_t target_revision,
apr_pool_t *pool)
{
struct edit_baton *eb = edit_baton;
*(eb->target_revision) = target_revision;
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
open_root(void *edit_baton,
svn_revnum_t base_revision, /* This is ignored in co */
apr_pool_t *pool,
void **dir_baton)
{
struct edit_baton *eb = edit_baton;
struct dir_baton *db;
svn_boolean_t already_conflicted, conflict_ignored;
svn_error_t *err;
svn_wc__db_status_t status;
svn_wc__db_status_t base_status;
svn_node_kind_t kind;
svn_boolean_t have_work;
/* Note that something interesting is actually happening in this
edit run. */
eb->root_opened = TRUE;
SVN_ERR(make_dir_baton(&db, NULL, eb, NULL, FALSE, pool));
*dir_baton = db;
err = already_in_a_tree_conflict(&already_conflicted, &conflict_ignored,
eb->db, db->local_abspath, pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
already_conflicted = conflict_ignored = FALSE;
}
else if (already_conflicted)
{
/* Record a skip of both the anchor and target in the skipped tree
as the anchor itself might not be updated */
SVN_ERR(remember_skipped_tree(eb, db->local_abspath, pool));
SVN_ERR(remember_skipped_tree(eb, eb->target_abspath, pool));
db->skip_this = TRUE;
db->already_notified = TRUE;
/* Notify that we skipped the target, while we actually skipped
the anchor */
do_notification(eb, eb->target_abspath, svn_node_unknown,
svn_wc_notify_skip_conflicted, pool);
return SVN_NO_ERROR;
}
SVN_ERR(svn_wc__db_read_info(&status, &kind, &db->old_revision,
&db->old_repos_relpath, NULL, NULL,
&db->changed_rev, &db->changed_date,
&db->changed_author, &db->ambient_depth,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, &have_work,
eb->db, db->local_abspath,
db->pool, pool));
if (have_work)
{
SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL,
&db->old_revision,
&db->old_repos_relpath, NULL, NULL,
&db->changed_rev, &db->changed_date,
&db->changed_author,
&db->ambient_depth,
NULL, NULL, NULL, NULL, NULL, NULL,
eb->db, db->local_abspath,
db->pool, pool));
}
else
base_status = status;
SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
db->old_repos_relpath, eb, NULL,
db->pool, pool));
if (conflict_ignored)
db->shadowed = TRUE;
else if (have_work)
{
const char *move_src_root_abspath;
SVN_ERR(svn_wc__db_base_moved_to(NULL, NULL, &move_src_root_abspath,
NULL, eb->db, db->local_abspath,
pool, pool));
if (move_src_root_abspath)
{
/* This is an update anchored inside a move. We need to
raise a move-edit tree-conflict on the move root to
update the move destination. */
svn_skel_t *tree_conflict = svn_wc__conflict_skel_create(pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
tree_conflict, eb->db, move_src_root_abspath,
svn_wc_conflict_reason_moved_away,
svn_wc_conflict_action_edit,
move_src_root_abspath, pool, pool));
if (strcmp(db->local_abspath, move_src_root_abspath))
{
/* We are raising the tree-conflict on some parent of
the edit root, we won't be handling that path again
so raise the conflict now. */
SVN_ERR(complete_conflict(tree_conflict, eb,
move_src_root_abspath,
db->old_repos_relpath,
db->old_revision,
db->new_repos_relpath,
svn_node_dir, svn_node_dir,
NULL, pool, pool));
SVN_ERR(svn_wc__db_op_mark_conflict(eb->db,
move_src_root_abspath,
tree_conflict,
NULL, pool));
do_notification(eb, move_src_root_abspath, svn_node_dir,
svn_wc_notify_tree_conflict, pool);
}
else
db->edit_conflict = tree_conflict;
}
db->shadowed = TRUE; /* Needed for the close_directory() on the root, to
make sure it doesn't use the ACTUAL tree */
}
if (*eb->target_basename == '\0')
{
/* For an update with a NULL target, this is equivalent to open_dir(): */
db->was_incomplete = (base_status == svn_wc__db_status_incomplete);
/* ### TODO: Add some tree conflict and obstruction detection, etc. like
open_directory() does.
(or find a way to reuse that code here)
### BH 2013: I don't think we need all of the detection here, as the
user explicitly asked to update this node. So we don't
have to tell that it is a local replacement/delete.
*/
SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db,
db->local_abspath,
db->new_repos_relpath,
*eb->target_revision,
pool));
}
return SVN_NO_ERROR;
}
/* ===================================================================== */
/* Checking for local modifications. */
/* Indicates an unset svn_wc_conflict_reason_t. */
#define SVN_WC_CONFLICT_REASON_NONE (svn_wc_conflict_reason_t)(-1)
/* Check whether the incoming change ACTION on FULL_PATH would conflict with
* LOCAL_ABSPATH's scheduled change. If so, then raise a tree conflict with
* LOCAL_ABSPATH as the victim.
*
* The edit baton EB gives information including whether the operation is
* an update or a switch.
*
* WORKING_STATUS is the current node status of LOCAL_ABSPATH
* and EXISTS_IN_REPOS specifies whether a BASE_NODE representation for exists
* for this node. In that case the on disk type is compared to EXPECTED_KIND.
*
* If a tree conflict reason was found for the incoming action, the resulting
* tree conflict info is returned in *PCONFLICT. PCONFLICT must be non-NULL,
* while *PCONFLICT is always overwritten.
*
* The tree conflict is allocated in RESULT_POOL. Temporary allocations use
* SCRATCH_POOL.
*/
static svn_error_t *
check_tree_conflict(svn_skel_t **pconflict,
struct edit_baton *eb,
const char *local_abspath,
svn_wc__db_status_t working_status,
svn_boolean_t exists_in_repos,
svn_node_kind_t expected_kind,
svn_wc_conflict_action_t action,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_wc_conflict_reason_t reason = SVN_WC_CONFLICT_REASON_NONE;
svn_boolean_t modified = FALSE;
const char *move_src_op_root_abspath = NULL;
*pconflict = NULL;
/* Find out if there are any local changes to this node that may
* be the "reason" of a tree-conflict with the incoming "action". */
switch (working_status)
{
case svn_wc__db_status_added:
case svn_wc__db_status_moved_here:
case svn_wc__db_status_copied:
if (!exists_in_repos)
{
/* The node is locally added, and it did not exist before. This
* is an 'update', so the local add can only conflict with an
* incoming 'add'. In fact, if we receive anything else than an
* svn_wc_conflict_action_add (which includes 'added',
* 'copied-here' and 'moved-here') during update on a node that
* did not exist before, then something is very wrong.
* Note that if there was no action on the node, this code
* would not have been called in the first place. */
SVN_ERR_ASSERT(action == svn_wc_conflict_action_add);
/* Scan the addition in case our caller didn't. */
if (working_status == svn_wc__db_status_added)
SVN_ERR(svn_wc__db_scan_addition(&working_status, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL,
eb->db, local_abspath,
scratch_pool, scratch_pool));
if (working_status == svn_wc__db_status_moved_here)
reason = svn_wc_conflict_reason_moved_here;
else
reason = svn_wc_conflict_reason_added;
}
else
{
/* The node is locally replaced but could also be moved-away,
but we can't report that it is moved away and replaced.
And we wouldn't be able to store that each of a dozen
descendants was moved to other locations...
Replaced is what actually happened... */
reason = svn_wc_conflict_reason_replaced;
}
break;
case svn_wc__db_status_deleted:
{
SVN_ERR(svn_wc__db_base_moved_to(NULL, NULL, NULL,
&move_src_op_root_abspath,
eb->db, local_abspath,
scratch_pool, scratch_pool));
if (move_src_op_root_abspath)
reason = svn_wc_conflict_reason_moved_away;
else
reason = svn_wc_conflict_reason_deleted;
}
break;
case svn_wc__db_status_incomplete:
/* We used svn_wc__db_read_info(), so 'incomplete' means
* - there is no node in the WORKING tree
* - a BASE node is known to exist
* So the node exists and is essentially 'normal'. We still need to
* check prop and text mods, and those checks will retrieve the
* missing information (hopefully). */
case svn_wc__db_status_normal:
if (action == svn_wc_conflict_action_edit)
{
/* An edit onto a local edit or onto *no* local changes is no
* tree-conflict. (It's possibly a text- or prop-conflict,
* but we don't handle those here.)
*
* Except when there is a local obstruction
*/
if (exists_in_repos)
{
svn_node_kind_t disk_kind;
SVN_ERR(svn_io_check_path(local_abspath, &disk_kind,
scratch_pool));
if (disk_kind != expected_kind && disk_kind != svn_node_none)
{
reason = svn_wc_conflict_reason_obstructed;
break;
}
}
return SVN_NO_ERROR;
}
/* Replace is handled as delete and then specifically in
add_directory() and add_file(), so we only expect deletes here */
SVN_ERR_ASSERT(action == svn_wc_conflict_action_delete);
/* Check if the update wants to delete or replace a locally
* modified node. */
/* Do a deep tree detection of local changes. The update editor will
* not visit the subdirectories of a directory that it wants to delete.
* Therefore, we need to start a separate crawl here. */
SVN_ERR(svn_wc__node_has_local_mods(&modified, NULL,
eb->db, local_abspath, FALSE,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
if (modified)
{
if (working_status == svn_wc__db_status_deleted)
reason = svn_wc_conflict_reason_deleted;
else
reason = svn_wc_conflict_reason_edited;
}
break;
case svn_wc__db_status_server_excluded:
/* Not allowed to view the node. Not allowed to report tree
* conflicts. */
case svn_wc__db_status_excluded:
/* Locally marked as excluded. No conflicts wanted. */
case svn_wc__db_status_not_present:
/* A committed delete (but parent not updated). The delete is
committed, so no conflict possible during update. */
return SVN_NO_ERROR;
case svn_wc__db_status_base_deleted:
/* An internal status. Should never show up here. */
SVN_ERR_MALFUNCTION();
break;
}
if (reason == SVN_WC_CONFLICT_REASON_NONE)
/* No conflict with the current action. */
return SVN_NO_ERROR;
/* Sanity checks. Note that if there was no action on the node, this function
* would not have been called in the first place.*/
if (reason == svn_wc_conflict_reason_edited
|| reason == svn_wc_conflict_reason_obstructed
|| reason == svn_wc_conflict_reason_deleted
|| reason == svn_wc_conflict_reason_moved_away
|| reason == svn_wc_conflict_reason_replaced)
{
/* When the node existed before (it was locally deleted, replaced or
* edited), then 'update' cannot add it "again". So it can only send
* _action_edit, _delete or _replace. */
if (action != svn_wc_conflict_action_edit
&& action != svn_wc_conflict_action_delete
&& action != svn_wc_conflict_action_replace)
return svn_error_createf(SVN_ERR_WC_FOUND_CONFLICT, NULL,
_("Unexpected attempt to add a node at path '%s'"),
svn_dirent_local_style(local_abspath, scratch_pool));
}
else if (reason == svn_wc_conflict_reason_added ||
reason == svn_wc_conflict_reason_moved_here)
{
/* When the node did not exist before (it was locally added),
* then 'update' cannot want to modify it in any way.
* It can only send _action_add. */
if (action != svn_wc_conflict_action_add)
return svn_error_createf(SVN_ERR_WC_FOUND_CONFLICT, NULL,
_("Unexpected attempt to edit, delete, or replace "
"a node at path '%s'"),
svn_dirent_local_style(local_abspath, scratch_pool));
}
/* A conflict was detected. Create a conflict skel to record it. */
*pconflict = svn_wc__conflict_skel_create(result_pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(*pconflict,
eb->db, local_abspath,
reason,
action,
move_src_op_root_abspath,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* If LOCAL_ABSPATH is inside a conflicted tree and the conflict is
* not a moved-away-edit conflict, set *CONFLICTED to TRUE. Otherwise
* set *CONFLICTED to FALSE.
*/
static svn_error_t *
already_in_a_tree_conflict(svn_boolean_t *conflicted,
svn_boolean_t *ignored,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
const char *ancestor_abspath = local_abspath;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
*conflicted = *ignored = FALSE;
while (TRUE)
{
svn_boolean_t is_wc_root;
svn_pool_clear(iterpool);
SVN_ERR(svn_wc__conflicted_for_update_p(conflicted, ignored, db,
ancestor_abspath, TRUE,
scratch_pool));
if (*conflicted || *ignored)
break;
SVN_ERR(svn_wc__db_is_wcroot(&is_wc_root, db, ancestor_abspath,
iterpool));
if (is_wc_root)
break;
ancestor_abspath = svn_dirent_dirname(ancestor_abspath, scratch_pool);
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
/* Temporary helper until the new conflict handling is in place */
static svn_error_t *
node_already_conflicted(svn_boolean_t *conflicted,
svn_boolean_t *conflict_ignored,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *scratch_pool)
{
SVN_ERR(svn_wc__conflicted_for_update_p(conflicted, conflict_ignored, db,
local_abspath, FALSE,
scratch_pool));
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
delete_entry(const char *path,
svn_revnum_t revision,
void *parent_baton,
apr_pool_t *pool)
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
const char *base = svn_relpath_basename(path, NULL);
const char *local_abspath;
const char *repos_relpath;
const char *deleted_repos_relpath;
svn_node_kind_t kind;
svn_revnum_t old_revision;
svn_boolean_t conflicted;
svn_boolean_t have_work;
svn_skel_t *tree_conflict = NULL;
svn_wc__db_status_t status;
svn_wc__db_status_t base_status;
apr_pool_t *scratch_pool;
svn_boolean_t deleting_target;
svn_boolean_t deleting_switched;
if (pb->skip_this)
return SVN_NO_ERROR;
scratch_pool = svn_pool_create(pb->pool);
SVN_ERR(mark_directory_edited(pb, scratch_pool));
SVN_ERR(path_join_under_root(&local_abspath, pb->local_abspath, base,
scratch_pool));
deleting_target = (strcmp(local_abspath, eb->target_abspath) == 0);
/* Detect obstructing working copies */
{
svn_boolean_t is_root;
SVN_ERR(svn_wc__db_is_wcroot(&is_root, eb->db, local_abspath,
scratch_pool));
if (is_root)
{
/* Just skip this node; a future update will handle it */
SVN_ERR(remember_skipped_tree(eb, local_abspath, pool));
do_notification(eb, local_abspath, svn_node_unknown,
svn_wc_notify_update_skip_obstruction, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
}
SVN_ERR(svn_wc__db_read_info(&status, &kind, &old_revision, &repos_relpath,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&conflicted, NULL, NULL, NULL,
NULL, NULL, &have_work,
eb->db, local_abspath,
scratch_pool, scratch_pool));
if (!have_work)
{
base_status = status;
}
else
SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, &old_revision,
&repos_relpath,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
eb->db, local_abspath,
scratch_pool, scratch_pool));
if (pb->old_repos_relpath && repos_relpath)
{
const char *expected_name;
expected_name = svn_relpath_skip_ancestor(pb->old_repos_relpath,
repos_relpath);
deleting_switched = (!expected_name || strcmp(expected_name, base) != 0);
}
else
deleting_switched = FALSE;
/* Is this path a conflict victim? */
if (pb->shadowed)
conflicted = FALSE; /* Conflict applies to WORKING */
else if (conflicted)
SVN_ERR(node_already_conflicted(&conflicted, NULL,
eb->db, local_abspath, scratch_pool));
if (conflicted)
{
SVN_ERR(remember_skipped_tree(eb, local_abspath, scratch_pool));
do_notification(eb, local_abspath, svn_node_unknown,
svn_wc_notify_skip_conflicted,
scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* Receive the remote removal of excluded/server-excluded/not present node.
Do not notify, but perform the change even when the node is shadowed */
if (base_status == svn_wc__db_status_not_present
|| base_status == svn_wc__db_status_excluded
|| base_status == svn_wc__db_status_server_excluded)
{
SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath, TRUE,
deleting_target, FALSE,
*eb->target_revision,
NULL, NULL,
scratch_pool));
if (deleting_target)
eb->target_deleted = TRUE;
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* Is this path the victim of a newly-discovered tree conflict? If so,
* remember it and notify the client. Then (if it was existing and
* modified), re-schedule the node to be added back again, as a (modified)
* copy of the previous base version. */
/* Check for conflicts only when we haven't already recorded
* a tree-conflict on a parent node. */
if (!pb->shadowed && !pb->edit_obstructed)
{
SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
status, TRUE,
kind,
svn_wc_conflict_action_delete,
pb->pool, scratch_pool));
}
if (tree_conflict != NULL)
{
/* When we raise a tree conflict on a node, we don't want to mark the
* node as skipped, to allow a replacement to continue doing at least
* a bit of its work (possibly adding a not present node, for the
* next update) */
if (!pb->deletion_conflicts)
pb->deletion_conflicts = apr_hash_make(pb->pool);
svn_hash_sets(pb->deletion_conflicts, apr_pstrdup(pb->pool, base),
tree_conflict);
/* Whatever the kind of conflict, we can just clear BASE
by turning whatever is there into a copy */
}
/* Calculate the repository-relative path of the entry which was
* deleted. For updates it's the same as REPOS_RELPATH but for
* switches it is within the switch target. */
SVN_ERR(calculate_repos_relpath(&deleted_repos_relpath, local_abspath,
repos_relpath, eb, pb, scratch_pool,
scratch_pool));
SVN_ERR(complete_conflict(tree_conflict, eb, local_abspath, repos_relpath,
old_revision, deleted_repos_relpath,
kind, svn_node_none, NULL,
pb->pool, scratch_pool));
/* Issue a wq operation to delete the BASE_NODE data and to delete actual
nodes based on that from disk, but leave any WORKING_NODEs on disk.
Local modifications are already turned into copies at this point.
If the thing being deleted is the *target* of this update, then
we need to recreate a 'deleted' entry, so that the parent can give
accurate reports about itself in the future. */
if (! deleting_target && ! deleting_switched)
{
/* Delete, and do not leave a not-present node. */
SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath,
(tree_conflict != NULL),
FALSE, FALSE,
SVN_INVALID_REVNUM /* not_present_rev */,
tree_conflict, NULL,
scratch_pool));
}
else
{
/* Delete, leaving a not-present node. */
SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath,
(tree_conflict != NULL),
TRUE, FALSE,
*eb->target_revision,
tree_conflict, NULL,
scratch_pool));
if (deleting_target)
eb->target_deleted = TRUE;
else
{
/* Don't remove the not-present marker at the final bump */
SVN_ERR(remember_skipped_tree(eb, local_abspath, pool));
}
}
SVN_ERR(svn_wc__wq_run(eb->db, pb->local_abspath,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
/* Notify. */
if (tree_conflict)
{
if (eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, local_abspath,
kind,
tree_conflict,
NULL /* merge_options */,
eb->conflict_func,
eb->conflict_baton,
eb->cancel_func,
eb->cancel_baton,
scratch_pool));
do_notification(eb, local_abspath, kind,
svn_wc_notify_tree_conflict, scratch_pool);
}
else
{
svn_wc_notify_action_t action = svn_wc_notify_update_delete;
if (pb->shadowed || pb->edit_obstructed)
action = svn_wc_notify_update_shadowed_delete;
do_notification(eb, local_abspath, kind, action, scratch_pool);
}
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
add_directory(const char *path,
void *parent_baton,
const char *copyfrom_path,
svn_revnum_t copyfrom_rev,
apr_pool_t *pool,
void **child_baton)
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
struct dir_baton *db;
apr_pool_t *scratch_pool = svn_pool_create(pool);
svn_node_kind_t kind;
svn_wc__db_status_t status;
svn_node_kind_t wc_kind;
svn_boolean_t conflicted;
svn_boolean_t conflict_ignored = FALSE;
svn_boolean_t versioned_locally_and_present;
svn_skel_t *tree_conflict = NULL;
svn_error_t *err;
SVN_ERR_ASSERT(! (copyfrom_path || SVN_IS_VALID_REVNUM(copyfrom_rev)));
SVN_ERR(make_dir_baton(&db, path, eb, pb, TRUE, pool));
*child_baton = db;
if (db->skip_this)
return SVN_NO_ERROR;
SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
NULL, eb, pb, db->pool, scratch_pool));
SVN_ERR(mark_directory_edited(db, pool));
if (strcmp(eb->target_abspath, db->local_abspath) == 0)
{
/* The target of the edit is being added, give it the requested
depth of the edit (but convert svn_depth_unknown to
svn_depth_infinity). */
db->ambient_depth = (eb->requested_depth == svn_depth_unknown)
? svn_depth_infinity : eb->requested_depth;
}
else if (eb->requested_depth == svn_depth_immediates
|| (eb->requested_depth == svn_depth_unknown
&& pb->ambient_depth == svn_depth_immediates))
{
db->ambient_depth = svn_depth_empty;
}
else
{
db->ambient_depth = svn_depth_infinity;
}
/* It may not be named the same as the administrative directory. */
if (svn_wc_is_adm_dir(db->name, pool))
return svn_error_createf(
SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("Failed to add directory '%s': object of the same name as the "
"administrative directory"),
svn_dirent_local_style(db->local_abspath, pool));
if (!eb->clean_checkout)
{
SVN_ERR(svn_io_check_path(db->local_abspath, &kind, db->pool));
err = svn_wc__db_read_info(&status, &wc_kind, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
&conflicted, NULL, NULL, NULL, NULL, NULL, NULL,
eb->db, db->local_abspath,
scratch_pool, scratch_pool);
}
else
{
kind = svn_node_none;
status = svn_wc__db_status_not_present;
wc_kind = svn_node_unknown;
conflicted = FALSE;
err = NULL;
}
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
wc_kind = svn_node_unknown;
status = svn_wc__db_status_normal;
conflicted = FALSE;
versioned_locally_and_present = FALSE;
}
else if (status == svn_wc__db_status_normal && wc_kind == svn_node_unknown)
{
SVN_ERR_ASSERT(conflicted);
versioned_locally_and_present = FALSE; /* Tree conflict ACTUAL-only node */
}
else if (status == svn_wc__db_status_normal
|| status == svn_wc__db_status_incomplete)
{
svn_boolean_t root;
SVN_ERR(svn_wc__db_is_wcroot(&root, eb->db, db->local_abspath,
scratch_pool));
if (root)
{
/* !! We found the root of a working copy obstructing the wc !!
If the directory would be part of our own working copy then
we wouldn't have been called as an add_directory().
The only thing we can do is add a not-present node, to allow
a future update to bring in the new files when the problem is
resolved. Note that svn_wc__db_base_add_not_present_node()
explicitly adds the node into the parent's node database. */
svn_hash_sets(pb->not_present_nodes,
apr_pstrdup(pb->pool, db->name),
svn_node_kind_to_word(svn_node_dir));
}
else if (wc_kind == svn_node_dir)
{
/* We have an editor violation. Github sometimes does this
in its subversion compatibility code, when changing the
depth of a working copy, or on updates from incomplete */
}
else
{
/* We found a file external occupating the place we need in BASE.
We can't add a not-present node in this case as that would overwrite
the file external. Luckily the file external itself stops us from
forgetting a child of this parent directory like an obstructing
working copy would.
The reason we get here is that the adm crawler doesn't report
file externals.
*/
SVN_ERR_ASSERT(wc_kind == svn_node_file
|| wc_kind == svn_node_symlink);
}
SVN_ERR(remember_skipped_tree(eb, db->local_abspath, scratch_pool));
db->skip_this = TRUE;
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, wc_kind,
svn_wc_notify_update_skip_obstruction, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else
versioned_locally_and_present = IS_NODE_PRESENT(status);
/* Is this path a conflict victim? */
if (conflicted)
{
if (pb->deletion_conflicts)
tree_conflict = svn_hash_gets(pb->deletion_conflicts, db->name);
if (tree_conflict)
{
svn_wc_conflict_reason_t reason;
const char *move_src_op_root_abspath;
/* So this deletion wasn't just a deletion, it is actually a
replacement. Let's install a better tree conflict. */
SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL,
&move_src_op_root_abspath,
eb->db,
db->local_abspath,
tree_conflict,
db->pool, scratch_pool));
tree_conflict = svn_wc__conflict_skel_create(db->pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
tree_conflict,
eb->db, db->local_abspath,
reason, svn_wc_conflict_action_replace,
move_src_op_root_abspath,
db->pool, scratch_pool));
/* And now stop checking for conflicts here and just perform
a shadowed update */
db->edit_conflict = tree_conflict; /* Cache for close_directory */
tree_conflict = NULL; /* No direct notification */
db->shadowed = TRUE; /* Just continue */
conflicted = FALSE; /* No skip */
}
else
SVN_ERR(node_already_conflicted(&conflicted, &conflict_ignored,
eb->db, db->local_abspath,
scratch_pool));
}
/* Now the "usual" behaviour if already conflicted. Skip it. */
if (conflicted)
{
/* Record this conflict so that its descendants are skipped silently. */
SVN_ERR(remember_skipped_tree(eb, db->local_abspath, pool));
db->skip_this = TRUE;
db->already_notified = TRUE;
/* We skip this node, but once the update completes the parent node will
be updated to the new revision. So a future recursive update of the
parent will not bring in this new node as the revision of the parent
describes to the repository that all children are available.
To resolve this problem, we add a not-present node to allow bringing
the node in once this conflict is resolved.
Note that we can safely assume that no present base node exists,
because then we would not have received an add_directory.
*/
svn_hash_sets(pb->not_present_nodes, apr_pstrdup(pb->pool, db->name),
svn_node_kind_to_word(svn_node_dir));
do_notification(eb, db->local_abspath, svn_node_dir,
svn_wc_notify_skip_conflicted, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else if (conflict_ignored)
{
db->shadowed = TRUE;
}
if (db->shadowed)
{
/* Nothing to check; does not and will not exist in working copy */
}
else if (versioned_locally_and_present)
{
/* What to do with a versioned or schedule-add dir:
A dir already added without history is OK. Set add_existed
so that user notification is delayed until after any prop
conflicts have been found.
An existing versioned dir is an error. In the future we may
relax this restriction and simply update such dirs.
A dir added with history is a tree conflict. */
svn_boolean_t local_is_non_dir;
svn_wc__db_status_t add_status = svn_wc__db_status_normal;
/* Is the local add a copy? */
if (status == svn_wc__db_status_added)
SVN_ERR(svn_wc__db_scan_addition(&add_status, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
eb->db, db->local_abspath,
scratch_pool, scratch_pool));
/* Is there *something* that is not a dir? */
local_is_non_dir = (wc_kind != svn_node_dir
&& status != svn_wc__db_status_deleted);
/* Do tree conflict checking if
* - if there is a local copy.
* - if this is a switch operation
* - the node kinds mismatch
*
* During switch, local adds at the same path as incoming adds get
* "lost" in that switching back to the original will no longer have the
* local add. So switch always alerts the user with a tree conflict. */
if (!eb->adds_as_modification
|| local_is_non_dir
|| add_status != svn_wc__db_status_added)
{
SVN_ERR(check_tree_conflict(&tree_conflict, eb,
db->local_abspath,
status, FALSE, svn_node_none,
svn_wc_conflict_action_add,
db->pool, scratch_pool));
}
if (tree_conflict == NULL)
db->add_existed = TRUE; /* Take over WORKING */
else
db->shadowed = TRUE; /* Only update BASE */
}
else if (kind != svn_node_none)
{
/* There's an unversioned node at this path. */
db->obstruction_found = TRUE;
/* Unversioned, obstructing dirs are handled by prop merge/conflict,
* if unversioned obstructions are allowed. */
if (! (kind == svn_node_dir && eb->allow_unver_obstructions))
{
/* Bring in the node as deleted */ /* ### Obstructed Conflict */
db->shadowed = TRUE;
/* Mark a conflict */
tree_conflict = svn_wc__conflict_skel_create(db->pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
tree_conflict,
eb->db, db->local_abspath,
svn_wc_conflict_reason_unversioned,
svn_wc_conflict_action_add, NULL,
db->pool, scratch_pool));
db->edit_conflict = tree_conflict;
}
}
if (tree_conflict)
SVN_ERR(complete_conflict(tree_conflict, eb, db->local_abspath,
db->old_repos_relpath, db->old_revision,
db->new_repos_relpath,
wc_kind, svn_node_dir,
pb->deletion_conflicts
? svn_hash_gets(pb->deletion_conflicts,
db->name)
: NULL,
db->pool, scratch_pool));
SVN_ERR(svn_wc__db_base_add_incomplete_directory(
eb->db, db->local_abspath,
db->new_repos_relpath,
eb->repos_root,
eb->repos_uuid,
*eb->target_revision,
db->ambient_depth,
(db->shadowed && db->obstruction_found),
(! db->shadowed
&& status == svn_wc__db_status_added),
tree_conflict, NULL,
scratch_pool));
/* Make sure there is a real directory at LOCAL_ABSPATH, unless we are just
updating the DB */
if (!db->shadowed)
SVN_ERR(svn_wc__ensure_directory(db->local_abspath, scratch_pool));
if (tree_conflict != NULL)
{
db->edit_conflict = tree_conflict;
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, svn_node_dir,
svn_wc_notify_tree_conflict, scratch_pool);
}
/* If this add was obstructed by dir scheduled for addition without
history let close_directory() handle the notification because there
might be properties to deal with. If PATH was added inside a locally
deleted tree, then suppress notification, a tree conflict was already
issued. */
if (eb->notify_func && !db->already_notified && !db->add_existed)
{
svn_wc_notify_action_t action;
if (db->shadowed)
action = svn_wc_notify_update_shadowed_add;
else if (db->obstruction_found || db->add_existed)
action = svn_wc_notify_exists;
else
action = svn_wc_notify_update_add;
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, svn_node_dir, action,
scratch_pool);
}
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
open_directory(const char *path,
void *parent_baton,
svn_revnum_t base_revision,
apr_pool_t *pool,
void **child_baton)
{
struct dir_baton *db, *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
svn_boolean_t have_work;
svn_boolean_t conflicted;
svn_boolean_t conflict_ignored = FALSE;
svn_skel_t *tree_conflict = NULL;
svn_wc__db_status_t status, base_status;
svn_node_kind_t wc_kind;
SVN_ERR(make_dir_baton(&db, path, eb, pb, FALSE, pool));
*child_baton = db;
if (db->skip_this)
return SVN_NO_ERROR;
/* Detect obstructing working copies */
{
svn_boolean_t is_root;
SVN_ERR(svn_wc__db_is_wcroot(&is_root, eb->db, db->local_abspath,
pool));
if (is_root)
{
/* Just skip this node; a future update will handle it */
SVN_ERR(remember_skipped_tree(eb, db->local_abspath, pool));
db->skip_this = TRUE;
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, svn_node_dir,
svn_wc_notify_update_skip_obstruction, pool);
return SVN_NO_ERROR;
}
}
/* We should have a write lock on every directory touched. */
SVN_ERR(svn_wc__write_check(eb->db, db->local_abspath, pool));
SVN_ERR(svn_wc__db_read_info(&status, &wc_kind, &db->old_revision,
&db->old_repos_relpath, NULL, NULL,
&db->changed_rev, &db->changed_date,
&db->changed_author, &db->ambient_depth,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
&conflicted, NULL, NULL, NULL,
NULL, NULL, &have_work,
eb->db, db->local_abspath,
db->pool, pool));
if (!have_work)
base_status = status;
else
SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, &db->old_revision,
&db->old_repos_relpath, NULL, NULL,
&db->changed_rev, &db->changed_date,
&db->changed_author, &db->ambient_depth,
NULL, NULL, NULL, NULL, NULL, NULL,
eb->db, db->local_abspath,
db->pool, pool));
db->was_incomplete = (base_status == svn_wc__db_status_incomplete);
SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
db->old_repos_relpath, eb, pb,
db->pool, pool));
/* Is this path a conflict victim? */
if (db->shadowed)
conflicted = FALSE; /* Conflict applies to WORKING */
else if (conflicted)
SVN_ERR(node_already_conflicted(&conflicted, &conflict_ignored,
eb->db, db->local_abspath, pool));
if (conflicted)
{
SVN_ERR(remember_skipped_tree(eb, db->local_abspath, pool));
db->skip_this = TRUE;
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, svn_node_unknown,
svn_wc_notify_skip_conflicted, pool);
return SVN_NO_ERROR;
}
else if (conflict_ignored)
{
db->shadowed = TRUE;
}
/* Is this path a fresh tree conflict victim? If so, skip the tree
with one notification. */
/* Check for conflicts only when we haven't already recorded
* a tree-conflict on a parent node. */
if (!db->shadowed)
SVN_ERR(check_tree_conflict(&tree_conflict, eb, db->local_abspath,
status, TRUE, svn_node_dir,
svn_wc_conflict_action_edit,
db->pool, pool));
/* Remember the roots of any locally deleted trees. */
if (tree_conflict != NULL)
{
svn_wc_conflict_reason_t reason;
db->edit_conflict = tree_conflict;
/* Other modifications wouldn't be a tree conflict */
SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, NULL,
eb->db, db->local_abspath,
tree_conflict,
db->pool, db->pool));
SVN_ERR_ASSERT(reason == svn_wc_conflict_reason_deleted
|| reason == svn_wc_conflict_reason_moved_away
|| reason == svn_wc_conflict_reason_replaced
|| reason == svn_wc_conflict_reason_obstructed);
/* Continue updating BASE */
if (reason == svn_wc_conflict_reason_obstructed)
db->edit_obstructed = TRUE;
else
db->shadowed = TRUE;
}
/* Mark directory as being at target_revision and URL, but incomplete. */
SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, db->local_abspath,
db->new_repos_relpath,
*eb->target_revision,
pool));
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
change_dir_prop(void *dir_baton,
const char *name,
const svn_string_t *value,
apr_pool_t *pool)
{
svn_prop_t *propchange;
struct dir_baton *db = dir_baton;
if (db->skip_this)
return SVN_NO_ERROR;
propchange = apr_array_push(db->propchanges);
propchange->name = apr_pstrdup(db->pool, name);
propchange->value = svn_string_dup(value, db->pool);
if (!db->edited && svn_property_kind2(name) == svn_prop_regular_kind)
SVN_ERR(mark_directory_edited(db, pool));
return SVN_NO_ERROR;
}
/* If any of the svn_prop_t objects in PROPCHANGES represents a change
to the SVN_PROP_EXTERNALS property, return that change, else return
null. If PROPCHANGES contains more than one such change, return
the first. */
static const svn_prop_t *
externals_prop_changed(const apr_array_header_t *propchanges)
{
int i;
for (i = 0; i < propchanges->nelts; i++)
{
const svn_prop_t *p = &(APR_ARRAY_IDX(propchanges, i, svn_prop_t));
if (strcmp(p->name, SVN_PROP_EXTERNALS) == 0)
return p;
}
return NULL;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
close_directory(void *dir_baton,
apr_pool_t *pool)
{
struct dir_baton *db = dir_baton;
struct edit_baton *eb = db->edit_baton;
svn_wc_notify_state_t prop_state = svn_wc_notify_state_unknown;
apr_array_header_t *entry_prop_changes;
apr_array_header_t *dav_prop_changes;
apr_array_header_t *regular_prop_changes;
apr_hash_t *base_props;
apr_hash_t *actual_props;
apr_hash_t *new_base_props = NULL;
apr_hash_t *new_actual_props = NULL;
svn_revnum_t new_changed_rev = SVN_INVALID_REVNUM;
apr_time_t new_changed_date = 0;
const char *new_changed_author = NULL;
apr_pool_t *scratch_pool = db->pool;
svn_skel_t *all_work_items = NULL;
svn_skel_t *conflict_skel = NULL;
/* Skip if we're in a conflicted tree. */
if (db->skip_this)
{
/* Allow the parent to complete its update. */
SVN_ERR(maybe_release_dir_info(db));
return SVN_NO_ERROR;
}
if (db->edited)
conflict_skel = db->edit_conflict;
SVN_ERR(svn_categorize_props(db->propchanges, &entry_prop_changes,
&dav_prop_changes, &regular_prop_changes, pool));
/* Fetch the existing properties. */
if ((!db->adding_dir || db->add_existed)
&& !db->shadowed)
{
SVN_ERR(svn_wc__get_actual_props(&actual_props,
eb->db, db->local_abspath,
scratch_pool, scratch_pool));
}
else
actual_props = apr_hash_make(pool);
if (db->add_existed)
{
/* This node already exists. Grab the current pristine properties. */
SVN_ERR(svn_wc__db_read_pristine_props(&base_props,
eb->db, db->local_abspath,
scratch_pool, scratch_pool));
}
else if (!db->adding_dir)
{
/* Get the BASE properties for proper merging. */
SVN_ERR(svn_wc__db_base_get_props(&base_props,
eb->db, db->local_abspath,
scratch_pool, scratch_pool));
}
else
base_props = apr_hash_make(pool);
/* An incomplete directory might have props which were supposed to be
deleted but weren't. Because the server sent us all the props we're
supposed to have, any previous base props not in this list must be
deleted (issue #1672). */
if (db->was_incomplete)
{
int i;
apr_hash_t *props_to_delete;
apr_hash_index_t *hi;
/* In a copy of the BASE props, remove every property that we see an
incoming change for. The remaining unmentioned properties are those
which need to be deleted. */
props_to_delete = apr_hash_copy(pool, base_props);
for (i = 0; i < regular_prop_changes->nelts; i++)
{
const svn_prop_t *prop;
prop = &APR_ARRAY_IDX(regular_prop_changes, i, svn_prop_t);
svn_hash_sets(props_to_delete, prop->name, NULL);
}
/* Add these props to the incoming propchanges (in
* regular_prop_changes). */
for (hi = apr_hash_first(pool, props_to_delete);
hi != NULL;
hi = apr_hash_next(hi))
{
const char *propname = apr_hash_this_key(hi);
svn_prop_t *prop = apr_array_push(regular_prop_changes);
/* Record a deletion for PROPNAME. */
prop->name = propname;
prop->value = NULL;
}
}
/* If this directory has property changes stored up, now is the time
to deal with them. */
if (regular_prop_changes->nelts)
{
/* If recording traversal info, then see if the
SVN_PROP_EXTERNALS property on this directory changed,
and record before and after for the change. */
if (eb->external_func)
{
const svn_prop_t *change
= externals_prop_changed(regular_prop_changes);
if (change)
{
const svn_string_t *new_val_s = change->value;
const svn_string_t *old_val_s;
old_val_s = svn_hash_gets(base_props, SVN_PROP_EXTERNALS);
if ((new_val_s == NULL) && (old_val_s == NULL))
; /* No value before, no value after... so do nothing. */
else if (new_val_s && old_val_s
&& (svn_string_compare(old_val_s, new_val_s)))
; /* Value did not change... so do nothing. */
else if (old_val_s || new_val_s)
/* something changed, record the change */
{
SVN_ERR((eb->external_func)(
eb->external_baton,
db->local_abspath,
old_val_s,
new_val_s,
db->ambient_depth,
db->pool));
}
}
}
if (db->shadowed)
{
/* We don't have a relevant actual row, but we need actual properties
to allow property merging without conflicts. */
if (db->adding_dir)
actual_props = apr_hash_make(scratch_pool);
else
actual_props = base_props;
}
/* Merge pending properties. */
new_base_props = svn_prop__patch(base_props, regular_prop_changes,
db->pool);
SVN_ERR_W(svn_wc__merge_props(&conflict_skel,
&prop_state,
&new_actual_props,
eb->db,
db->local_abspath,
NULL /* use baseprops */,
base_props,
actual_props,
regular_prop_changes,
db->pool,
scratch_pool),
_("Couldn't do property merge"));
/* After a (not-dry-run) merge, we ALWAYS have props to save. */
SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL);
}
SVN_ERR(accumulate_last_change(&new_changed_rev, &new_changed_date,
&new_changed_author, entry_prop_changes,
scratch_pool, scratch_pool));
/* Check if we should add some not-present markers before marking the
directory complete (Issue #3569) */
{
apr_hash_t *new_children = svn_hash_gets(eb->dir_dirents,
db->new_repos_relpath);
if (new_children != NULL)
{
apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
for (hi = apr_hash_first(scratch_pool, new_children);
hi;
hi = apr_hash_next(hi))
{
const char *child_name;
const char *child_abspath;
const char *child_relpath;
const svn_dirent_t *dirent;
svn_wc__db_status_t status;
svn_node_kind_t child_kind;
svn_error_t *err;
svn_pool_clear(iterpool);
child_name = apr_hash_this_key(hi);
child_abspath = svn_dirent_join(db->local_abspath, child_name,
iterpool);
dirent = apr_hash_this_val(hi);
child_kind = (dirent->kind == svn_node_dir)
? svn_node_dir
: svn_node_file;
if (db->ambient_depth < svn_depth_immediates
&& child_kind == svn_node_dir)
continue; /* We don't need the subdirs */
/* ### We just check if there is some node in BASE at this path */
err = svn_wc__db_base_get_info(&status, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
eb->db, child_abspath,
iterpool, iterpool);
if (!err)
{
svn_boolean_t is_wcroot;
SVN_ERR(svn_wc__db_is_wcroot(&is_wcroot, eb->db, child_abspath,
iterpool));
if (!is_wcroot)
continue; /* Everything ok... Nothing to do here */
/* Fall through to allow recovering later */
}
else if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
child_relpath = svn_relpath_join(db->new_repos_relpath, child_name,
iterpool);
SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db,
child_abspath,
child_relpath,
eb->repos_root,
eb->repos_uuid,
*eb->target_revision,
child_kind,
NULL, NULL,
iterpool));
}
svn_pool_destroy(iterpool);
}
}
if (apr_hash_count(db->not_present_nodes))
{
apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
/* This should call some new function (which could also be used
for new_children above) to add all the names in single
transaction, but I can't even trigger it. I've tried
ra_local, ra_svn, ra_neon, ra_serf and they all call
close_file before close_dir. */
for (hi = apr_hash_first(scratch_pool, db->not_present_nodes);
hi;
hi = apr_hash_next(hi))
{
const char *child = apr_hash_this_key(hi);
const char *child_abspath, *child_relpath;
svn_node_kind_t kind = svn_node_kind_from_word(apr_hash_this_val(hi));
svn_pool_clear(iterpool);
child_abspath = svn_dirent_join(db->local_abspath, child, iterpool);
child_relpath = svn_dirent_join(db->new_repos_relpath, child, iterpool);
SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db,
child_abspath,
child_relpath,
eb->repos_root,
eb->repos_uuid,
*eb->target_revision,
kind,
NULL, NULL,
iterpool));
}
svn_pool_destroy(iterpool);
}
/* If this directory is merely an anchor for a targeted child, then we
should not be updating the node at all. */
if (db->parent_baton == NULL
&& *eb->target_basename != '\0')
{
/* And we should not have received any changes! */
SVN_ERR_ASSERT(db->propchanges->nelts == 0);
/* ... which also implies NEW_CHANGED_* are not set,
and NEW_BASE_PROPS == NULL. */
}
else
{
apr_hash_t *props;
apr_array_header_t *iprops = NULL;
/* ### we know a base node already exists. it was created in
### open_directory or add_directory. let's just preserve the
### existing DEPTH value, and possibly CHANGED_*. */
/* If we received any changed_* values, then use them. */
if (SVN_IS_VALID_REVNUM(new_changed_rev))
db->changed_rev = new_changed_rev;
if (new_changed_date != 0)
db->changed_date = new_changed_date;
if (new_changed_author != NULL)
db->changed_author = new_changed_author;
/* If no depth is set yet, set to infinity. */
if (db->ambient_depth == svn_depth_unknown)
db->ambient_depth = svn_depth_infinity;
if (eb->depth_is_sticky
&& db->ambient_depth != eb->requested_depth)
{
/* After a depth upgrade the entry must reflect the new depth.
Upgrading to infinity changes the depth of *all* directories,
upgrading to something else only changes the target. */
if (eb->requested_depth == svn_depth_infinity
|| (strcmp(db->local_abspath, eb->target_abspath) == 0
&& eb->requested_depth > db->ambient_depth))
{
db->ambient_depth = eb->requested_depth;
}
}
/* Do we have new properties to install? Or shall we simply retain
the prior set of properties? If we're installing new properties,
then we also want to write them to an old-style props file. */
props = new_base_props;
if (props == NULL)
props = base_props;
if (conflict_skel)
{
svn_skel_t *work_item;
SVN_ERR(complete_conflict(conflict_skel,
db->edit_baton,
db->local_abspath,
db->old_repos_relpath,
db->old_revision,
db->new_repos_relpath,
svn_node_dir, svn_node_dir,
(db->parent_baton
&& db->parent_baton->deletion_conflicts)
? svn_hash_gets(
db->parent_baton->deletion_conflicts,
db->name)
: NULL,
db->pool, scratch_pool));
SVN_ERR(svn_wc__conflict_create_markers(&work_item,
eb->db, db->local_abspath,
conflict_skel,
scratch_pool, scratch_pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item,
scratch_pool);
}
/* Any inherited props to be set set for this base node? */
if (eb->wcroot_iprops)
{
iprops = svn_hash_gets(eb->wcroot_iprops, db->local_abspath);
/* close_edit may also update iprops for switched nodes, catching
those for which close_directory is never called (e.g. a switch
with no changes). So as a minor optimization we remove any
iprops from the hash so as not to set them again in
close_edit. */
if (iprops)
svn_hash_sets(eb->wcroot_iprops, db->local_abspath, NULL);
}
/* Update the BASE data for the directory and mark the directory
complete */
SVN_ERR(svn_wc__db_base_add_directory(
eb->db, db->local_abspath,
eb->wcroot_abspath,
db->new_repos_relpath,
eb->repos_root, eb->repos_uuid,
*eb->target_revision,
props,
db->changed_rev, db->changed_date, db->changed_author,
NULL /* children */,
db->ambient_depth,
(dav_prop_changes->nelts > 0)
? svn_prop_array_to_hash(dav_prop_changes, pool)
: NULL,
(! db->shadowed) && new_base_props != NULL,
new_actual_props, iprops,
conflict_skel, all_work_items,
scratch_pool));
}
/* Process all of the queued work items for this directory. */
SVN_ERR(svn_wc__wq_run(eb->db, db->local_abspath,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
if (db->parent_baton)
svn_hash_sets(db->parent_baton->not_present_nodes, db->name, NULL);
if (conflict_skel && eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, db->local_abspath,
svn_node_dir,
conflict_skel,
NULL /* merge_options */,
eb->conflict_func,
eb->conflict_baton,
eb->cancel_func,
eb->cancel_baton,
scratch_pool));
/* Notify of any prop changes on this directory -- but do nothing if
it's an added or skipped directory, because notification has already
happened in that case - unless the add was obstructed by a dir
scheduled for addition without history, in which case we handle
notification here). */
if (!db->already_notified && eb->notify_func && db->edited)
{
svn_wc_notify_t *notify;
svn_wc_notify_action_t action;
if (db->shadowed || db->edit_obstructed)
action = svn_wc_notify_update_shadowed_update;
else if (db->obstruction_found || db->add_existed)
action = svn_wc_notify_exists;
else
action = svn_wc_notify_update_update;
notify = svn_wc_create_notify(db->local_abspath, action, pool);
notify->kind = svn_node_dir;
notify->prop_state = prop_state;
notify->revision = *eb->target_revision;
notify->old_revision = db->old_revision;
eb->notify_func(eb->notify_baton, notify, scratch_pool);
}
if (db->edited)
eb->edited = db->edited;
/* We're done with this directory, so remove one reference from the
bump information. */
SVN_ERR(maybe_release_dir_info(db));
return SVN_NO_ERROR;
}
/* Common code for 'absent_file' and 'absent_directory'. */
static svn_error_t *
absent_node(const char *path,
svn_node_kind_t absent_kind,
void *parent_baton,
apr_pool_t *pool)
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
apr_pool_t *scratch_pool = svn_pool_create(pool);
const char *name = svn_dirent_basename(path, NULL);
const char *local_abspath;
svn_error_t *err;
svn_wc__db_status_t status;
svn_node_kind_t kind;
svn_skel_t *tree_conflict = NULL;
if (pb->skip_this)
return SVN_NO_ERROR;
- SVN_ERR(mark_directory_edited(pb, scratch_pool));
-
local_abspath = svn_dirent_join(pb->local_abspath, name, scratch_pool);
-
/* If an item by this name is scheduled for addition that's a
genuine tree-conflict. */
err = svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
eb->db, local_abspath,
scratch_pool, scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
status = svn_wc__db_status_not_present;
kind = svn_node_unknown;
}
+ if (status != svn_wc__db_status_server_excluded)
+ SVN_ERR(mark_directory_edited(pb, scratch_pool));
+ /* Else fall through as we should update the revision anyway */
+
if (status == svn_wc__db_status_normal)
{
svn_boolean_t wcroot;
/* We found an obstructing working copy or a file external! */
SVN_ERR(svn_wc__db_is_wcroot(&wcroot, eb->db, local_abspath,
scratch_pool));
if (wcroot)
{
/*
We have an obstructing working copy; possibly a directory external
We can do two things now:
1) notify the user, record a skip, etc.
2) Just record the absent node in BASE in the parent
working copy.
As option 2 happens to be exactly what we do anyway, fall through.
*/
}
else
{
- /* The server asks us to replace a file external
- (Existing BASE node; not reported by the working copy crawler or
- there would have been a delete_entry() call.
+ svn_boolean_t file_external;
+ svn_revnum_t revnum;
- There is no way we can store this state in the working copy as
- the BASE layer is already filled.
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, &revnum, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ &file_external,
+ eb->db, local_abspath,
+ scratch_pool, scratch_pool));
- We could error out, but that is not helping anybody; the user is not
- even seeing with what the file external would be replaced, so let's
- report a skip and continue the update.
- */
-
- if (eb->notify_func)
+ if (file_external)
{
- svn_wc_notify_t *notify;
- notify = svn_wc_create_notify(
+ /* The server asks us to replace a file external
+ (Existing BASE node; not reported by the working copy crawler
+ or there would have been a delete_entry() call.
+
+ There is no way we can store this state in the working copy as
+ the BASE layer is already filled.
+ We could error out, but that is not helping anybody; the user is not
+ even seeing with what the file external would be replaced, so let's
+ report a skip and continue the update.
+ */
+
+ if (eb->notify_func)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify(
local_abspath,
svn_wc_notify_update_skip_obstruction,
scratch_pool);
- eb->notify_func(eb->notify_baton, notify, scratch_pool);
+ eb->notify_func(eb->notify_baton, notify, scratch_pool);
+ }
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
}
+ else
+ {
+ /* We have a normal local node that will now be hidden for the
+ user. Let's try to delete what is there. This may introduce
+ tree conflicts if there are local changes */
+ SVN_ERR(delete_entry(path, revnum, pb, scratch_pool));
- svn_pool_destroy(scratch_pool);
- return SVN_NO_ERROR;
+ /* delete_entry() promises that BASE is empty after the operation,
+ so we can just fall through now */
+ }
}
}
else if (status == svn_wc__db_status_not_present
|| status == svn_wc__db_status_server_excluded
|| status == svn_wc__db_status_excluded)
{
/* The BASE node is not actually there, so we can safely turn it into
an absent node */
}
else
{
/* We have a local addition. If this would be a BASE node it would have
been deleted before we get here. (Which might have turned it into
a copy). */
SVN_ERR_ASSERT(status != svn_wc__db_status_normal);
if (!pb->shadowed && !pb->edit_obstructed)
SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
status, FALSE, svn_node_unknown,
svn_wc_conflict_action_add,
scratch_pool, scratch_pool));
}
{
const char *repos_relpath;
repos_relpath = svn_relpath_join(pb->new_repos_relpath, name, scratch_pool);
if (tree_conflict)
SVN_ERR(complete_conflict(tree_conflict, eb, local_abspath,
NULL, SVN_INVALID_REVNUM, repos_relpath,
kind, svn_node_unknown, NULL,
scratch_pool, scratch_pool));
/* Insert an excluded node below the parent node to note that this child
is absent. (This puts it in the parent db if the child is obstructed) */
SVN_ERR(svn_wc__db_base_add_excluded_node(eb->db, local_abspath,
repos_relpath, eb->repos_root,
eb->repos_uuid,
*(eb->target_revision),
absent_kind,
svn_wc__db_status_server_excluded,
tree_conflict, NULL,
scratch_pool));
if (tree_conflict)
{
if (eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, local_abspath,
kind,
tree_conflict,
NULL /* merge_options */,
eb->conflict_func,
eb->conflict_baton,
eb->cancel_func,
eb->cancel_baton,
scratch_pool));
do_notification(eb, local_abspath, kind, svn_wc_notify_tree_conflict,
scratch_pool);
}
}
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
absent_file(const char *path,
void *parent_baton,
apr_pool_t *pool)
{
return absent_node(path, svn_node_file, parent_baton, pool);
}
/* An svn_delta_editor_t function. */
static svn_error_t *
absent_directory(const char *path,
void *parent_baton,
apr_pool_t *pool)
{
return absent_node(path, svn_node_dir, parent_baton, pool);
}
/* An svn_delta_editor_t function. */
static svn_error_t *
add_file(const char *path,
void *parent_baton,
const char *copyfrom_path,
svn_revnum_t copyfrom_rev,
apr_pool_t *pool,
void **file_baton)
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
struct file_baton *fb;
svn_node_kind_t kind;
svn_node_kind_t wc_kind;
svn_wc__db_status_t status;
apr_pool_t *scratch_pool;
svn_boolean_t conflicted;
svn_boolean_t conflict_ignored = FALSE;
svn_boolean_t versioned_locally_and_present;
svn_skel_t *tree_conflict = NULL;
svn_error_t *err = SVN_NO_ERROR;
SVN_ERR_ASSERT(! (copyfrom_path || SVN_IS_VALID_REVNUM(copyfrom_rev)));
SVN_ERR(make_file_baton(&fb, pb, path, TRUE, pool));
*file_baton = fb;
if (fb->skip_this)
return SVN_NO_ERROR;
SVN_ERR(calculate_repos_relpath(&fb->new_repos_relpath, fb->local_abspath,
NULL, eb, pb, fb->pool, pool));
SVN_ERR(mark_file_edited(fb, pool));
/* The file_pool can stick around for a *long* time, so we want to
use a subpool for any temporary allocations. */
scratch_pool = svn_pool_create(pool);
/* It may not be named the same as the administrative directory. */
if (svn_wc_is_adm_dir(fb->name, pool))
return svn_error_createf(
SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("Failed to add file '%s': object of the same name as the "
"administrative directory"),
svn_dirent_local_style(fb->local_abspath, pool));
if (!eb->clean_checkout)
{
SVN_ERR(svn_io_check_path(fb->local_abspath, &kind, scratch_pool));
err = svn_wc__db_read_info(&status, &wc_kind, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
&conflicted, NULL, NULL, NULL, NULL, NULL, NULL,
eb->db, fb->local_abspath,
scratch_pool, scratch_pool);
}
else
{
kind = svn_node_none;
status = svn_wc__db_status_not_present;
wc_kind = svn_node_unknown;
conflicted = FALSE;
}
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
wc_kind = svn_node_unknown;
conflicted = FALSE;
versioned_locally_and_present = FALSE;
}
else if (status == svn_wc__db_status_normal && wc_kind == svn_node_unknown)
{
SVN_ERR_ASSERT(conflicted);
versioned_locally_and_present = FALSE; /* Tree conflict ACTUAL-only node */
}
else if (status == svn_wc__db_status_normal
|| status == svn_wc__db_status_incomplete)
{
svn_boolean_t root;
SVN_ERR(svn_wc__db_is_wcroot(&root, eb->db, fb->local_abspath,
scratch_pool));
if (root)
{
/* !! We found the root of a working copy obstructing the wc !!
If the directory would be part of our own working copy then
we wouldn't have been called as an add_directory().
The only thing we can do is add a not-present node, to allow
a future update to bring in the new files when the problem is
resolved. Note that svn_wc__db_base_add_not_present_node()
explicitly adds the node into the parent's node database. */
svn_hash_sets(pb->not_present_nodes,
apr_pstrdup(pb->pool, fb->name),
svn_node_kind_to_word(svn_node_dir));
}
else if (wc_kind == svn_node_dir)
{
/* We have an editor violation. Github sometimes does this
in its subversion compatibility code, when changing the
depth of a working copy, or on updates from incomplete */
}
else
{
/* We found a file external occupating the place we need in BASE.
We can't add a not-present node in this case as that would overwrite
the file external. Luckily the file external itself stops us from
forgetting a child of this parent directory like an obstructing
working copy would.
The reason we get here is that the adm crawler doesn't report
file externals.
*/
SVN_ERR_ASSERT(wc_kind == svn_node_file
|| wc_kind == svn_node_symlink);
}
SVN_ERR(remember_skipped_tree(eb, fb->local_abspath, pool));
fb->skip_this = TRUE;
fb->already_notified = TRUE;
do_notification(eb, fb->local_abspath, wc_kind,
svn_wc_notify_update_skip_obstruction, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else
versioned_locally_and_present = IS_NODE_PRESENT(status);
/* Is this path a conflict victim? */
if (fb->shadowed)
conflicted = FALSE; /* Conflict applies to WORKING */
else if (conflicted)
{
if (pb->deletion_conflicts)
tree_conflict = svn_hash_gets(pb->deletion_conflicts, fb->name);
if (tree_conflict)
{
svn_wc_conflict_reason_t reason;
const char *move_src_op_root_abspath;
/* So this deletion wasn't just a deletion, it is actually a
replacement. Let's install a better tree conflict. */
SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL,
&move_src_op_root_abspath,
eb->db,
fb->local_abspath,
tree_conflict,
fb->pool, scratch_pool));
tree_conflict = svn_wc__conflict_skel_create(fb->pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
tree_conflict,
eb->db, fb->local_abspath,
reason, svn_wc_conflict_action_replace,
move_src_op_root_abspath,
fb->pool, scratch_pool));
/* And now stop checking for conflicts here and just perform
a shadowed update */
fb->edit_conflict = tree_conflict; /* Cache for close_file */
tree_conflict = NULL; /* No direct notification */
fb->shadowed = TRUE; /* Just continue */
conflicted = FALSE; /* No skip */
}
else
SVN_ERR(node_already_conflicted(&conflicted, &conflict_ignored,
eb->db, fb->local_abspath, pool));
}
/* Now the usual conflict handling: skip. */
if (conflicted)
{
SVN_ERR(remember_skipped_tree(eb, fb->local_abspath, pool));
fb->skip_this = TRUE;
fb->already_notified = TRUE;
/* We skip this node, but once the update completes the parent node will
be updated to the new revision. So a future recursive update of the
parent will not bring in this new node as the revision of the parent
describes to the repository that all children are available.
To resolve this problem, we add a not-present node to allow bringing
the node in once this conflict is resolved.
Note that we can safely assume that no present base node exists,
because then we would not have received an add_file.
*/
svn_hash_sets(pb->not_present_nodes, apr_pstrdup(pb->pool, fb->name),
svn_node_kind_to_word(svn_node_file));
do_notification(eb, fb->local_abspath, svn_node_file,
svn_wc_notify_skip_conflicted, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else if (conflict_ignored)
{
fb->shadowed = TRUE;
}
if (fb->shadowed)
{
/* Nothing to check; does not and will not exist in working copy */
}
else if (versioned_locally_and_present)
{
/* What to do with a versioned or schedule-add file:
If the UUID doesn't match the parent's, or the URL isn't a child of
the parent dir's URL, it's an error.
Set add_existed so that user notification is delayed until after any
text or prop conflicts have been found.
Whether the incoming add is a symlink or a file will only be known in
close_file(), when the props are known. So with a locally added file
or symlink, let close_file() check for a tree conflict.
We will never see missing files here, because these would be
re-added during the crawler phase. */
svn_boolean_t local_is_file;
/* Is the local node a copy or move */
if (status == svn_wc__db_status_added)
SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL,
eb->db, fb->local_abspath,
scratch_pool, scratch_pool));
/* Is there something that is a file? */
local_is_file = (wc_kind == svn_node_file
|| wc_kind == svn_node_symlink);
/* Do tree conflict checking if
* - if there is a local copy.
* - if this is a switch operation
* - the node kinds mismatch
*
* During switch, local adds at the same path as incoming adds get
* "lost" in that switching back to the original will no longer have the
* local add. So switch always alerts the user with a tree conflict. */
if (!eb->adds_as_modification
|| !local_is_file
|| status != svn_wc__db_status_added)
{
SVN_ERR(check_tree_conflict(&tree_conflict, eb,
fb->local_abspath,
status, FALSE, svn_node_none,
svn_wc_conflict_action_add,
fb->pool, scratch_pool));
}
if (tree_conflict == NULL)
fb->add_existed = TRUE; /* Take over WORKING */
else
fb->shadowed = TRUE; /* Only update BASE */
}
else if (kind != svn_node_none)
{
/* There's an unversioned node at this path. */
fb->obstruction_found = TRUE;
/* Unversioned, obstructing files are handled by text merge/conflict,
* if unversioned obstructions are allowed. */
if (! (kind == svn_node_file && eb->allow_unver_obstructions))
{
/* Bring in the node as deleted */ /* ### Obstructed Conflict */
fb->shadowed = TRUE;
/* Mark a conflict */
tree_conflict = svn_wc__conflict_skel_create(fb->pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
tree_conflict,
eb->db, fb->local_abspath,
svn_wc_conflict_reason_unversioned,
svn_wc_conflict_action_add,
NULL,
fb->pool, scratch_pool));
}
}
/* When this is not the update target add a not-present BASE node now,
to allow marking the parent directory complete in its close_edit() call.
This resolves issues when that occurs before the close_file(). */
if (pb->parent_baton
|| *eb->target_basename == '\0'
|| (strcmp(fb->local_abspath, eb->target_abspath) != 0))
{
svn_hash_sets(pb->not_present_nodes, apr_pstrdup(pb->pool, fb->name),
svn_node_kind_to_word(svn_node_file));
}
if (tree_conflict != NULL)
{
SVN_ERR(complete_conflict(tree_conflict,
fb->edit_baton,
fb->local_abspath,
fb->old_repos_relpath,
fb->old_revision,
fb->new_repos_relpath,
wc_kind, svn_node_file,
pb->deletion_conflicts
? svn_hash_gets(pb->deletion_conflicts,
fb->name)
: NULL,
fb->pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_conflict(eb->db,
fb->local_abspath,
tree_conflict, NULL,
scratch_pool));
fb->edit_conflict = tree_conflict;
fb->already_notified = TRUE;
do_notification(eb, fb->local_abspath, svn_node_file,
svn_wc_notify_tree_conflict, scratch_pool);
}
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
open_file(const char *path,
void *parent_baton,
svn_revnum_t base_revision,
apr_pool_t *pool,
void **file_baton)
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
struct file_baton *fb;
svn_boolean_t conflicted;
svn_boolean_t conflict_ignored = FALSE;
svn_boolean_t have_work;
svn_wc__db_status_t status;
svn_node_kind_t wc_kind;
svn_skel_t *tree_conflict = NULL;
/* the file_pool can stick around for a *long* time, so we want to use
a subpool for any temporary allocations. */
apr_pool_t *scratch_pool = svn_pool_create(pool);
SVN_ERR(make_file_baton(&fb, pb, path, FALSE, pool));
*file_baton = fb;
if (fb->skip_this)
return SVN_NO_ERROR;
/* Detect obstructing working copies */
{
svn_boolean_t is_root;
SVN_ERR(svn_wc__db_is_wcroot(&is_root, eb->db, fb->local_abspath,
pool));
if (is_root)
{
/* Just skip this node; a future update will handle it */
SVN_ERR(remember_skipped_tree(eb, fb->local_abspath, pool));
fb->skip_this = TRUE;
fb->already_notified = TRUE;
do_notification(eb, fb->local_abspath, svn_node_file,
svn_wc_notify_update_skip_obstruction, pool);
return SVN_NO_ERROR;
}
}
/* Sanity check. */
SVN_ERR(svn_wc__db_read_info(&status, &wc_kind, &fb->old_revision,
&fb->old_repos_relpath, NULL, NULL,
&fb->changed_rev, &fb->changed_date,
&fb->changed_author, NULL,
&fb->original_checksum, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
&conflicted, NULL, NULL, &fb->local_prop_mods,
NULL, NULL, &have_work,
eb->db, fb->local_abspath,
fb->pool, scratch_pool));
if (have_work)
SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, &fb->old_revision,
&fb->old_repos_relpath, NULL, NULL,
&fb->changed_rev, &fb->changed_date,
&fb->changed_author, NULL,
&fb->original_checksum, NULL, NULL,
NULL, NULL, NULL,
eb->db, fb->local_abspath,
fb->pool, scratch_pool));
SVN_ERR(calculate_repos_relpath(&fb->new_repos_relpath, fb->local_abspath,
fb->old_repos_relpath, eb, pb,
fb->pool, scratch_pool));
/* Is this path a conflict victim? */
if (fb->shadowed)
conflicted = FALSE; /* Conflict applies to WORKING */
else if (conflicted)
SVN_ERR(node_already_conflicted(&conflicted, &conflict_ignored,
eb->db, fb->local_abspath, pool));
if (conflicted)
{
SVN_ERR(remember_skipped_tree(eb, fb->local_abspath, pool));
fb->skip_this = TRUE;
fb->already_notified = TRUE;
do_notification(eb, fb->local_abspath, svn_node_unknown,
svn_wc_notify_skip_conflicted, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else if (conflict_ignored)
{
fb->shadowed = TRUE;
}
/* Check for conflicts only when we haven't already recorded
* a tree-conflict on a parent node. */
if (!fb->shadowed)
SVN_ERR(check_tree_conflict(&tree_conflict, eb, fb->local_abspath,
status, TRUE, svn_node_file,
svn_wc_conflict_action_edit,
fb->pool, scratch_pool));
/* Is this path the victim of a newly-discovered tree conflict? */
if (tree_conflict != NULL)
{
svn_wc_conflict_reason_t reason;
fb->edit_conflict = tree_conflict;
/* Other modifications wouldn't be a tree conflict */
SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, NULL,
eb->db, fb->local_abspath,
tree_conflict,
scratch_pool, scratch_pool));
SVN_ERR_ASSERT(reason == svn_wc_conflict_reason_deleted
|| reason == svn_wc_conflict_reason_moved_away
|| reason == svn_wc_conflict_reason_replaced
|| reason == svn_wc_conflict_reason_obstructed);
/* Continue updating BASE */
if (reason == svn_wc_conflict_reason_obstructed)
fb->edit_obstructed = TRUE;
else
fb->shadowed = TRUE;
}
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
/* Implements svn_stream_lazyopen_func_t. */
static svn_error_t *
lazy_open_source(svn_stream_t **stream,
void *baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
struct file_baton *fb = baton;
SVN_ERR(svn_wc__db_pristine_read(stream, NULL, fb->edit_baton->db,
fb->local_abspath,
fb->original_checksum,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
/* Implements svn_stream_lazyopen_func_t. */
static svn_error_t *
lazy_open_target(svn_stream_t **stream,
void *baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
struct handler_baton *hb = baton;
svn_wc__db_install_data_t *install_data;
/* By convention return value is undefined on error, but we rely
on HB->INSTALL_DATA value in window_handler() and abort
INSTALL_STREAM if is not NULL on error.
So we store INSTALL_DATA to local variable first, to leave
HB->INSTALL_DATA unchanged on error. */
SVN_ERR(svn_wc__db_pristine_prepare_install(stream,
&install_data,
&hb->new_text_base_sha1_checksum,
NULL,
hb->fb->edit_baton->db,
hb->fb->dir_baton->local_abspath,
result_pool, scratch_pool));
hb->install_data = install_data;
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
apply_textdelta(void *file_baton,
const char *expected_checksum,
apr_pool_t *pool,
svn_txdelta_window_handler_t *handler,
void **handler_baton)
{
struct file_baton *fb = file_baton;
apr_pool_t *handler_pool = svn_pool_create(fb->pool);
struct handler_baton *hb = apr_pcalloc(handler_pool, sizeof(*hb));
struct edit_baton *eb = fb->edit_baton;
const svn_checksum_t *recorded_base_checksum;
svn_checksum_t *expected_base_checksum;
svn_stream_t *source;
svn_stream_t *target;
if (fb->skip_this)
{
*handler = svn_delta_noop_window_handler;
*handler_baton = NULL;
return SVN_NO_ERROR;
}
SVN_ERR(mark_file_edited(fb, pool));
/* Parse checksum or sets expected_base_checksum to NULL */
SVN_ERR(svn_checksum_parse_hex(&expected_base_checksum, svn_checksum_md5,
expected_checksum, pool));
/* Before applying incoming svndiff data to text base, make sure
text base hasn't been corrupted, and that its checksum
matches the expected base checksum. */
/* The incoming delta is targeted against EXPECTED_BASE_CHECKSUM. Find and
check our RECORDED_BASE_CHECKSUM. (In WC-1, we could not do this test
for replaced nodes because we didn't store the checksum of the "revert
base". In WC-NG, we do and we can.) */
recorded_base_checksum = fb->original_checksum;
/* If we have a checksum that we want to compare to a MD5 checksum,
ensure that it is a MD5 checksum */
if (recorded_base_checksum
&& expected_base_checksum
&& recorded_base_checksum->kind != svn_checksum_md5)
SVN_ERR(svn_wc__db_pristine_get_md5(&recorded_base_checksum,
eb->db, eb->wcroot_abspath,
recorded_base_checksum, pool, pool));
if (!svn_checksum_match(expected_base_checksum, recorded_base_checksum))
return svn_error_createf(SVN_ERR_WC_CORRUPT_TEXT_BASE, NULL,
_("Checksum mismatch for '%s':\n"
" expected: %s\n"
" recorded: %s\n"),
svn_dirent_local_style(fb->local_abspath, pool),
svn_checksum_to_cstring_display(expected_base_checksum,
pool),
svn_checksum_to_cstring_display(recorded_base_checksum,
pool));
/* Open the text base for reading, unless this is an added file. */
/*
kff todo: what we really need to do here is:
1. See if there's a file or dir by this name already here.
2. See if it's under revision control.
3. If both are true, open text-base.
4. If only 1 is true, bail, because we can't go destroying user's
files (or as an alternative to bailing, move it to some tmp
name and somehow tell the user, but communicating with the
user without erroring is a whole callback system we haven't
finished inventing yet.)
*/
if (! fb->adding_file)
{
SVN_ERR_ASSERT(!fb->original_checksum
|| fb->original_checksum->kind == svn_checksum_sha1);
source = svn_stream_lazyopen_create(lazy_open_source, fb, FALSE,
handler_pool);
}
else
{
source = svn_stream_empty(handler_pool);
}
/* If we don't have a recorded checksum, use the ra provided checksum */
if (!recorded_base_checksum)
recorded_base_checksum = expected_base_checksum;
/* Checksum the text base while applying deltas */
if (recorded_base_checksum)
{
hb->expected_source_checksum = svn_checksum_dup(recorded_base_checksum,
handler_pool);
/* Wrap stream and store reference to allow calculating the
checksum. */
source = svn_stream_checksummed2(source,
&hb->actual_source_checksum,
NULL, recorded_base_checksum->kind,
TRUE, handler_pool);
hb->source_checksum_stream = source;
}
target = svn_stream_lazyopen_create(lazy_open_target, hb, TRUE, handler_pool);
/* Prepare to apply the delta. */
svn_txdelta_apply(source, target,
hb->new_text_base_md5_digest,
fb->local_abspath /* error_info */,
handler_pool,
&hb->apply_handler, &hb->apply_baton);
hb->pool = handler_pool;
hb->fb = fb;
/* We're all set. */
*handler_baton = hb;
*handler = window_handler;
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
change_file_prop(void *file_baton,
const char *name,
const svn_string_t *value,
apr_pool_t *scratch_pool)
{
struct file_baton *fb = file_baton;
svn_prop_t *propchange;
if (fb->skip_this)
return SVN_NO_ERROR;
/* Push a new propchange to the file baton's array of propchanges */
propchange = apr_array_push(fb->propchanges);
propchange->name = apr_pstrdup(fb->pool, name);
propchange->value = svn_string_dup(value, fb->pool);
if (!fb->edited && svn_property_kind2(name) == svn_prop_regular_kind)
SVN_ERR(mark_file_edited(fb, scratch_pool));
if (! fb->shadowed
&& strcmp(name, SVN_PROP_SPECIAL) == 0)
{
struct edit_baton *eb = fb->edit_baton;
svn_boolean_t modified = FALSE;
svn_boolean_t becomes_symlink;
svn_boolean_t was_symlink;
/* Let's see if we have a change as in some scenarios servers report
non-changes of properties. */
becomes_symlink = (value != NULL);
if (fb->adding_file)
was_symlink = becomes_symlink; /* No change */
else
{
apr_hash_t *props;
/* We read the server-props, not the ACTUAL props here as we just
want to see if this is really an incoming prop change. */
SVN_ERR(svn_wc__db_base_get_props(&props, eb->db,
fb->local_abspath,
scratch_pool, scratch_pool));
was_symlink = ((props
&& svn_hash_gets(props, SVN_PROP_SPECIAL) != NULL)
? svn_tristate_true
: svn_tristate_false);
}
if (was_symlink != becomes_symlink)
{
/* If the local node was not modified, we continue as usual, if
modified we want a tree conflict just like how we would handle
it when receiving a delete + add (aka "replace") */
if (fb->local_prop_mods)
modified = TRUE;
else
SVN_ERR(svn_wc__internal_file_modified_p(&modified, eb->db,
fb->local_abspath,
FALSE, scratch_pool));
}
if (modified)
{
if (!fb->edit_conflict)
fb->edit_conflict = svn_wc__conflict_skel_create(fb->pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
fb->edit_conflict,
eb->db, fb->local_abspath,
svn_wc_conflict_reason_edited,
svn_wc_conflict_action_replace,
NULL,
fb->pool, scratch_pool));
SVN_ERR(complete_conflict(fb->edit_conflict, fb->edit_baton,
fb->local_abspath, fb->old_repos_relpath,
fb->old_revision, fb->new_repos_relpath,
svn_node_file, svn_node_file,
NULL, fb->pool, scratch_pool));
/* Create a copy of the existing (pre update) BASE node in WORKING,
mark a tree conflict and handle the rest of the update as
shadowed */
SVN_ERR(svn_wc__db_op_make_copy(eb->db, fb->local_abspath,
fb->edit_conflict, NULL,
scratch_pool));
do_notification(eb, fb->local_abspath, svn_node_file,
svn_wc_notify_tree_conflict, scratch_pool);
/* Ok, we introduced a replacement, so we can now handle the rest
as a normal shadowed update */
fb->shadowed = TRUE;
fb->add_existed = FALSE;
fb->already_notified = TRUE;
}
}
return SVN_NO_ERROR;
}
/* Perform the actual merge of file changes between an original file,
identified by ORIGINAL_CHECKSUM (an empty file if NULL) to a new file
identified by NEW_CHECKSUM.
Merge the result into LOCAL_ABSPATH, which is part of the working copy
identified by WRI_ABSPATH. Use OLD_REVISION and TARGET_REVISION for naming
the intermediate files.
The rest of the arguments are passed to svn_wc__internal_merge().
*/
svn_error_t *
svn_wc__perform_file_merge(svn_skel_t **work_items,
svn_skel_t **conflict_skel,
svn_boolean_t *found_conflict,
svn_wc__db_t *db,
const char *local_abspath,
const char *wri_abspath,
const svn_checksum_t *new_checksum,
const svn_checksum_t *original_checksum,
apr_hash_t *old_actual_props,
const apr_array_header_t *ext_patterns,
svn_revnum_t old_revision,
svn_revnum_t target_revision,
const apr_array_header_t *propchanges,
const char *diff3_cmd,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
/* Actual file exists and has local mods:
Now we need to let loose svn_wc__internal_merge() to merge
the textual changes into the working file. */
const char *oldrev_str, *newrev_str, *mine_str;
const char *merge_left;
svn_boolean_t delete_left = FALSE;
const char *path_ext = "";
const char *new_pristine_abspath;
enum svn_wc_merge_outcome_t merge_outcome = svn_wc_merge_unchanged;
svn_skel_t *work_item;
*work_items = NULL;
SVN_ERR(svn_wc__db_pristine_get_path(&new_pristine_abspath,
db, wri_abspath, new_checksum,
scratch_pool, scratch_pool));
/* If we have any file extensions we're supposed to
preserve in generated conflict file names, then find
this path's extension. But then, if it isn't one of
the ones we want to keep in conflict filenames,
pretend it doesn't have an extension at all. */
if (ext_patterns && ext_patterns->nelts)
{
svn_path_splitext(NULL, &path_ext, local_abspath, scratch_pool);
if (! (*path_ext && svn_cstring_match_glob_list(path_ext, ext_patterns)))
path_ext = "";
}
/* old_revision can be invalid when the conflict is against a
local addition */
if (!SVN_IS_VALID_REVNUM(old_revision))
old_revision = 0;
oldrev_str = apr_psprintf(scratch_pool, ".r%ld%s%s",
old_revision,
*path_ext ? "." : "",
*path_ext ? path_ext : "");
newrev_str = apr_psprintf(scratch_pool, ".r%ld%s%s",
target_revision,
*path_ext ? "." : "",
*path_ext ? path_ext : "");
mine_str = apr_psprintf(scratch_pool, ".mine%s%s",
*path_ext ? "." : "",
*path_ext ? path_ext : "");
if (! original_checksum)
{
SVN_ERR(get_empty_tmp_file(&merge_left, db, wri_abspath,
result_pool, scratch_pool));
delete_left = TRUE;
}
else
SVN_ERR(svn_wc__db_pristine_get_path(&merge_left, db, wri_abspath,
original_checksum,
result_pool, scratch_pool));
/* Merge the changes from the old textbase to the new
textbase into the file we're updating.
Remember that this function wants full paths! */
SVN_ERR(svn_wc__internal_merge(&work_item,
conflict_skel,
&merge_outcome,
db,
merge_left,
new_pristine_abspath,
local_abspath,
wri_abspath,
oldrev_str, newrev_str, mine_str,
old_actual_props,
FALSE /* dry_run */,
diff3_cmd, NULL, propchanges,
cancel_func, cancel_baton,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
*found_conflict = (merge_outcome == svn_wc_merge_conflict);
/* If we created a temporary left merge file, get rid of it. */
if (delete_left)
{
SVN_ERR(svn_wc__wq_build_file_remove(&work_item, db, wri_abspath,
merge_left,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
}
return SVN_NO_ERROR;
}
/* This is the small planet. It has the complex responsibility of
* "integrating" a new revision of a file into a working copy.
*
* Given a file_baton FB for a file either already under version control, or
* prepared (see below) to join version control, fully install a
* new revision of the file.
*
* ### transitional: installation of the working file will be handled
* ### by the *INSTALL_PRISTINE flag.
*
* By "install", we mean: create a new text-base and prop-base, merge
* any textual and property changes into the working file, and finally
* update all metadata so that the working copy believes it has a new
* working revision of the file. All of this work includes being
* sensitive to eol translation, keyword substitution, and performing
* all actions accumulated the parent directory's work queue.
*
* Set *CONTENT_STATE to the state of the contents after the
* installation.
*
* Return values are allocated in RESULT_POOL and temporary allocations
* are performed in SCRATCH_POOL.
*/
static svn_error_t *
merge_file(svn_skel_t **work_items,
svn_skel_t **conflict_skel,
svn_boolean_t *install_pristine,
const char **install_from,
svn_wc_notify_state_t *content_state,
struct file_baton *fb,
apr_hash_t *actual_props,
apr_time_t last_changed_date,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
struct edit_baton *eb = fb->edit_baton;
struct dir_baton *pb = fb->dir_baton;
svn_boolean_t is_locally_modified;
svn_boolean_t found_text_conflict = FALSE;
SVN_ERR_ASSERT(! fb->shadowed
&& ! fb->obstruction_found
&& ! fb->edit_obstructed);
/*
When this function is called on file F, we assume the following
things are true:
- The new pristine text of F is present in the pristine store
iff FB->NEW_TEXT_BASE_SHA1_CHECKSUM is not NULL.
- The WC metadata still reflects the old version of F.
(We can still access the old pristine base text of F.)
The goal is to update the local working copy of F to reflect
the changes received from the repository, preserving any local
modifications.
*/
*work_items = NULL;
*install_pristine = FALSE;
*install_from = NULL;
/* Start by splitting the file path, getting an access baton for the parent,
and an entry for the file if any. */
/* Has the user made local mods to the working file?
Note that this compares to the current pristine file, which is
different from fb->old_text_base_path if we have a replaced-with-history
file. However, in the case we had an obstruction, we check against the
new text base.
*/
if (fb->adding_file && !fb->add_existed)
{
is_locally_modified = FALSE; /* There is no file: Don't check */
}
else
{
/* The working file is not an obstruction.
So: is the file modified, relative to its ORIGINAL pristine?
This function sets is_locally_modified to FALSE for
files that do not exist and for directories. */
SVN_ERR(svn_wc__internal_file_modified_p(&is_locally_modified,
eb->db, fb->local_abspath,
FALSE /* exact_comparison */,
scratch_pool));
}
/* For 'textual' merging, we use the following system:
When a file is modified and we have a new BASE:
- For text files
* svn_wc_merge uses diff3
* possibly makes backups and marks files as conflicted.
- For binary files
* svn_wc_merge makes backups and marks files as conflicted.
If a file is not modified and we have a new BASE:
* Install from pristine.
If we have property changes related to magic properties or if the
svn:keywords property is set:
* Retranslate from the working file.
*/
if (! is_locally_modified
&& fb->new_text_base_sha1_checksum)
{
/* If there are no local mods, who cares whether it's a text
or binary file! Just write a log command to overwrite
any working file with the new text-base. If newline
conversion or keyword substitution is activated, this
will happen as well during the copy.
For replaced files, though, we want to merge in the changes
even if the file is not modified compared to the (non-revert)
text-base. */
*install_pristine = TRUE;
}
else if (fb->new_text_base_sha1_checksum)
{
/* Actual file exists and has local mods:
Now we need to let loose svn_wc__merge_internal() to merge
the textual changes into the working file. */
SVN_ERR(svn_wc__perform_file_merge(work_items,
conflict_skel,
&found_text_conflict,
eb->db,
fb->local_abspath,
pb->local_abspath,
fb->new_text_base_sha1_checksum,
fb->add_existed
? NULL
: fb->original_checksum,
actual_props,
eb->ext_patterns,
fb->old_revision,
*eb->target_revision,
fb->propchanges,
eb->diff3_cmd,
eb->cancel_func, eb->cancel_baton,
result_pool, scratch_pool));
} /* end: working file exists and has mods */
else
{
/* There is no new text base, but let's see if the working file needs
to be updated for any other reason. */
apr_hash_t *keywords;
/* Determine if any of the propchanges are the "magic" ones that
might require changing the working file. */
svn_boolean_t magic_props_changed;
magic_props_changed = svn_wc__has_magic_property(fb->propchanges);
SVN_ERR(svn_wc__get_translate_info(NULL, NULL,
&keywords,
NULL,
eb->db, fb->local_abspath,
actual_props, TRUE,
scratch_pool, scratch_pool));
if (magic_props_changed || keywords)
{
/* Special edge-case: it's possible that this file installation
only involves propchanges, but that some of those props still
require a retranslation of the working file.
OR that the file doesn't involve propchanges which by themselves
require retranslation, but receiving a change bumps the revision
number which requires re-expansion of keywords... */
if (is_locally_modified)
{
const char *tmptext;
/* Copy and DEtranslate the working file to a temp text-base.
Note that detranslation is done according to the old props. */
SVN_ERR(svn_wc__internal_translated_file(
&tmptext, fb->local_abspath, eb->db, fb->local_abspath,
SVN_WC_TRANSLATE_TO_NF
| SVN_WC_TRANSLATE_NO_OUTPUT_CLEANUP,
eb->cancel_func, eb->cancel_baton,
result_pool, scratch_pool));
/* We always want to reinstall the working file if the magic
properties have changed, or there are any keywords present.
Note that TMPTEXT might actually refer to the working file
itself (the above function skips a detranslate when not
required). This is acceptable, as we will (re)translate
according to the new properties into a temporary file (from
the working file), and then rename the temp into place. Magic!
*/
*install_pristine = TRUE;
*install_from = tmptext;
}
else
{
/* Use our existing 'copy' from the pristine store instead
of making a new copy. This way we can use the standard code
to update the recorded size and modification time.
(Issue #3842) */
*install_pristine = TRUE;
}
}
}
/* Set the returned content state. */
if (found_text_conflict)
*content_state = svn_wc_notify_state_conflicted;
else if (fb->new_text_base_sha1_checksum)
{
if (is_locally_modified)
*content_state = svn_wc_notify_state_merged;
else
*content_state = svn_wc_notify_state_changed;
}
else
*content_state = svn_wc_notify_state_unchanged;
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
/* Mostly a wrapper around merge_file. */
static svn_error_t *
close_file(void *file_baton,
const char *expected_md5_digest,
apr_pool_t *pool)
{
struct file_baton *fb = file_baton;
struct dir_baton *pdb = fb->dir_baton;
struct edit_baton *eb = fb->edit_baton;
svn_wc_notify_state_t content_state, prop_state;
svn_wc_notify_lock_state_t lock_state;
svn_checksum_t *expected_md5_checksum = NULL;
apr_hash_t *new_base_props = NULL;
apr_hash_t *new_actual_props = NULL;
apr_array_header_t *entry_prop_changes;
apr_array_header_t *dav_prop_changes;
apr_array_header_t *regular_prop_changes;
apr_hash_t *current_base_props = NULL;
apr_hash_t *current_actual_props = NULL;
apr_hash_t *local_actual_props = NULL;
svn_skel_t *all_work_items = NULL;
svn_skel_t *conflict_skel = NULL;
svn_skel_t *work_item;
apr_pool_t *scratch_pool = fb->pool; /* Destroyed at function exit */
svn_boolean_t keep_recorded_info = FALSE;
const svn_checksum_t *new_checksum;
apr_array_header_t *iprops = NULL;
if (fb->skip_this)
{
svn_pool_destroy(fb->pool);
SVN_ERR(maybe_release_dir_info(pdb));
return SVN_NO_ERROR;
}
if (fb->edited)
conflict_skel = fb->edit_conflict;
if (expected_md5_digest)
SVN_ERR(svn_checksum_parse_hex(&expected_md5_checksum, svn_checksum_md5,
expected_md5_digest, scratch_pool));
if (fb->new_text_base_md5_checksum && expected_md5_checksum
&& !svn_checksum_match(expected_md5_checksum,
fb->new_text_base_md5_checksum))
return svn_error_trace(
svn_checksum_mismatch_err(expected_md5_checksum,
fb->new_text_base_md5_checksum,
scratch_pool,
_("Checksum mismatch for '%s'"),
svn_dirent_local_style(
fb->local_abspath, pool)));
/* Gather the changes for each kind of property. */
SVN_ERR(svn_categorize_props(fb->propchanges, &entry_prop_changes,
&dav_prop_changes, &regular_prop_changes,
scratch_pool));
/* Extract the changed_* and lock state information. */
{
svn_revnum_t new_changed_rev;
apr_time_t new_changed_date;
const char *new_changed_author;
SVN_ERR(accumulate_last_change(&new_changed_rev,
&new_changed_date,
&new_changed_author,
entry_prop_changes,
scratch_pool, scratch_pool));
if (SVN_IS_VALID_REVNUM(new_changed_rev))
fb->changed_rev = new_changed_rev;
if (new_changed_date != 0)
fb->changed_date = new_changed_date;
if (new_changed_author != NULL)
fb->changed_author = new_changed_author;
}
/* Determine whether the file has become unlocked. */
{
int i;
lock_state = svn_wc_notify_lock_state_unchanged;
for (i = 0; i < entry_prop_changes->nelts; ++i)
{
const svn_prop_t *prop
= &APR_ARRAY_IDX(entry_prop_changes, i, svn_prop_t);
/* If we see a change to the LOCK_TOKEN entry prop, then the only
possible change is its REMOVAL. Thus, the lock has been removed,
and we should likewise remove our cached copy of it. */
if (! strcmp(prop->name, SVN_PROP_ENTRY_LOCK_TOKEN))
{
/* If we lose the lock, but not because we are switching to
another url, remove the state lock from the wc */
if (! eb->switch_repos_relpath
|| strcmp(fb->new_repos_relpath, fb->old_repos_relpath) == 0)
{
SVN_ERR_ASSERT(prop->value == NULL);
SVN_ERR(svn_wc__db_lock_remove(eb->db, fb->local_abspath, NULL,
scratch_pool));
lock_state = svn_wc_notify_lock_state_unlocked;
}
break;
}
}
}
/* Install all kinds of properties. It is important to do this before
any file content merging, since that process might expand keywords, in
which case we want the new entryprops to be in place. */
/* Write log commands to merge REGULAR_PROPS into the existing
properties of FB->LOCAL_ABSPATH. Update *PROP_STATE to reflect
the result of the regular prop merge.
BASE_PROPS and WORKING_PROPS are hashes of the base and
working props of the file; if NULL they are read from the wc. */
/* ### some of this feels like voodoo... */
if ((!fb->adding_file || fb->add_existed)
&& !fb->shadowed)
SVN_ERR(svn_wc__get_actual_props(&local_actual_props,
eb->db, fb->local_abspath,
scratch_pool, scratch_pool));
if (local_actual_props == NULL)
local_actual_props = apr_hash_make(scratch_pool);
if (fb->add_existed)
{
/* This node already exists. Grab the current pristine properties. */
SVN_ERR(svn_wc__db_read_pristine_props(&current_base_props,
eb->db, fb->local_abspath,
scratch_pool, scratch_pool));
current_actual_props = local_actual_props;
}
else if (!fb->adding_file)
{
/* Get the BASE properties for proper merging. */
SVN_ERR(svn_wc__db_base_get_props(&current_base_props,
eb->db, fb->local_abspath,
scratch_pool, scratch_pool));
current_actual_props = local_actual_props;
}
/* Note: even if the node existed before, it may not have
pristine props (e.g a local-add) */
if (current_base_props == NULL)
current_base_props = apr_hash_make(scratch_pool);
/* And new nodes need an empty set of ACTUAL props. */
if (current_actual_props == NULL)
current_actual_props = apr_hash_make(scratch_pool);
prop_state = svn_wc_notify_state_unknown;
if (! fb->shadowed)
{
svn_boolean_t install_pristine;
const char *install_from = NULL;
/* Merge the 'regular' props into the existing working proplist. */
/* This will merge the old and new props into a new prop db, and
write <cp> commands to the logfile to install the merged
props. */
new_base_props = svn_prop__patch(current_base_props, regular_prop_changes,
scratch_pool);
SVN_ERR(svn_wc__merge_props(&conflict_skel,
&prop_state,
&new_actual_props,
eb->db,
fb->local_abspath,
NULL /* server_baseprops (update, not merge) */,
current_base_props,
current_actual_props,
regular_prop_changes, /* propchanges */
scratch_pool,
scratch_pool));
/* We will ALWAYS have properties to save (after a not-dry-run merge). */
SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL);
/* Merge the text. This will queue some additional work. */
if (!fb->obstruction_found && !fb->edit_obstructed)
{
svn_error_t *err;
err = merge_file(&work_item, &conflict_skel,
&install_pristine, &install_from,
&content_state, fb, current_actual_props,
fb->changed_date, scratch_pool, scratch_pool);
if (err && err->apr_err == SVN_ERR_WC_PATH_ACCESS_DENIED)
{
if (eb->notify_func)
{
svn_wc_notify_t *notify =svn_wc_create_notify(
fb->local_abspath,
svn_wc_notify_update_skip_access_denied,
scratch_pool);
notify->kind = svn_node_file;
notify->err = err;
eb->notify_func(eb->notify_baton, notify, scratch_pool);
}
svn_error_clear(err);
SVN_ERR(remember_skipped_tree(eb, fb->local_abspath,
scratch_pool));
fb->skip_this = TRUE;
svn_pool_destroy(fb->pool);
SVN_ERR(maybe_release_dir_info(pdb));
return SVN_NO_ERROR;
}
else
SVN_ERR(err);
all_work_items = svn_wc__wq_merge(all_work_items, work_item,
scratch_pool);
}
else
{
install_pristine = FALSE;
if (fb->new_text_base_sha1_checksum)
content_state = svn_wc_notify_state_changed;
else
content_state = svn_wc_notify_state_unchanged;
}
if (install_pristine)
{
svn_boolean_t record_fileinfo;
/* If we are installing from the pristine contents, then go ahead and
record the fileinfo. That will be the "proper" values. Installing
from some random file means the fileinfo does NOT correspond to
the pristine (in which case, the fileinfo will be cleared for
safety's sake). */
record_fileinfo = (install_from == NULL);
SVN_ERR(svn_wc__wq_build_file_install(&work_item,
eb->db,
fb->local_abspath,
install_from,
eb->use_commit_times,
record_fileinfo,
scratch_pool, scratch_pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item,
scratch_pool);
}
else if (lock_state == svn_wc_notify_lock_state_unlocked
&& !fb->obstruction_found)
{
/* If a lock was removed and we didn't update the text contents, we
might need to set the file read-only.
Note: this will also update the executable flag, but ... meh. */
SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, eb->db,
fb->local_abspath,
scratch_pool, scratch_pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item,
scratch_pool);
}
if (! install_pristine
&& (content_state == svn_wc_notify_state_unchanged))
{
/* It is safe to keep the current recorded timestamp and size */
keep_recorded_info = TRUE;
}
/* Clean up any temporary files. */
/* Remove the INSTALL_FROM file, as long as it doesn't refer to the
working file. */
if (install_from != NULL
&& strcmp(install_from, fb->local_abspath) != 0)
{
SVN_ERR(svn_wc__wq_build_file_remove(&work_item, eb->db,
fb->local_abspath, install_from,
scratch_pool, scratch_pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item,
scratch_pool);
}
}
else
{
/* Adding or updating a BASE node under a locally added node. */
apr_hash_t *fake_actual_props;
if (fb->adding_file)
fake_actual_props = apr_hash_make(scratch_pool);
else
fake_actual_props = current_base_props;
/* Store the incoming props (sent as propchanges) in new_base_props
and create a set of new actual props to use for notifications */
new_base_props = svn_prop__patch(current_base_props, regular_prop_changes,
scratch_pool);
SVN_ERR(svn_wc__merge_props(&conflict_skel,
&prop_state,
&new_actual_props,
eb->db,
fb->local_abspath,
NULL /* server_baseprops (not merging) */,
current_base_props /* pristine_props */,
fake_actual_props /* actual_props */,
regular_prop_changes, /* propchanges */
scratch_pool,
scratch_pool));
if (fb->new_text_base_sha1_checksum)
content_state = svn_wc_notify_state_changed;
else
content_state = svn_wc_notify_state_unchanged;
}
/* Insert/replace the BASE node with all of the new metadata. */
/* Set the 'checksum' column of the file's BASE_NODE row to
* NEW_TEXT_BASE_SHA1_CHECKSUM. The pristine text identified by that
* checksum is already in the pristine store. */
new_checksum = fb->new_text_base_sha1_checksum;
/* If we don't have a NEW checksum, then the base must not have changed.
Just carry over the old checksum. */
if (new_checksum == NULL)
new_checksum = fb->original_checksum;
if (conflict_skel)
{
SVN_ERR(complete_conflict(conflict_skel,
fb->edit_baton,
fb->local_abspath,
fb->old_repos_relpath,
fb->old_revision,
fb->new_repos_relpath,
svn_node_file, svn_node_file,
fb->dir_baton->deletion_conflicts
? svn_hash_gets(
fb->dir_baton->deletion_conflicts,
fb->name)
: NULL,
fb->pool, scratch_pool));
SVN_ERR(svn_wc__conflict_create_markers(&work_item,
eb->db, fb->local_abspath,
conflict_skel,
scratch_pool, scratch_pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item,
scratch_pool);
}
/* Any inherited props to be set set for this base node? */
if (eb->wcroot_iprops)
{
iprops = svn_hash_gets(eb->wcroot_iprops, fb->local_abspath);
/* close_edit may also update iprops for switched nodes, catching
those for which close_directory is never called (e.g. a switch
with no changes). So as a minor optimization we remove any
iprops from the hash so as not to set them again in
close_edit. */
if (iprops)
svn_hash_sets(eb->wcroot_iprops, fb->local_abspath, NULL);
}
SVN_ERR(svn_wc__db_base_add_file(eb->db, fb->local_abspath,
eb->wcroot_abspath,
fb->new_repos_relpath,
eb->repos_root, eb->repos_uuid,
*eb->target_revision,
new_base_props,
fb->changed_rev,
fb->changed_date,
fb->changed_author,
new_checksum,
(dav_prop_changes->nelts > 0)
? svn_prop_array_to_hash(
dav_prop_changes,
scratch_pool)
: NULL,
(fb->add_existed && fb->adding_file),
(! fb->shadowed) && new_base_props,
new_actual_props,
iprops,
keep_recorded_info,
(fb->shadowed && fb->obstruction_found),
conflict_skel,
all_work_items,
scratch_pool));
if (conflict_skel && eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, fb->local_abspath,
svn_node_file,
conflict_skel,
NULL /* merge_options */,
eb->conflict_func,
eb->conflict_baton,
eb->cancel_func,
eb->cancel_baton,
scratch_pool));
/* Deal with the WORKING tree, based on updates to the BASE tree. */
svn_hash_sets(fb->dir_baton->not_present_nodes, fb->name, NULL);
/* Send a notification to the callback function. (Skip notifications
about files which were already notified for another reason.) */
if (eb->notify_func && !fb->already_notified
&& (fb->edited || lock_state == svn_wc_notify_lock_state_unlocked))
{
svn_wc_notify_t *notify;
svn_wc_notify_action_t action = svn_wc_notify_update_update;
if (fb->edited)
{
if (fb->shadowed || fb->edit_obstructed)
action = fb->adding_file
? svn_wc_notify_update_shadowed_add
: svn_wc_notify_update_shadowed_update;
else if (fb->obstruction_found || fb->add_existed)
{
if (content_state != svn_wc_notify_state_conflicted)
action = svn_wc_notify_exists;
}
else if (fb->adding_file)
{
action = svn_wc_notify_update_add;
}
}
else
{
SVN_ERR_ASSERT(lock_state == svn_wc_notify_lock_state_unlocked);
action = svn_wc_notify_update_broken_lock;
}
/* If the file was moved-away, notify for the moved-away node.
* The original location only had its BASE info changed and
* we don't usually notify about such changes. */
notify = svn_wc_create_notify(fb->local_abspath, action, scratch_pool);
notify->kind = svn_node_file;
notify->content_state = content_state;
notify->prop_state = prop_state;
notify->lock_state = lock_state;
notify->revision = *eb->target_revision;
notify->old_revision = fb->old_revision;
/* Fetch the mimetype from the actual properties */
notify->mime_type = svn_prop_get_value(new_actual_props,
SVN_PROP_MIME_TYPE);
eb->notify_func(eb->notify_baton, notify, scratch_pool);
}
svn_pool_destroy(fb->pool); /* Destroy scratch_pool */
/* We have one less referrer to the directory */
SVN_ERR(maybe_release_dir_info(pdb));
return SVN_NO_ERROR;
}
/* Implements svn_wc__proplist_receiver_t.
* Check for the presence of an svn:keywords property and queues an install_file
* work queue item if present. Thus, when the work queue is run to complete the
* switch operation, all files with keywords will go through the translation
* process so URLs etc are updated. */
static svn_error_t *
update_keywords_after_switch_cb(void *baton,
const char *local_abspath,
apr_hash_t *props,
apr_pool_t *scratch_pool)
{
struct edit_baton *eb = baton;
svn_string_t *propval;
svn_boolean_t modified;
svn_boolean_t record_fileinfo;
svn_skel_t *work_items;
const char *install_from;
propval = svn_hash_gets(props, SVN_PROP_KEYWORDS);
if (!propval)
return SVN_NO_ERROR;
SVN_ERR(svn_wc__internal_file_modified_p(&modified, eb->db,
local_abspath, FALSE,
scratch_pool));
if (modified)
{
const char *temp_dir_abspath;
svn_stream_t *working_stream;
svn_stream_t *install_from_stream;
SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir_abspath, eb->db,
local_abspath, scratch_pool,
scratch_pool));
SVN_ERR(svn_stream_open_readonly(&working_stream, local_abspath,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_open_unique(&install_from_stream, &install_from,
temp_dir_abspath, svn_io_file_del_none,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_copy3(working_stream, install_from_stream,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
record_fileinfo = FALSE;
}
else
{
install_from = NULL;
record_fileinfo = TRUE;
}
SVN_ERR(svn_wc__wq_build_file_install(&work_items, eb->db, local_abspath,
install_from,
eb->use_commit_times,
record_fileinfo,
scratch_pool, scratch_pool));
if (install_from)
{
svn_skel_t *work_item;
SVN_ERR(svn_wc__wq_build_file_remove(&work_item, eb->db,
local_abspath, install_from,
scratch_pool, scratch_pool));
work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
}
SVN_ERR(svn_wc__db_wq_add(eb->db, local_abspath, work_items,
scratch_pool));
return SVN_NO_ERROR;
}
/* An svn_delta_editor_t function. */
static svn_error_t *
close_edit(void *edit_baton,
apr_pool_t *pool)
{
struct edit_baton *eb = edit_baton;
apr_pool_t *scratch_pool = eb->pool;
/* The editor didn't even open the root; we have to take care of
some cleanup stuffs. */
if (! eb->root_opened
&& *eb->target_basename == '\0')
{
/* We need to "un-incomplete" the root directory. */
SVN_ERR(svn_wc__db_temp_op_end_directory_update(eb->db,
eb->anchor_abspath,
scratch_pool));
}
/* By definition, anybody "driving" this editor for update or switch
purposes at a *minimum* must have called set_target_revision() at
the outset, and close_edit() at the end -- even if it turned out
that no changes ever had to be made, and open_root() was never
called. That's fine. But regardless, when the edit is over,
this editor needs to make sure that *all* paths have had their
revisions bumped to the new target revision. */
/* Make sure our update target now has the new working revision.
Also, if this was an 'svn switch', then rewrite the target's
url. All of this tweaking might happen recursively! Note
that if eb->target is NULL, that's okay (albeit "sneaky",
some might say). */
/* Extra check: if the update did nothing but make its target
'deleted', then do *not* run cleanup on the target, as it
will only remove the deleted entry! */
if (! eb->target_deleted)
{
SVN_ERR(svn_wc__db_op_bump_revisions_post_update(eb->db,
eb->target_abspath,
eb->requested_depth,
eb->switch_repos_relpath,
eb->repos_root,
eb->repos_uuid,
*(eb->target_revision),
eb->skipped_trees,
eb->wcroot_iprops,
! eb->edited,
eb->notify_func,
eb->notify_baton,
eb->pool));
if (*eb->target_basename != '\0')
{
svn_wc__db_status_t status;
svn_error_t *err;
/* Note: we are fetching information about the *target*, not anchor.
There is no guarantee that the target has a BASE node.
For example:
The node was not present in BASE, but locally-added, and the
update did not create a new BASE node "under" the local-add.
If there is no BASE node for the target, then we certainly don't
have to worry about removing it. */
err = svn_wc__db_base_get_info(&status, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
eb->db, eb->target_abspath,
scratch_pool, scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
}
else if (status == svn_wc__db_status_excluded)
{
/* There is a small chance that the explicit target of an update/
switch is gone in the repository, in that specific case the
node hasn't been re-added to the BASE tree by this update.
If so, we should get rid of this excluded node now. */
SVN_ERR(svn_wc__db_base_remove(eb->db, eb->target_abspath,
TRUE, FALSE, FALSE,
SVN_INVALID_REVNUM,
NULL, NULL, scratch_pool));
}
}
}
/* Update keywords in switched files.
GOTO #1975 (the year of the Altair 8800). */
if (eb->switch_repos_relpath)
{
svn_depth_t depth;
if (eb->requested_depth > svn_depth_empty)
depth = eb->requested_depth;
else
depth = svn_depth_infinity;
SVN_ERR(svn_wc__db_read_props_streamily(eb->db,
eb->target_abspath,
depth,
FALSE, /* pristine */
NULL, /* changelists */
update_keywords_after_switch_cb,
eb,
eb->cancel_func,
eb->cancel_baton,
scratch_pool));
}
/* The edit is over: run the wq with proper cancel support,
but first kill the handler that would run it on the pool
cleanup at the end of this function. */
apr_pool_cleanup_kill(eb->pool, eb, cleanup_edit_baton);
SVN_ERR(svn_wc__wq_run(eb->db, eb->wcroot_abspath,
eb->cancel_func, eb->cancel_baton,
eb->pool));
/* The edit is over, free its pool.
### No, this is wrong. Who says this editor/baton won't be used
again? But the change is not merely to remove this call. We
should also make eb->pool not be a subpool (see make_editor),
and change callers of svn_client_{checkout,update,switch} to do
better pool management. ### */
svn_pool_destroy(eb->pool);
return SVN_NO_ERROR;
}
/*** Returning editors. ***/
/* Helper for the three public editor-supplying functions. */
static svn_error_t *
make_editor(svn_revnum_t *target_revision,
svn_wc__db_t *db,
const char *anchor_abspath,
const char *target_basename,
apr_hash_t *wcroot_iprops,
svn_boolean_t use_commit_times,
const char *switch_url,
svn_depth_t depth,
svn_boolean_t depth_is_sticky,
svn_boolean_t allow_unver_obstructions,
svn_boolean_t adds_as_modification,
svn_boolean_t server_performs_filtering,
svn_boolean_t clean_checkout,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_dirents_func_t fetch_dirents_func,
void *fetch_dirents_baton,
svn_wc_conflict_resolver_func2_t conflict_func,
void *conflict_baton,
svn_wc_external_update_t external_func,
void *external_baton,
const char *diff3_cmd,
const apr_array_header_t *preserved_exts,
const svn_delta_editor_t **editor,
void **edit_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
struct edit_baton *eb;
void *inner_baton;
apr_pool_t *edit_pool = svn_pool_create(result_pool);
svn_delta_editor_t *tree_editor = svn_delta_default_editor(edit_pool);
const svn_delta_editor_t *inner_editor;
const char *repos_root, *repos_uuid;
struct svn_wc__shim_fetch_baton_t *sfb;
svn_delta_shim_callbacks_t *shim_callbacks =
svn_delta_shim_callbacks_default(edit_pool);
/* An unknown depth can't be sticky. */
if (depth == svn_depth_unknown)
depth_is_sticky = FALSE;
/* Get the anchor's repository root and uuid. The anchor must already exist
in BASE. */
SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, &repos_root,
&repos_uuid, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
db, anchor_abspath,
result_pool, scratch_pool));
/* With WC-NG we need a valid repository root */
SVN_ERR_ASSERT(repos_root != NULL && repos_uuid != NULL);
/* Disallow a switch operation to change the repository root of the target,
if that is known. */
if (switch_url && !svn_uri__is_ancestor(repos_root, switch_url))
return svn_error_createf(SVN_ERR_WC_INVALID_SWITCH, NULL,
_("'%s'\nis not the same repository as\n'%s'"),
switch_url, repos_root);
/* Construct an edit baton. */
eb = apr_pcalloc(edit_pool, sizeof(*eb));
eb->pool = edit_pool;
eb->use_commit_times = use_commit_times;
eb->target_revision = target_revision;
eb->repos_root = repos_root;
eb->repos_uuid = repos_uuid;
eb->db = db;
eb->target_basename = target_basename;
eb->anchor_abspath = anchor_abspath;
eb->wcroot_iprops = wcroot_iprops;
SVN_ERR(svn_wc__db_get_wcroot(&eb->wcroot_abspath, db, anchor_abspath,
edit_pool, scratch_pool));
if (switch_url)
eb->switch_repos_relpath =
svn_uri_skip_ancestor(repos_root, switch_url, scratch_pool);
else
eb->switch_repos_relpath = NULL;
if (svn_path_is_empty(target_basename))
eb->target_abspath = eb->anchor_abspath;
else
eb->target_abspath = svn_dirent_join(eb->anchor_abspath, target_basename,
edit_pool);
eb->requested_depth = depth;
eb->depth_is_sticky = depth_is_sticky;
eb->notify_func = notify_func;
eb->notify_baton = notify_baton;
eb->external_func = external_func;
eb->external_baton = external_baton;
eb->diff3_cmd = diff3_cmd;
eb->cancel_func = cancel_func;
eb->cancel_baton = cancel_baton;
eb->conflict_func = conflict_func;
eb->conflict_baton = conflict_baton;
eb->allow_unver_obstructions = allow_unver_obstructions;
eb->adds_as_modification = adds_as_modification;
eb->clean_checkout = clean_checkout;
eb->skipped_trees = apr_hash_make(edit_pool);
eb->dir_dirents = apr_hash_make(edit_pool);
eb->ext_patterns = preserved_exts;
apr_pool_cleanup_register(edit_pool, eb, cleanup_edit_baton,
apr_pool_cleanup_null);
/* Construct an editor. */
tree_editor->set_target_revision = set_target_revision;
tree_editor->open_root = open_root;
tree_editor->delete_entry = delete_entry;
tree_editor->add_directory = add_directory;
tree_editor->open_directory = open_directory;
tree_editor->change_dir_prop = change_dir_prop;
tree_editor->close_directory = close_directory;
tree_editor->absent_directory = absent_directory;
tree_editor->add_file = add_file;
tree_editor->open_file = open_file;
tree_editor->apply_textdelta = apply_textdelta;
tree_editor->change_file_prop = change_file_prop;
tree_editor->close_file = close_file;
tree_editor->absent_file = absent_file;
tree_editor->close_edit = close_edit;
/* Fiddle with the type system. */
inner_editor = tree_editor;
inner_baton = eb;
if (!depth_is_sticky
&& depth != svn_depth_unknown
&& svn_depth_empty <= depth && depth < svn_depth_infinity
&& fetch_dirents_func)
{
/* We are asked to perform an update at a depth less than the ambient
depth. In this case the update won't describe additions that would
have been reported if we updated at the ambient depth. */
svn_error_t *err;
svn_node_kind_t dir_kind;
svn_wc__db_status_t dir_status;
const char *dir_repos_relpath;
svn_depth_t dir_depth;
/* we have to do this on the target of the update, not the anchor */
err = svn_wc__db_base_get_info(&dir_status, &dir_kind, NULL,
&dir_repos_relpath, NULL, NULL, NULL,
NULL, NULL, &dir_depth, NULL, NULL, NULL,
NULL, NULL, NULL,
db, eb->target_abspath,
scratch_pool, scratch_pool);
if (!err
&& dir_kind == svn_node_dir
&& dir_status == svn_wc__db_status_normal)
{
if (dir_depth > depth)
{
apr_hash_t *dirents;
/* If we switch, we should look at the new relpath */
if (eb->switch_repos_relpath)
dir_repos_relpath = eb->switch_repos_relpath;
SVN_ERR(fetch_dirents_func(fetch_dirents_baton, &dirents,
repos_root, dir_repos_relpath,
edit_pool, scratch_pool));
if (dirents != NULL && apr_hash_count(dirents))
svn_hash_sets(eb->dir_dirents,
apr_pstrdup(edit_pool, dir_repos_relpath),
dirents);
}
if (depth == svn_depth_immediates)
{
/* Worst case scenario of issue #3569 fix: We have to do the
same for all existing subdirs, but then we check for
svn_depth_empty. */
const apr_array_header_t *children;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
SVN_ERR(svn_wc__db_base_get_children(&children, db,
eb->target_abspath,
scratch_pool,
iterpool));
for (i = 0; i < children->nelts; i++)
{
const char *child_abspath;
const char *child_name;
svn_pool_clear(iterpool);
child_name = APR_ARRAY_IDX(children, i, const char *);
child_abspath = svn_dirent_join(eb->target_abspath,
child_name, iterpool);
SVN_ERR(svn_wc__db_base_get_info(&dir_status, &dir_kind,
NULL, &dir_repos_relpath,
NULL, NULL, NULL, NULL,
NULL, &dir_depth, NULL,
NULL, NULL, NULL, NULL,
NULL,
db, child_abspath,
iterpool, iterpool));
if (dir_kind == svn_node_dir
&& dir_status == svn_wc__db_status_normal
&& dir_depth > svn_depth_empty)
{
apr_hash_t *dirents;
/* If we switch, we should look at the new relpath */
if (eb->switch_repos_relpath)
dir_repos_relpath = svn_relpath_join(
eb->switch_repos_relpath,
child_name, iterpool);
SVN_ERR(fetch_dirents_func(fetch_dirents_baton, &dirents,
repos_root, dir_repos_relpath,
edit_pool, iterpool));
if (dirents != NULL && apr_hash_count(dirents))
svn_hash_sets(eb->dir_dirents,
apr_pstrdup(edit_pool,
dir_repos_relpath),
dirents);
}
}
}
}
else if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
svn_error_clear(err);
else
SVN_ERR(err);
}
/* We need to limit the scope of our operation to the ambient depths
present in the working copy already, but only if the requested
depth is not sticky. If a depth was explicitly requested,
libsvn_delta/depth_filter_editor.c will ensure that we never see
editor calls that extend beyond the scope of the requested depth.
But even what we do so might extend beyond the scope of our
ambient depth. So we use another filtering editor to avoid
modifying the ambient working copy depth when not asked to do so.
(This can also be skipped if the server understands depth.) */
if (!server_performs_filtering
&& !depth_is_sticky)
SVN_ERR(svn_wc__ambient_depth_filter_editor(&inner_editor,
&inner_baton,
db,
anchor_abspath,
target_basename,
inner_editor,
inner_baton,
result_pool));
SVN_ERR(svn_delta_get_cancellation_editor(cancel_func,
cancel_baton,
inner_editor,
inner_baton,
editor,
edit_baton,
result_pool));
sfb = apr_palloc(result_pool, sizeof(*sfb));
sfb->db = db;
sfb->base_abspath = eb->anchor_abspath;
sfb->fetch_base = TRUE;
shim_callbacks->fetch_kind_func = svn_wc__fetch_kind_func;
shim_callbacks->fetch_props_func = svn_wc__fetch_props_func;
shim_callbacks->fetch_base_func = svn_wc__fetch_base_func;
shim_callbacks->fetch_baton = sfb;
SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton,
NULL, NULL, shim_callbacks,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__get_update_editor(const svn_delta_editor_t **editor,
void **edit_baton,
svn_revnum_t *target_revision,
svn_wc_context_t *wc_ctx,
const char *anchor_abspath,
const char *target_basename,
apr_hash_t *wcroot_iprops,
svn_boolean_t use_commit_times,
svn_depth_t depth,
svn_boolean_t depth_is_sticky,
svn_boolean_t allow_unver_obstructions,
svn_boolean_t adds_as_modification,
svn_boolean_t server_performs_filtering,
svn_boolean_t clean_checkout,
const char *diff3_cmd,
const apr_array_header_t *preserved_exts,
svn_wc_dirents_func_t fetch_dirents_func,
void *fetch_dirents_baton,
svn_wc_conflict_resolver_func2_t conflict_func,
void *conflict_baton,
svn_wc_external_update_t external_func,
void *external_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
return make_editor(target_revision, wc_ctx->db, anchor_abspath,
target_basename, wcroot_iprops, use_commit_times,
NULL, depth, depth_is_sticky, allow_unver_obstructions,
adds_as_modification, server_performs_filtering,
clean_checkout,
notify_func, notify_baton,
cancel_func, cancel_baton,
fetch_dirents_func, fetch_dirents_baton,
conflict_func, conflict_baton,
external_func, external_baton,
diff3_cmd, preserved_exts, editor, edit_baton,
result_pool, scratch_pool);
}
svn_error_t *
svn_wc__get_switch_editor(const svn_delta_editor_t **editor,
void **edit_baton,
svn_revnum_t *target_revision,
svn_wc_context_t *wc_ctx,
const char *anchor_abspath,
const char *target_basename,
const char *switch_url,
apr_hash_t *wcroot_iprops,
svn_boolean_t use_commit_times,
svn_depth_t depth,
svn_boolean_t depth_is_sticky,
svn_boolean_t allow_unver_obstructions,
svn_boolean_t server_performs_filtering,
const char *diff3_cmd,
const apr_array_header_t *preserved_exts,
svn_wc_dirents_func_t fetch_dirents_func,
void *fetch_dirents_baton,
svn_wc_conflict_resolver_func2_t conflict_func,
void *conflict_baton,
svn_wc_external_update_t external_func,
void *external_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
SVN_ERR_ASSERT(switch_url && svn_uri_is_canonical(switch_url, scratch_pool));
return make_editor(target_revision, wc_ctx->db, anchor_abspath,
target_basename, wcroot_iprops, use_commit_times,
switch_url,
depth, depth_is_sticky, allow_unver_obstructions,
FALSE /* adds_as_modification */,
server_performs_filtering,
FALSE /* clean_checkout */,
notify_func, notify_baton,
cancel_func, cancel_baton,
fetch_dirents_func, fetch_dirents_baton,
conflict_func, conflict_baton,
external_func, external_baton,
diff3_cmd, preserved_exts,
editor, edit_baton,
result_pool, scratch_pool);
}
/* ### Note that this function is completely different from the rest of the
update editor in what it updates. The update editor changes only BASE
and ACTUAL and this function just changes WORKING and ACTUAL.
In the entries world this function shared a lot of code with the
update editor but in the wonderful new WC-NG world it will probably
do more and more by itself and would be more logically grouped with
the add/copy functionality in adm_ops.c and copy.c. */
svn_error_t *
svn_wc_add_repos_file4(svn_wc_context_t *wc_ctx,
const char *local_abspath,
svn_stream_t *new_base_contents,
svn_stream_t *new_contents,
apr_hash_t *new_base_props,
apr_hash_t *new_props,
const char *copyfrom_url,
svn_revnum_t copyfrom_rev,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_wc__db_t *db = wc_ctx->db;
const char *dir_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
svn_wc__db_status_t status;
svn_node_kind_t kind;
const char *tmp_text_base_abspath;
svn_checksum_t *new_text_base_md5_checksum;
svn_checksum_t *new_text_base_sha1_checksum;
const char *source_abspath = NULL;
svn_skel_t *all_work_items = NULL;
svn_skel_t *work_item;
const char *repos_root_url;
const char *repos_uuid;
const char *original_repos_relpath;
svn_revnum_t changed_rev;
apr_time_t changed_date;
const char *changed_author;
svn_stream_t *tmp_base_contents;
svn_wc__db_install_data_t *install_data;
svn_error_t *err;
apr_pool_t *pool = scratch_pool;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
SVN_ERR_ASSERT(new_base_contents != NULL);
SVN_ERR_ASSERT(new_base_props != NULL);
/* We should have a write lock on this file's parent directory. */
SVN_ERR(svn_wc__write_check(db, dir_abspath, pool));
err = svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL,
db, local_abspath, scratch_pool, scratch_pool);
if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
else if(err)
svn_error_clear(err);
else
switch (status)
{
case svn_wc__db_status_not_present:
case svn_wc__db_status_deleted:
break;
default:
return svn_error_createf(SVN_ERR_ENTRY_EXISTS, NULL,
_("Node '%s' exists."),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, &repos_root_url,
&repos_uuid, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
db, dir_abspath, scratch_pool, scratch_pool));
switch (status)
{
case svn_wc__db_status_normal:
case svn_wc__db_status_added:
break;
case svn_wc__db_status_deleted:
return
svn_error_createf(SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
_("Can't add '%s' to a parent directory"
" scheduled for deletion"),
svn_dirent_local_style(local_abspath,
scratch_pool));
default:
return svn_error_createf(SVN_ERR_ENTRY_NOT_FOUND, err,
_("Can't find parent directory's node while"
" trying to add '%s'"),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
if (kind != svn_node_dir)
return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
_("Can't schedule an addition of '%s'"
" below a not-directory node"),
svn_dirent_local_style(local_abspath,
scratch_pool));
/* Fabricate the anticipated new URL of the target and check the
copyfrom URL to be in the same repository. */
if (copyfrom_url != NULL)
{
/* Find the repository_root via the parent directory, which
is always versioned before this function is called */
if (!repos_root_url)
{
/* The parent is an addition, scan upwards to find the right info */
SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, NULL,
&repos_root_url, &repos_uuid,
NULL, NULL, NULL, NULL,
wc_ctx->db, dir_abspath,
scratch_pool, scratch_pool));
}
SVN_ERR_ASSERT(repos_root_url);
original_repos_relpath =
svn_uri_skip_ancestor(repos_root_url, copyfrom_url, scratch_pool);
if (!original_repos_relpath)
return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Copyfrom-url '%s' has different repository"
" root than '%s'"),
copyfrom_url, repos_root_url);
}
else
{
original_repos_relpath = NULL;
copyfrom_rev = SVN_INVALID_REVNUM; /* Just to be sure. */
}
/* Set CHANGED_* to reflect the entry props in NEW_BASE_PROPS, and
filter NEW_BASE_PROPS so it contains only regular props. */
{
apr_array_header_t *regular_props;
apr_array_header_t *entry_props;
SVN_ERR(svn_categorize_props(svn_prop_hash_to_array(new_base_props, pool),
&entry_props, NULL, &regular_props,
pool));
/* Put regular props back into a hash table. */
new_base_props = svn_prop_array_to_hash(regular_props, pool);
/* Get the change_* info from the entry props. */
SVN_ERR(accumulate_last_change(&changed_rev,
&changed_date,
&changed_author,
entry_props, pool, pool));
}
/* Copy NEW_BASE_CONTENTS into a temporary file so our log can refer to
it, and set TMP_TEXT_BASE_ABSPATH to its path. Compute its
NEW_TEXT_BASE_MD5_CHECKSUM and NEW_TEXT_BASE_SHA1_CHECKSUM as we copy. */
if (copyfrom_url)
{
SVN_ERR(svn_wc__db_pristine_prepare_install(&tmp_base_contents,
&install_data,
&new_text_base_sha1_checksum,
&new_text_base_md5_checksum,
wc_ctx->db, local_abspath,
scratch_pool, scratch_pool));
}
else
{
const char *tmp_dir_abspath;
/* We are not installing a PRISTINE file, but we use the same code to
create whatever we want to install */
SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&tmp_dir_abspath,
db, dir_abspath,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_open_unique(&tmp_base_contents, &tmp_text_base_abspath,
tmp_dir_abspath, svn_io_file_del_none,
scratch_pool, scratch_pool));
new_text_base_sha1_checksum = NULL;
new_text_base_md5_checksum = NULL;
}
SVN_ERR(svn_stream_copy3(new_base_contents, tmp_base_contents,
cancel_func, cancel_baton, pool));
/* If the caller gave us a new working file, copy it to a safe (temporary)
location and set SOURCE_ABSPATH to that path. We'll then translate/copy
that into place after the node's state has been created. */
if (new_contents)
{
const char *temp_dir_abspath;
svn_stream_t *tmp_contents;
SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir_abspath, db,
local_abspath, pool, pool));
SVN_ERR(svn_stream_open_unique(&tmp_contents, &source_abspath,
temp_dir_abspath, svn_io_file_del_none,
pool, pool));
SVN_ERR(svn_stream_copy3(new_contents, tmp_contents,
cancel_func, cancel_baton, pool));
}
/* Install new text base for copied files. Added files do NOT have a
text base. */
if (copyfrom_url != NULL)
{
SVN_ERR(svn_wc__db_pristine_install(install_data,
new_text_base_sha1_checksum,
new_text_base_md5_checksum, pool));
}
else
{
/* ### There's something wrong around here. Sometimes (merge from a
foreign repository, at least) we are called with copyfrom_url =
NULL and an empty new_base_contents (and an empty set of
new_base_props). Why an empty "new base"?
That happens in merge_tests.py 54,87,88,89,143.
In that case, having been given this supposed "new base" file, we
copy it and calculate its checksum but do not install it. Why?
That must be wrong.
To crudely work around one issue with this, that we shouldn't
record a checksum in the database if we haven't installed the
corresponding pristine text, for now we'll just set the checksum
to NULL.
The proper solution is probably more like: the caller should pass
NULL for the missing information, and this function should learn to
handle that. */
new_text_base_sha1_checksum = NULL;
new_text_base_md5_checksum = NULL;
}
/* For added files without NEW_CONTENTS, then generate the working file
from the provided "pristine" contents. */
if (new_contents == NULL && copyfrom_url == NULL)
source_abspath = tmp_text_base_abspath;
{
svn_boolean_t record_fileinfo;
/* If new contents were provided, then we do NOT want to record the
file information. We assume the new contents do not match the
"proper" values for RECORDED_SIZE and RECORDED_TIME. */
record_fileinfo = (new_contents == NULL);
/* Install the working copy file (with appropriate translation) from
the appropriate source. SOURCE_ABSPATH will be NULL, indicating an
installation from the pristine (available for copied/moved files),
or it will specify a temporary file where we placed a "pristine"
(for an added file) or a detranslated local-mods file. */
SVN_ERR(svn_wc__wq_build_file_install(&work_item,
db, local_abspath,
source_abspath,
FALSE /* use_commit_times */,
record_fileinfo,
pool, pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
/* If we installed from somewhere besides the official pristine, then
it is a temporary file, which needs to be removed. */
if (source_abspath != NULL)
{
SVN_ERR(svn_wc__wq_build_file_remove(&work_item, db, local_abspath,
source_abspath,
pool, pool));
all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
}
}
SVN_ERR(svn_wc__db_op_copy_file(db, local_abspath,
new_base_props,
changed_rev,
changed_date,
changed_author,
original_repos_relpath,
original_repos_relpath ? repos_root_url
: NULL,
original_repos_relpath ? repos_uuid : NULL,
copyfrom_rev,
new_text_base_sha1_checksum,
TRUE,
new_props,
FALSE /* is_move */,
NULL /* conflict */,
all_work_items,
pool));
return svn_error_trace(svn_wc__wq_run(db, dir_abspath,
cancel_func, cancel_baton,
pool));
}
svn_error_t *
svn_wc__complete_directory_add(svn_wc_context_t *wc_ctx,
const char *local_abspath,
apr_hash_t *new_original_props,
const char *copyfrom_url,
svn_revnum_t copyfrom_rev,
apr_pool_t *scratch_pool)
{
svn_wc__db_status_t status;
svn_node_kind_t kind;
const char *original_repos_relpath;
const char *original_root_url;
const char *original_uuid;
svn_boolean_t had_props;
svn_boolean_t props_mod;
svn_revnum_t original_revision;
svn_revnum_t changed_rev;
apr_time_t changed_date;
const char *changed_author;
SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
&original_repos_relpath, &original_root_url,
&original_uuid, &original_revision, NULL, NULL,
NULL, NULL, NULL, NULL, &had_props, &props_mod,
NULL, NULL, NULL,
wc_ctx->db, local_abspath,
scratch_pool, scratch_pool));
if (status != svn_wc__db_status_added
|| kind != svn_node_dir
|| had_props
|| props_mod
|| !original_repos_relpath)
{
return svn_error_createf(
SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
_("'%s' is not an unmodified copied directory"),
svn_dirent_local_style(local_abspath, scratch_pool));
}
if (original_revision != copyfrom_rev
|| strcmp(copyfrom_url,
svn_path_url_add_component2(original_root_url,
original_repos_relpath,
scratch_pool)))
{
return svn_error_createf(
SVN_ERR_WC_COPYFROM_PATH_NOT_FOUND, NULL,
_("Copyfrom '%s' doesn't match original location of '%s'"),
copyfrom_url,
svn_dirent_local_style(local_abspath, scratch_pool));
}
{
apr_array_header_t *regular_props;
apr_array_header_t *entry_props;
SVN_ERR(svn_categorize_props(svn_prop_hash_to_array(new_original_props,
scratch_pool),
&entry_props, NULL, &regular_props,
scratch_pool));
/* Put regular props back into a hash table. */
new_original_props = svn_prop_array_to_hash(regular_props, scratch_pool);
/* Get the change_* info from the entry props. */
SVN_ERR(accumulate_last_change(&changed_rev,
&changed_date,
&changed_author,
entry_props, scratch_pool, scratch_pool));
}
return svn_error_trace(
svn_wc__db_op_copy_dir(wc_ctx->db, local_abspath,
new_original_props,
changed_rev, changed_date, changed_author,
original_repos_relpath, original_root_url,
original_uuid, original_revision,
NULL /* children */,
svn_depth_infinity,
FALSE /* is_move */,
NULL /* conflict */,
NULL /* work_items */,
scratch_pool));
}
Index: stable/11/contrib/subversion/subversion/libsvn_wc/wc-checks.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_wc/wc-checks.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_wc/wc-checks.h (revision 309511)
@@ -1,230 +1,230 @@
-/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_wc/token-map.h.
+/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_VERIFICATION_TRIGGERS 0
#define STMT_0_INFO {"STMT_VERIFICATION_TRIGGERS", NULL}
#define STMT_0 \
"CREATE TEMPORARY TRIGGER no_repository_updates BEFORE UPDATE ON repository " \
"BEGIN " \
" SELECT RAISE(FAIL, 'Updates to REPOSITORY are not allowed.'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_01 BEFORE INSERT ON nodes " \
"WHEN NOT ((new.local_relpath = '' AND new.parent_relpath IS NULL) " \
" OR (relpath_depth(new.local_relpath) " \
" = relpath_depth(new.parent_relpath) + 1)) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 01 failed'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_02 BEFORE INSERT ON nodes " \
"WHEN NOT new.op_depth <= relpath_depth(new.local_relpath) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 02 failed'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_03 BEFORE INSERT ON nodes " \
"WHEN NOT ( " \
" (new.op_depth = relpath_depth(new.local_relpath)) " \
" OR " \
" (EXISTS (SELECT 1 FROM nodes " \
" WHERE wc_id = new.wc_id AND op_depth = new.op_depth " \
" AND local_relpath = new.parent_relpath)) " \
" ) " \
" AND NOT (new.file_external IS NOT NULL AND new.op_depth = 0) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 03 failed'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_04 BEFORE INSERT ON actual_node " \
"WHEN NOT (new.local_relpath = '' " \
" OR EXISTS (SELECT 1 FROM nodes " \
" WHERE wc_id = new.wc_id " \
" AND local_relpath = new.parent_relpath)) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 04 failed'); " \
"END; " \
""
#define STMT_STATIC_VERIFY 1
#define STMT_1_INFO {"STMT_STATIC_VERIFY", NULL}
#define STMT_1 \
"SELECT local_relpath, op_depth, 1, 'Invalid parent relpath set in NODES' " \
"FROM nodes n WHERE local_relpath != '' " \
" AND (parent_relpath IS NULL " \
" OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
" OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
"UNION ALL " \
"SELECT local_relpath, -1, 2, 'Invalid parent relpath set in ACTUAL' " \
"FROM actual_node a WHERE local_relpath != '' " \
" AND (parent_relpath IS NULL " \
" OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
" OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
"UNION ALL " \
"SELECT local_relpath, -1, 10, 'No ancestor in ACTUAL' " \
"FROM actual_node a WHERE local_relpath != '' " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=a.wc_id " \
" AND i.local_relpath=a.parent_relpath) " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=a.wc_id " \
" AND i.local_relpath=a.local_relpath) " \
"UNION ALL " \
"SELECT a.local_relpath, -1, 11, 'Bad or Unneeded actual data' " \
"FROM actual_node a " \
"LEFT JOIN nodes n on n.wc_id = a.wc_id AND n.local_relpath = a.local_relpath " \
" AND n.op_depth = (SELECT MAX(op_depth) from nodes i " \
" WHERE i.wc_id=a.wc_id AND i.local_relpath=a.local_relpath) " \
"WHERE (a.properties IS NOT NULL " \
" AND (n.presence IS NULL " \
" OR n.presence NOT IN ('normal', 'incomplete'))) " \
" OR (a.changelist IS NOT NULL AND (n.kind IS NOT NULL AND n.kind != 'file')) " \
" OR (a.conflict_data IS NULL AND a.properties IS NULL AND a.changelist IS NULL) " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=a.wc_id " \
" AND i.local_relpath=a.parent_relpath) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 20, 'No ancestor in NODES' " \
"FROM nodes n WHERE local_relpath != '' " \
" AND file_external IS NULL " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=n.wc_id " \
" AND i.local_relpath=n.parent_relpath " \
" AND i.op_depth <= n.op_depth) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 21, 'Unneeded node data' " \
"FROM nodes " \
"WHERE presence NOT IN ('normal', 'incomplete') " \
"AND (properties IS NOT NULL " \
" OR checksum IS NOT NULL " \
" OR depth IS NOT NULL " \
" OR symlink_target IS NOT NULL " \
" OR changed_revision IS NOT NULL " \
" OR (changed_date IS NOT NULL AND changed_date != 0) " \
" OR changed_author IS NOT NULL " \
" OR translated_size IS NOT NULL " \
" OR last_mod_time IS NOT NULL " \
" OR dav_cache IS NOT NULL " \
" OR file_external IS NOT NULL " \
" OR inherited_props IS NOT NULL) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 22, 'Unneeded base-deleted node data' " \
"FROM nodes " \
"WHERE presence IN ('base-deleted') " \
"AND (repos_id IS NOT NULL " \
" OR repos_path IS NOT NULL " \
" OR revision IS NOT NULL) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 23, 'Kind specific data invalid on normal' " \
"FROM nodes " \
"WHERE presence IN ('normal', 'incomplete') " \
"AND (kind IS NULL " \
" OR (repos_path IS NULL " \
" AND (properties IS NOT NULL " \
" OR changed_revision IS NOT NULL " \
" OR changed_author IS NOT NULL " \
" OR (changed_date IS NOT NULL AND changed_date != 0))) " \
" OR (CASE WHEN kind = 'file' AND repos_path IS NOT NULL " \
" THEN checksum IS NULL " \
" ELSE checksum IS NOT NULL END) " \
" OR (CASE WHEN kind = 'dir' THEN depth IS NULL " \
" ELSE depth IS NOT NULL END) " \
" OR (CASE WHEN kind = 'symlink' THEN symlink_target IS NULL " \
" ELSE symlink_target IS NOT NULL END)) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 24, 'Invalid op-depth for local add' " \
"FROM nodes " \
"WHERE presence IN ('normal', 'incomplete') " \
" AND repos_path IS NULL " \
" AND op_depth != relpath_depth(local_relpath) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 25, 'Node missing op-depth ancestor' " \
"FROM nodes n " \
"WHERE op_depth < relpath_depth(local_relpath) " \
" AND file_external IS NULL " \
" AND NOT EXISTS(SELECT 1 FROM nodes p " \
" WHERE p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
" AND p.op_depth=n.op_depth " \
" AND (p.presence IN ('normal', 'incomplete') " \
" OR (p.presence IN ('base-deleted', 'not-present') " \
" AND n.presence = 'base-deleted'))) " \
"UNION ALL " \
"SELECT n.local_relpath, n.op_depth, 26, 'Copied descendant mismatch' " \
"FROM nodes n " \
"JOIN nodes p " \
" ON p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
" AND n.op_depth=p.op_depth " \
"WHERE n.op_depth > 0 AND n.presence IN ('normal', 'incomplete') " \
" AND (n.repos_id != p.repos_id " \
" OR n.repos_path != " \
" (CASE WHEN (n.parent_relpath) = '' THEN (CASE WHEN (p.repos_path) = '' THEN (n.local_relpath) WHEN (n.local_relpath) = '' THEN (p.repos_path) ELSE (p.repos_path) || '/' || (n.local_relpath) END) WHEN (p.repos_path) = '' THEN (CASE WHEN (n.parent_relpath) = '' THEN (n.local_relpath) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN '' WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+2) END END) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN (p.repos_path) WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN (p.repos_path) || SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1) END END) " \
" OR n.revision != p.revision " \
" OR p.kind != 'dir' " \
" OR n.moved_here IS NOT p.moved_here) " \
"UNION ALL " \
"SELECT n.local_relpath, n.op_depth, 27, 'Invalid op-root presence' " \
"FROM nodes n " \
"WHERE n.op_depth = relpath_depth(local_relpath) " \
" AND presence NOT IN ('normal', 'incomplete', 'base-deleted') " \
"UNION ALL " \
"SELECT n.local_relpath, s.op_depth, 28, 'Incomplete shadowing' " \
"FROM nodes n " \
"JOIN nodes s ON s.wc_id=n.wc_id AND s.local_relpath=n.local_relpath " \
" AND s.op_depth = relpath_depth(s.local_relpath) " \
" AND s.op_depth = (SELECT MIN(op_depth) FROM nodes d " \
" WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
" AND d.op_depth > n.op_depth) " \
"WHERE n.presence IN ('normal', 'incomplete') " \
" AND EXISTS(SELECT 1 " \
" FROM nodes dn " \
" WHERE dn.wc_id=n.wc_id AND dn.op_depth=n.op_depth " \
" AND dn.presence IN ('normal', 'incomplete') " \
" AND (((dn.local_relpath) > (CASE (n.local_relpath) WHEN '' THEN '' ELSE (n.local_relpath) || '/' END)) AND ((dn.local_relpath) < CASE (n.local_relpath) WHEN '' THEN X'FFFF' ELSE (n.local_relpath) || '0' END)) " \
" AND dn.file_external IS NULL " \
" AND NOT EXISTS(SELECT 1 " \
" FROM nodes ds " \
" WHERE ds.wc_id=n.wc_id AND ds.op_depth=s.op_depth " \
" AND ds.local_relpath=dn.local_relpath)) " \
"UNION ALL " \
"SELECT s.local_relpath, s.op_depth, 29, 'Invalid base-delete' " \
"FROM nodes s " \
"LEFT JOIN nodes n ON n.wc_id=s.wc_id AND n.local_relpath=s.local_relpath " \
" AND n.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
" WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
" AND d.op_depth < s.op_depth) " \
"WHERE s.presence = 'base-deleted' " \
" AND (n.presence IS NULL " \
" OR n.presence NOT IN ('normal', 'incomplete') " \
" ) " \
"UNION ALL " \
"SELECT n.local_relpath, n.op_depth, 30, 'Invalid data for BASE' " \
"FROM nodes n " \
"WHERE n.op_depth = 0 " \
" AND (n.moved_to IS NOT NULL " \
" OR n.moved_here IS NOT NULL) " \
"UNION ALL " \
"SELECT d.local_relpath, d.op_depth, 60, 'Moved here without origin' " \
"FROM nodes d " \
"WHERE d.op_depth = relpath_depth(d.local_relpath) " \
" AND d.moved_here IS NOT NULL " \
" AND NOT EXISTS(SELECT 1 FROM nodes s " \
" WHERE s.wc_id = d.wc_id AND s.moved_to = d.local_relpath) " \
"UNION ALL " \
"SELECT s.local_relpath, s.op_depth, 61, 'Moved to without target' " \
"FROM nodes s " \
"WHERE s.moved_to IS NOT NULL " \
" AND NOT EXISTS(SELECT 1 FROM nodes d " \
" WHERE d.wc_id = s.wc_id AND d.local_relpath = s.moved_to " \
" AND d.op_depth = relpath_depth(d.local_relpath) " \
" AND d.moved_here =1 AND d.repos_path IS NOT NULL) " \
""
#define WC_CHECKS_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
STMT_1, \
NULL \
}
#define WC_CHECKS_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
STMT_1_INFO, \
{NULL, NULL} \
}
Index: stable/11/contrib/subversion/subversion/libsvn_wc/wc-metadata.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_wc/wc-metadata.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_wc/wc-metadata.h (revision 309511)
@@ -1,545 +1,545 @@
-/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_wc/token-map.h.
+/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_CREATE_SCHEMA 0
#define STMT_0_INFO {"STMT_CREATE_SCHEMA", NULL}
#define STMT_0 \
"CREATE TABLE REPOSITORY ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" root TEXT UNIQUE NOT NULL, " \
" uuid TEXT NOT NULL " \
" ); " \
"CREATE INDEX I_UUID ON REPOSITORY (uuid); " \
"CREATE INDEX I_ROOT ON REPOSITORY (root); " \
"CREATE TABLE WCROOT ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" local_abspath TEXT UNIQUE " \
" ); " \
"CREATE UNIQUE INDEX I_LOCAL_ABSPATH ON WCROOT (local_abspath); " \
"CREATE TABLE PRISTINE ( " \
" checksum TEXT NOT NULL PRIMARY KEY, " \
" compression INTEGER, " \
" size INTEGER NOT NULL, " \
" refcount INTEGER NOT NULL, " \
" md5_checksum TEXT NOT NULL " \
" ); " \
"CREATE INDEX I_PRISTINE_MD5 ON PRISTINE (md5_checksum); " \
"CREATE TABLE ACTUAL_NODE ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" properties BLOB, " \
" conflict_old TEXT, " \
" conflict_new TEXT, " \
" conflict_working TEXT, " \
" prop_reject TEXT, " \
" changelist TEXT, " \
" text_mod TEXT, " \
" tree_conflict_data TEXT, " \
" conflict_data BLOB, " \
" older_checksum TEXT REFERENCES PRISTINE (checksum), " \
" left_checksum TEXT REFERENCES PRISTINE (checksum), " \
" right_checksum TEXT REFERENCES PRISTINE (checksum), " \
" PRIMARY KEY (wc_id, local_relpath) " \
" ); " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"CREATE TABLE LOCK ( " \
" repos_id INTEGER NOT NULL REFERENCES REPOSITORY (id), " \
" repos_relpath TEXT NOT NULL, " \
" lock_token TEXT NOT NULL, " \
" lock_owner TEXT, " \
" lock_comment TEXT, " \
" lock_date INTEGER, " \
" PRIMARY KEY (repos_id, repos_relpath) " \
" ); " \
"CREATE TABLE WORK_QUEUE ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" work BLOB NOT NULL " \
" ); " \
"CREATE TABLE WC_LOCK ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_dir_relpath TEXT NOT NULL, " \
" locked_levels INTEGER NOT NULL DEFAULT -1, " \
" PRIMARY KEY (wc_id, local_dir_relpath) " \
" ); " \
"PRAGMA user_version = " \
APR_STRINGIFY(SVN_WC__VERSION) \
"; " \
""
#define STMT_CREATE_NODES 1
#define STMT_1_INFO {"STMT_CREATE_NODES", NULL}
#define STMT_1 \
"CREATE TABLE NODES ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" op_depth INTEGER NOT NULL, " \
" parent_relpath TEXT, " \
" repos_id INTEGER REFERENCES REPOSITORY (id), " \
" repos_path TEXT, " \
" revision INTEGER, " \
" presence TEXT NOT NULL, " \
" moved_here INTEGER, " \
" moved_to TEXT, " \
" kind TEXT NOT NULL, " \
" properties BLOB, " \
" depth TEXT, " \
" checksum TEXT REFERENCES PRISTINE (checksum), " \
" symlink_target TEXT, " \
" changed_revision INTEGER, " \
" changed_date INTEGER, " \
" changed_author TEXT, " \
" translated_size INTEGER, " \
" last_mod_time INTEGER, " \
" dav_cache BLOB, " \
" file_external INTEGER, " \
" inherited_props BLOB, " \
" PRIMARY KEY (wc_id, local_relpath, op_depth) " \
" ); " \
"CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, " \
" local_relpath, op_depth); " \
"CREATE UNIQUE INDEX I_NODES_MOVED ON NODES (wc_id, moved_to, op_depth); " \
"CREATE VIEW NODES_CURRENT AS " \
" SELECT * FROM nodes AS n " \
" WHERE op_depth = (SELECT MAX(op_depth) FROM nodes AS n2 " \
" WHERE n2.wc_id = n.wc_id " \
" AND n2.local_relpath = n.local_relpath); " \
"CREATE VIEW NODES_BASE AS " \
" SELECT * FROM nodes " \
" WHERE op_depth = 0; " \
""
#define STMT_CREATE_NODES_TRIGGERS 2
#define STMT_2_INFO {"STMT_CREATE_NODES_TRIGGERS", NULL}
#define STMT_2 \
"CREATE TRIGGER nodes_insert_trigger " \
"AFTER INSERT ON nodes " \
"WHEN NEW.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
"END; " \
"CREATE TRIGGER nodes_delete_trigger " \
"AFTER DELETE ON nodes " \
"WHEN OLD.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
"CREATE TRIGGER nodes_update_checksum_trigger " \
"AFTER UPDATE OF checksum ON nodes " \
"WHEN NEW.checksum IS NOT OLD.checksum " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
""
#define STMT_CREATE_EXTERNALS 3
#define STMT_3_INFO {"STMT_CREATE_EXTERNALS", NULL}
#define STMT_3 \
"CREATE TABLE EXTERNALS ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT NOT NULL, " \
" repos_id INTEGER NOT NULL REFERENCES REPOSITORY (id), " \
" presence TEXT NOT NULL, " \
" kind TEXT NOT NULL, " \
" def_local_relpath TEXT NOT NULL, " \
" def_repos_relpath TEXT NOT NULL, " \
" def_operational_revision TEXT, " \
" def_revision TEXT, " \
" PRIMARY KEY (wc_id, local_relpath) " \
"); " \
"CREATE UNIQUE INDEX I_EXTERNALS_DEFINED ON EXTERNALS (wc_id, " \
" def_local_relpath, " \
" local_relpath); " \
""
#define STMT_INSTALL_SCHEMA_STATISTICS 4
#define STMT_4_INFO {"STMT_INSTALL_SCHEMA_STATISTICS", NULL}
#define STMT_4 \
"ANALYZE sqlite_master; " \
"DELETE FROM sqlite_stat1 " \
"WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK', 'EXTERNALS'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'sqlite_autoindex_NODES_1', '8000 8000 2 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_PARENT', '8000 8000 10 2 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_MOVED', '8000 8000 1 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1', '8000 8000 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'I_ACTUAL_PARENT', '8000 8000 10 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('LOCK', 'sqlite_autoindex_LOCK_1', '100 100 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1', '100 100 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('EXTERNALS','sqlite_autoindex_EXTERNALS_1', '100 100 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('EXTERNALS','I_EXTERNALS_DEFINED', '100 100 3 1'); " \
"ANALYZE sqlite_master; " \
""
#define STMT_UPGRADE_TO_20 5
#define STMT_5_INFO {"STMT_UPGRADE_TO_20", NULL}
#define STMT_5 \
"UPDATE BASE_NODE SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = BASE_NODE.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine WHERE md5_checksum = BASE_NODE.checksum); " \
"UPDATE WORKING_NODE SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = WORKING_NODE.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine " \
" WHERE md5_checksum = WORKING_NODE.checksum); " \
"INSERT INTO NODES ( " \
" wc_id, local_relpath, op_depth, parent_relpath, " \
" repos_id, repos_path, revision, " \
" presence, depth, moved_here, moved_to, kind, " \
" changed_revision, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external ) " \
"SELECT wc_id, local_relpath, 0 , parent_relpath, " \
" repos_id, repos_relpath, revnum, " \
" presence, depth, NULL , NULL , kind, " \
" changed_rev, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external " \
"FROM BASE_NODE; " \
"INSERT INTO NODES ( " \
" wc_id, local_relpath, op_depth, parent_relpath, " \
" repos_id, repos_path, revision, " \
" presence, depth, moved_here, moved_to, kind, " \
" changed_revision, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external ) " \
"SELECT wc_id, local_relpath, 2 , parent_relpath, " \
" copyfrom_repos_id, copyfrom_repos_path, copyfrom_revnum, " \
" presence, depth, NULL , NULL , kind, " \
" changed_rev, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" NULL , symlink_target, NULL " \
"FROM WORKING_NODE; " \
"DROP TABLE BASE_NODE; " \
"DROP TABLE WORKING_NODE; " \
"PRAGMA user_version = 20; " \
""
#define STMT_UPGRADE_TO_21 6
#define STMT_6_INFO {"STMT_UPGRADE_TO_21", NULL}
#define STMT_6 \
"PRAGMA user_version = 21; " \
""
#define STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT 7
#define STMT_7_INFO {"STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT", NULL}
#define STMT_7 \
"SELECT wc_id, local_relpath, tree_conflict_data " \
"FROM actual_node " \
"WHERE tree_conflict_data IS NOT NULL " \
""
#define STMT_UPGRADE_21_ERASE_OLD_CONFLICTS 8
#define STMT_8_INFO {"STMT_UPGRADE_21_ERASE_OLD_CONFLICTS", NULL}
#define STMT_8 \
"UPDATE actual_node SET tree_conflict_data = NULL " \
""
#define STMT_UPGRADE_TO_22 9
#define STMT_9_INFO {"STMT_UPGRADE_TO_22", NULL}
#define STMT_9 \
"UPDATE actual_node SET tree_conflict_data = conflict_data; " \
"UPDATE actual_node SET conflict_data = NULL; " \
"PRAGMA user_version = 22; " \
""
#define STMT_UPGRADE_TO_23 10
#define STMT_10_INFO {"STMT_UPGRADE_TO_23", NULL}
#define STMT_10 \
"PRAGMA user_version = 23; " \
""
#define STMT_UPGRADE_23_HAS_WORKING_NODES 11
#define STMT_11_INFO {"STMT_UPGRADE_23_HAS_WORKING_NODES", NULL}
#define STMT_11 \
"SELECT 1 FROM nodes WHERE op_depth > 0 " \
"LIMIT 1 " \
""
#define STMT_UPGRADE_TO_24 12
#define STMT_12_INFO {"STMT_UPGRADE_TO_24", NULL}
#define STMT_12 \
"UPDATE pristine SET refcount = " \
" (SELECT COUNT(*) FROM nodes " \
" WHERE checksum = pristine.checksum ); " \
"PRAGMA user_version = 24; " \
""
#define STMT_UPGRADE_TO_25 13
#define STMT_13_INFO {"STMT_UPGRADE_TO_25", NULL}
#define STMT_13 \
"DROP VIEW IF EXISTS NODES_CURRENT; " \
"CREATE VIEW NODES_CURRENT AS " \
" SELECT * FROM nodes " \
" JOIN (SELECT wc_id, local_relpath, MAX(op_depth) AS op_depth FROM nodes " \
" GROUP BY wc_id, local_relpath) AS filter " \
" ON nodes.wc_id = filter.wc_id " \
" AND nodes.local_relpath = filter.local_relpath " \
" AND nodes.op_depth = filter.op_depth; " \
"PRAGMA user_version = 25; " \
""
#define STMT_UPGRADE_TO_26 14
#define STMT_14_INFO {"STMT_UPGRADE_TO_26", NULL}
#define STMT_14 \
"DROP VIEW IF EXISTS NODES_BASE; " \
"CREATE VIEW NODES_BASE AS " \
" SELECT * FROM nodes " \
" WHERE op_depth = 0; " \
"PRAGMA user_version = 26; " \
""
#define STMT_UPGRADE_TO_27 15
#define STMT_15_INFO {"STMT_UPGRADE_TO_27", NULL}
#define STMT_15 \
"PRAGMA user_version = 27; " \
""
#define STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS 16
#define STMT_16_INFO {"STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS", NULL}
#define STMT_16 \
"SELECT 1 FROM actual_node " \
"WHERE NOT ((prop_reject IS NULL) AND (conflict_old IS NULL) " \
" AND (conflict_new IS NULL) AND (conflict_working IS NULL) " \
" AND (tree_conflict_data IS NULL)) " \
"LIMIT 1 " \
""
#define STMT_UPGRADE_TO_28 17
#define STMT_17_INFO {"STMT_UPGRADE_TO_28", NULL}
#define STMT_17 \
"UPDATE NODES SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = nodes.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine WHERE md5_checksum = nodes.checksum); " \
"PRAGMA user_version = 28; " \
""
#define STMT_UPGRADE_TO_29 18
#define STMT_18_INFO {"STMT_UPGRADE_TO_29", NULL}
#define STMT_18 \
"DROP TRIGGER IF EXISTS nodes_update_checksum_trigger; " \
"DROP TRIGGER IF EXISTS nodes_insert_trigger; " \
"DROP TRIGGER IF EXISTS nodes_delete_trigger; " \
"CREATE TRIGGER nodes_update_checksum_trigger " \
"AFTER UPDATE OF checksum ON nodes " \
"WHEN NEW.checksum IS NOT OLD.checksum " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
"CREATE TRIGGER nodes_insert_trigger " \
"AFTER INSERT ON nodes " \
"WHEN NEW.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
"END; " \
"CREATE TRIGGER nodes_delete_trigger " \
"AFTER DELETE ON nodes " \
"WHEN OLD.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
"PRAGMA user_version = 29; " \
""
#define STMT_UPGRADE_TO_30 19
#define STMT_19_INFO {"STMT_UPGRADE_TO_30", NULL}
#define STMT_19 \
"CREATE UNIQUE INDEX IF NOT EXISTS I_NODES_MOVED " \
"ON NODES (wc_id, moved_to, op_depth); " \
"CREATE INDEX IF NOT EXISTS I_PRISTINE_MD5 ON PRISTINE (md5_checksum); " \
"UPDATE nodes SET presence = \"server-excluded\" WHERE presence = \"absent\"; " \
"UPDATE nodes SET file_external=1 WHERE file_external IS NOT NULL; " \
""
#define STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE 20
#define STMT_20_INFO {"STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE", NULL}
#define STMT_20 \
"SELECT wc_id, local_relpath, " \
" conflict_old, conflict_working, conflict_new, prop_reject, tree_conflict_data " \
"FROM actual_node " \
"WHERE conflict_old IS NOT NULL " \
" OR conflict_working IS NOT NULL " \
" OR conflict_new IS NOT NULL " \
" OR prop_reject IS NOT NULL " \
" OR tree_conflict_data IS NOT NULL " \
"ORDER by wc_id, local_relpath " \
""
#define STMT_UPGRADE_30_SET_CONFLICT 21
#define STMT_21_INFO {"STMT_UPGRADE_30_SET_CONFLICT", NULL}
#define STMT_21 \
"UPDATE actual_node SET conflict_data = ?3, conflict_old = NULL, " \
" conflict_working = NULL, conflict_new = NULL, prop_reject = NULL, " \
" tree_conflict_data = NULL " \
"WHERE wc_id = ?1 and local_relpath = ?2 " \
""
#define STMT_UPGRADE_TO_31_ALTER_TABLE 22
#define STMT_22_INFO {"STMT_UPGRADE_TO_31_ALTER_TABLE", NULL}
#define STMT_22 \
"ALTER TABLE NODES ADD COLUMN inherited_props BLOB; " \
""
#define STMT_UPGRADE_TO_31_FINALIZE 23
#define STMT_23_INFO {"STMT_UPGRADE_TO_31_FINALIZE", NULL}
#define STMT_23 \
"DROP INDEX IF EXISTS I_ACTUAL_CHANGELIST; " \
"DROP INDEX IF EXISTS I_EXTERNALS_PARENT; " \
"DROP INDEX I_NODES_PARENT; " \
"CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, " \
" local_relpath, op_depth); " \
"DROP INDEX I_ACTUAL_PARENT; " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"PRAGMA user_version = 31; " \
""
#define STMT_UPGRADE_31_SELECT_WCROOT_NODES 24
#define STMT_24_INFO {"STMT_UPGRADE_31_SELECT_WCROOT_NODES", NULL}
#define STMT_24 \
"SELECT l.wc_id, l.local_relpath FROM nodes as l " \
"LEFT OUTER JOIN nodes as r " \
"ON l.wc_id = r.wc_id " \
" AND r.local_relpath = l.parent_relpath " \
" AND r.op_depth = 0 " \
"WHERE l.op_depth = 0 " \
" AND l.repos_path != '' " \
" AND ((l.repos_id IS NOT r.repos_id) " \
" OR (l.repos_path IS NOT (CASE WHEN (r.local_relpath) = '' THEN (CASE WHEN (r.repos_path) = '' THEN (l.local_relpath) WHEN (l.local_relpath) = '' THEN (r.repos_path) ELSE (r.repos_path) || '/' || (l.local_relpath) END) WHEN (r.repos_path) = '' THEN (CASE WHEN (r.local_relpath) = '' THEN (l.local_relpath) WHEN SUBSTR((l.local_relpath), 1, LENGTH(r.local_relpath)) = (r.local_relpath) THEN CASE WHEN LENGTH(r.local_relpath) = LENGTH(l.local_relpath) THEN '' WHEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1, 1) = '/' THEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+2) END END) WHEN SUBSTR((l.local_relpath), 1, LENGTH(r.local_relpath)) = (r.local_relpath) THEN CASE WHEN LENGTH(r.local_relpath) = LENGTH(l.local_relpath) THEN (r.repos_path) WHEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1, 1) = '/' THEN (r.repos_path) || SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1) END END))) " \
""
#define STMT_UPGRADE_TO_32 25
#define STMT_25_INFO {"STMT_UPGRADE_TO_32", NULL}
#define STMT_25 \
"DROP INDEX IF EXISTS I_ACTUAL_CHANGELIST; " \
"DROP INDEX IF EXISTS I_EXTERNALS_PARENT; " \
"CREATE INDEX I_EXTERNALS_PARENT ON EXTERNALS (wc_id, parent_relpath); " \
"DROP INDEX I_NODES_PARENT; " \
"CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, " \
" local_relpath, op_depth); " \
"DROP INDEX I_ACTUAL_PARENT; " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"-- format: YYY " \
""
#define WC_METADATA_SQL_99 \
"CREATE TABLE ACTUAL_NODE_BACKUP ( " \
" wc_id INTEGER NOT NULL, " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" properties BLOB, " \
" conflict_old TEXT, " \
" conflict_new TEXT, " \
" conflict_working TEXT, " \
" prop_reject TEXT, " \
" changelist TEXT, " \
" text_mod TEXT " \
" ); " \
"INSERT INTO ACTUAL_NODE_BACKUP SELECT " \
" wc_id, local_relpath, parent_relpath, properties, conflict_old, " \
" conflict_new, conflict_working, prop_reject, changelist, text_mod " \
"FROM ACTUAL_NODE; " \
"DROP TABLE ACTUAL_NODE; " \
"CREATE TABLE ACTUAL_NODE ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" properties BLOB, " \
" conflict_old TEXT, " \
" conflict_new TEXT, " \
" conflict_working TEXT, " \
" prop_reject TEXT, " \
" changelist TEXT, " \
" text_mod TEXT, " \
" PRIMARY KEY (wc_id, local_relpath) " \
" ); " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"INSERT INTO ACTUAL_NODE SELECT " \
" wc_id, local_relpath, parent_relpath, properties, conflict_old, " \
" conflict_new, conflict_working, prop_reject, changelist, text_mod " \
"FROM ACTUAL_NODE_BACKUP; " \
"DROP TABLE ACTUAL_NODE_BACKUP; " \
""
#define WC_METADATA_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
STMT_1, \
STMT_2, \
STMT_3, \
STMT_4, \
STMT_5, \
STMT_6, \
STMT_7, \
STMT_8, \
STMT_9, \
STMT_10, \
STMT_11, \
STMT_12, \
STMT_13, \
STMT_14, \
STMT_15, \
STMT_16, \
STMT_17, \
STMT_18, \
STMT_19, \
STMT_20, \
STMT_21, \
STMT_22, \
STMT_23, \
STMT_24, \
STMT_25, \
NULL \
}
#define WC_METADATA_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
STMT_1_INFO, \
STMT_2_INFO, \
STMT_3_INFO, \
STMT_4_INFO, \
STMT_5_INFO, \
STMT_6_INFO, \
STMT_7_INFO, \
STMT_8_INFO, \
STMT_9_INFO, \
STMT_10_INFO, \
STMT_11_INFO, \
STMT_12_INFO, \
STMT_13_INFO, \
STMT_14_INFO, \
STMT_15_INFO, \
STMT_16_INFO, \
STMT_17_INFO, \
STMT_18_INFO, \
STMT_19_INFO, \
STMT_20_INFO, \
STMT_21_INFO, \
STMT_22_INFO, \
STMT_23_INFO, \
STMT_24_INFO, \
STMT_25_INFO, \
{NULL, NULL} \
}
Index: stable/11/contrib/subversion/subversion/libsvn_wc/wc-queries.h
===================================================================
--- stable/11/contrib/subversion/subversion/libsvn_wc/wc-queries.h (revision 309510)
+++ stable/11/contrib/subversion/subversion/libsvn_wc/wc-queries.h (revision 309511)
@@ -1,3417 +1,3417 @@
-/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_wc/token-map.h.
+/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_SELECT_NODE_INFO 0
#define STMT_0_INFO {"STMT_SELECT_NODE_INFO", NULL}
#define STMT_0 \
"SELECT op_depth, repos_id, repos_path, presence, kind, revision, checksum, " \
" translated_size, changed_revision, changed_date, changed_author, depth, " \
" symlink_target, last_mod_time, properties, moved_here, inherited_props, " \
" moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
"ORDER BY op_depth DESC " \
""
#define STMT_SELECT_NODE_INFO_WITH_LOCK 1
#define STMT_1_INFO {"STMT_SELECT_NODE_INFO_WITH_LOCK", NULL}
#define STMT_1 \
"SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, " \
" checksum, translated_size, changed_revision, changed_date, changed_author, " \
" depth, symlink_target, last_mod_time, properties, moved_here, " \
" inherited_props, " \
" lock_token, lock_owner, lock_comment, lock_date " \
"FROM nodes " \
"LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
"ORDER BY op_depth DESC " \
""
#define STMT_SELECT_BASE_NODE 2
#define STMT_2_INFO {"STMT_SELECT_BASE_NODE", NULL}
#define STMT_2 \
"SELECT repos_id, repos_path, presence, kind, revision, checksum, " \
" translated_size, changed_revision, changed_date, changed_author, depth, " \
" symlink_target, last_mod_time, properties, file_external " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_SELECT_BASE_NODE_WITH_LOCK 3
#define STMT_3_INFO {"STMT_SELECT_BASE_NODE_WITH_LOCK", NULL}
#define STMT_3 \
"SELECT nodes.repos_id, nodes.repos_path, presence, kind, revision, " \
" checksum, translated_size, changed_revision, changed_date, changed_author, " \
" depth, symlink_target, last_mod_time, properties, file_external, " \
" lock_token, lock_owner, lock_comment, lock_date " \
"FROM nodes " \
"LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_SELECT_BASE_CHILDREN_INFO 4
#define STMT_4_INFO {"STMT_SELECT_BASE_CHILDREN_INFO", NULL}
#define STMT_4 \
"SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, " \
" revision, depth, file_external " \
"FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_SELECT_BASE_CHILDREN_INFO_LOCK 5
#define STMT_5_INFO {"STMT_SELECT_BASE_CHILDREN_INFO_LOCK", NULL}
#define STMT_5 \
"SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, " \
" revision, depth, file_external, " \
" lock_token, lock_owner, lock_comment, lock_date " \
"FROM nodes " \
"LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_SELECT_WORKING_NODE 6
#define STMT_6_INFO {"STMT_SELECT_WORKING_NODE", NULL}
#define STMT_6 \
"SELECT op_depth, presence, kind, checksum, translated_size, " \
" changed_revision, changed_date, changed_author, depth, symlink_target, " \
" repos_id, repos_path, revision, " \
" moved_here, moved_to, last_mod_time, properties " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0 " \
"ORDER BY op_depth DESC " \
"LIMIT 1 " \
""
#define STMT_SELECT_DEPTH_NODE 7
#define STMT_7_INFO {"STMT_SELECT_DEPTH_NODE", NULL}
#define STMT_7 \
"SELECT repos_id, repos_path, presence, kind, revision, checksum, " \
" translated_size, changed_revision, changed_date, changed_author, depth, " \
" symlink_target, properties, moved_to, moved_here " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
#define STMT_SELECT_LOWEST_WORKING_NODE 8
#define STMT_8_INFO {"STMT_SELECT_LOWEST_WORKING_NODE", NULL}
#define STMT_8 \
"SELECT op_depth, presence, kind, moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 " \
"ORDER BY op_depth " \
"LIMIT 1 " \
""
#define STMT_SELECT_HIGHEST_WORKING_NODE 9
#define STMT_9_INFO {"STMT_SELECT_HIGHEST_WORKING_NODE", NULL}
#define STMT_9 \
"SELECT op_depth " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3 " \
"ORDER BY op_depth DESC " \
"LIMIT 1 " \
""
#define STMT_SELECT_ACTUAL_NODE 10
#define STMT_10_INFO {"STMT_SELECT_ACTUAL_NODE", NULL}
#define STMT_10 \
"SELECT changelist, properties, conflict_data " \
"FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_SELECT_NODE_CHILDREN_INFO 11
#define STMT_11_INFO {"STMT_SELECT_NODE_CHILDREN_INFO", NULL}
#define STMT_11 \
"SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, " \
" checksum, translated_size, changed_revision, changed_date, changed_author, " \
" depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, " \
" lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external " \
"FROM nodes " \
"LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath AND op_depth = 0 " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
"ORDER BY local_relpath DESC, op_depth DESC " \
""
#define STMT_SELECT_BASE_NODE_CHILDREN_INFO 12
#define STMT_12_INFO {"STMT_SELECT_BASE_NODE_CHILDREN_INFO", NULL}
#define STMT_12 \
"SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, " \
" checksum, translated_size, changed_revision, changed_date, changed_author, " \
" depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, " \
" lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external " \
"FROM nodes " \
"LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath AND op_depth = 0 " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
"ORDER BY local_relpath DESC " \
""
#define STMT_SELECT_NODE_CHILDREN_WALKER_INFO 13
#define STMT_13_INFO {"STMT_SELECT_NODE_CHILDREN_WALKER_INFO", NULL}
#define STMT_13 \
"SELECT local_relpath, op_depth, presence, kind " \
"FROM nodes_current " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_ACTUAL_CHILDREN_INFO 14
#define STMT_14_INFO {"STMT_SELECT_ACTUAL_CHILDREN_INFO", NULL}
#define STMT_14 \
"SELECT local_relpath, changelist, properties, conflict_data " \
"FROM actual_node " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
""
#define STMT_SELECT_REPOSITORY_BY_ID 15
#define STMT_15_INFO {"STMT_SELECT_REPOSITORY_BY_ID", NULL}
#define STMT_15 \
"SELECT root, uuid FROM repository WHERE id = ?1 " \
""
#define STMT_SELECT_WCROOT_NULL 16
#define STMT_16_INFO {"STMT_SELECT_WCROOT_NULL", NULL}
#define STMT_16 \
"SELECT id FROM wcroot WHERE local_abspath IS NULL " \
""
#define STMT_SELECT_REPOSITORY 17
#define STMT_17_INFO {"STMT_SELECT_REPOSITORY", NULL}
#define STMT_17 \
"SELECT id FROM repository WHERE root = ?1 " \
""
#define STMT_INSERT_REPOSITORY 18
#define STMT_18_INFO {"STMT_INSERT_REPOSITORY", NULL}
#define STMT_18 \
"INSERT INTO repository (root, uuid) VALUES (?1, ?2) " \
""
#define STMT_INSERT_NODE 19
#define STMT_19_INFO {"STMT_INSERT_NODE", NULL}
#define STMT_19 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external, moved_to, moved_here, " \
" inherited_props) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, " \
" ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23) " \
""
#define STMT_SELECT_WORKING_PRESENT 20
#define STMT_20_INFO {"STMT_SELECT_WORKING_PRESENT", NULL}
#define STMT_20 \
"SELECT local_relpath, kind, checksum, translated_size, last_mod_time " \
"FROM nodes n " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND presence in ('normal', 'incomplete') " \
" AND op_depth = (SELECT MAX(op_depth) " \
" FROM NODES w " \
" WHERE w.wc_id = ?1 " \
" AND w.local_relpath = n.local_relpath) " \
"ORDER BY local_relpath DESC " \
""
#define STMT_DELETE_NODE_RECURSIVE 21
#define STMT_21_INFO {"STMT_DELETE_NODE_RECURSIVE", NULL}
#define STMT_21 \
"DELETE FROM NODES " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_DELETE_NODE 22
#define STMT_22_INFO {"STMT_DELETE_NODE", NULL}
#define STMT_22 \
"DELETE " \
"FROM NODES " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
#define STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE 23
#define STMT_23_INFO {"STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE", NULL}
#define STMT_23 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND EXISTS(SELECT 1 FROM NODES b " \
" WHERE b.wc_id = ?1 " \
" AND b.local_relpath = actual_node.local_relpath " \
" AND op_depth = 0) " \
" AND NOT EXISTS(SELECT 1 FROM NODES w " \
" WHERE w.wc_id = ?1 " \
" AND w.local_relpath = actual_node.local_relpath " \
" AND op_depth > 0 " \
" AND presence in ('normal', 'incomplete', 'not-present')) " \
""
#define STMT_DELETE_WORKING_BASE_DELETE 24
#define STMT_24_INFO {"STMT_DELETE_WORKING_BASE_DELETE", NULL}
#define STMT_24 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND presence = 'base-deleted' " \
" AND op_depth > ?3 " \
" AND op_depth = (SELECT MIN(op_depth) FROM nodes n " \
" WHERE n.wc_id = ?1 " \
" AND n.local_relpath = nodes.local_relpath " \
" AND op_depth > ?3) " \
""
#define STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE 25
#define STMT_25_INFO {"STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE", NULL}
#define STMT_25 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND presence = 'base-deleted' " \
" AND op_depth > ?3 " \
" AND op_depth = (SELECT MIN(op_depth) FROM nodes n " \
" WHERE n.wc_id = ?1 " \
" AND n.local_relpath = nodes.local_relpath " \
" AND op_depth > ?3) " \
""
#define STMT_DELETE_WORKING_RECURSIVE 26
#define STMT_26_INFO {"STMT_DELETE_WORKING_RECURSIVE", NULL}
#define STMT_26 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth > 0 " \
""
#define STMT_DELETE_BASE_RECURSIVE 27
#define STMT_27_INFO {"STMT_DELETE_BASE_RECURSIVE", NULL}
#define STMT_27 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = 0 " \
""
#define STMT_DELETE_WORKING_OP_DEPTH 28
#define STMT_28_INFO {"STMT_DELETE_WORKING_OP_DEPTH", NULL}
#define STMT_28 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = ?3 " \
""
#define STMT_SELECT_LAYER_FOR_REPLACE 29
#define STMT_29_INFO {"STMT_SELECT_LAYER_FOR_REPLACE", NULL}
#define STMT_29 \
"SELECT s.local_relpath, s.kind, " \
" (CASE WHEN (?2) = '' THEN (CASE WHEN (?4) = '' THEN (s.local_relpath) WHEN (s.local_relpath) = '' THEN (?4) ELSE (?4) || '/' || (s.local_relpath) END) WHEN (?4) = '' THEN (CASE WHEN (?2) = '' THEN (s.local_relpath) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN '' WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((s.local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN (?4) WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?4) || SUBSTR((s.local_relpath), LENGTH(?2)+1) END END) drp, 'normal' " \
"FROM nodes s " \
"WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3 " \
"UNION ALL " \
"SELECT s.local_relpath, s.kind, " \
" (CASE WHEN (?2) = '' THEN (CASE WHEN (?4) = '' THEN (s.local_relpath) WHEN (s.local_relpath) = '' THEN (?4) ELSE (?4) || '/' || (s.local_relpath) END) WHEN (?4) = '' THEN (CASE WHEN (?2) = '' THEN (s.local_relpath) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN '' WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((s.local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN (?4) WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?4) || SUBSTR((s.local_relpath), LENGTH(?2)+1) END END) drp, d.presence " \
"FROM nodes s " \
"LEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5 " \
" AND d.local_relpath = drp " \
"WHERE s.wc_id = ?1 " \
" AND (((s.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((s.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND s.op_depth = ?3 " \
"ORDER BY s.local_relpath " \
""
#define STMT_SELECT_DESCENDANTS_OP_DEPTH_RV 30
#define STMT_30_INFO {"STMT_SELECT_DESCENDANTS_OP_DEPTH_RV", NULL}
#define STMT_30 \
"SELECT local_relpath, kind " \
"FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
" AND presence in ('normal', 'incomplete') " \
"ORDER BY local_relpath DESC " \
""
#define STMT_COPY_NODE_MOVE 31
#define STMT_31_INFO {"STMT_COPY_NODE_MOVE", NULL}
#define STMT_31 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, last_mod_time, " \
" symlink_target, moved_here, moved_to ) " \
"SELECT " \
" s.wc_id, ?4 , ?5 , ?6 , " \
" s.repos_id, " \
" s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision, " \
" s.changed_date, s.changed_author, s.checksum, s.properties, " \
" CASE WHEN d.checksum=s.checksum THEN d.translated_size END, " \
" CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END, " \
" s.symlink_target, 1, d.moved_to " \
"FROM nodes s " \
"LEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5 " \
"WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3 " \
""
#define STMT_SELECT_NO_LONGER_MOVED_RV 32
#define STMT_32_INFO {"STMT_SELECT_NO_LONGER_MOVED_RV", NULL}
#define STMT_32 \
"SELECT d.local_relpath, (CASE WHEN (?2) = '' THEN (CASE WHEN (?4) = '' THEN (d.local_relpath) WHEN (d.local_relpath) = '' THEN (?4) ELSE (?4) || '/' || (d.local_relpath) END) WHEN (?4) = '' THEN (CASE WHEN (?2) = '' THEN (d.local_relpath) WHEN SUBSTR((d.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(d.local_relpath) THEN '' WHEN SUBSTR((d.local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((d.local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((d.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(d.local_relpath) THEN (?4) WHEN SUBSTR((d.local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?4) || SUBSTR((d.local_relpath), LENGTH(?2)+1) END END) srp, " \
" b.presence, b.op_depth " \
"FROM nodes d " \
"LEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath " \
" AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x " \
" WHERE x.wc_id = ?1 " \
" AND x.local_relpath = b.local_relpath " \
" AND x.op_depth < ?3) " \
"WHERE d.wc_id = ?1 " \
" AND (((d.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((d.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND d.op_depth = ?3 " \
" AND NOT EXISTS(SELECT * FROM nodes s " \
" WHERE s.wc_id = ?1 " \
" AND s.local_relpath = srp " \
" AND s.op_depth = ?5) " \
"ORDER BY d.local_relpath DESC " \
""
#define STMT_SELECT_OP_DEPTH_CHILDREN 33
#define STMT_33_INFO {"STMT_SELECT_OP_DEPTH_CHILDREN", NULL}
#define STMT_33 \
"SELECT local_relpath, kind FROM nodes " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
" AND op_depth = ?3 " \
" AND presence != 'base-deleted' " \
" AND file_external is NULL " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS 34
#define STMT_34_INFO {"STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS", NULL}
#define STMT_34 \
"SELECT local_relpath, kind FROM nodes " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
" AND op_depth = ?3 " \
" AND presence IN ('normal', 'incomplete') " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_GE_OP_DEPTH_CHILDREN 35
#define STMT_35_INFO {"STMT_SELECT_GE_OP_DEPTH_CHILDREN", NULL}
#define STMT_35 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
" AND (op_depth > ?3 OR (op_depth = ?3 " \
" AND presence IN ('normal', 'incomplete'))) " \
"UNION ALL " \
"SELECT 1 FROM ACTUAL_NODE a " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
" AND NOT EXISTS (SELECT 1 FROM nodes n " \
" WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath) " \
""
#define STMT_DELETE_SHADOWED_RECURSIVE 36
#define STMT_36_INFO {"STMT_DELETE_SHADOWED_RECURSIVE", NULL}
#define STMT_36 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND (op_depth < ?3 " \
" OR (op_depth = ?3 AND presence = 'base-deleted')) " \
""
#define STMT_CLEAR_MOVED_TO_FROM_DEST 37
#define STMT_37_INFO {"STMT_CLEAR_MOVED_TO_FROM_DEST", NULL}
#define STMT_37 \
"UPDATE NODES SET moved_to = NULL " \
"WHERE wc_id = ?1 " \
" AND moved_to = ?2 " \
""
#define STMT_SELECT_NOT_PRESENT_DESCENDANTS 38
#define STMT_38_INFO {"STMT_SELECT_NOT_PRESENT_DESCENDANTS", NULL}
#define STMT_38 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND op_depth = ?3 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND presence = 'not-present' " \
""
#define STMT_COMMIT_DESCENDANTS_TO_BASE 39
#define STMT_39_INFO {"STMT_COMMIT_DESCENDANTS_TO_BASE", NULL}
#define STMT_39 \
"UPDATE NODES SET op_depth = 0, " \
" repos_id = ?4, " \
" repos_path = (CASE WHEN (?2) = '' THEN (CASE WHEN (?5) = '' THEN (local_relpath) WHEN (local_relpath) = '' THEN (?5) ELSE (?5) || '/' || (local_relpath) END) WHEN (?5) = '' THEN (CASE WHEN (?2) = '' THEN (local_relpath) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN '' WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN (?5) WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?5) || SUBSTR((local_relpath), LENGTH(?2)+1) END END), " \
" revision = ?6, " \
" dav_cache = NULL, " \
" moved_here = NULL, " \
" moved_to = NULL, " \
" presence = CASE presence " \
" WHEN 'normal' THEN 'normal' " \
" WHEN 'excluded' THEN 'excluded' " \
" ELSE 'not-present' " \
" END " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
""
#define STMT_SELECT_NODE_CHILDREN 40
#define STMT_40_INFO {"STMT_SELECT_NODE_CHILDREN", NULL}
#define STMT_40 \
"SELECT DISTINCT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_WORKING_CHILDREN 41
#define STMT_41_INFO {"STMT_SELECT_WORKING_CHILDREN", NULL}
#define STMT_41 \
"SELECT DISTINCT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
" AND (op_depth > (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2) " \
" OR " \
" (op_depth = (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2) " \
" AND presence IN ('normal', 'incomplete'))) " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_BASE_NOT_PRESENT_CHILDREN 42
#define STMT_42_INFO {"STMT_SELECT_BASE_NOT_PRESENT_CHILDREN", NULL}
#define STMT_42 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
" AND presence = 'not-present' " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_NODE_PROPS 43
#define STMT_43_INFO {"STMT_SELECT_NODE_PROPS", NULL}
#define STMT_43 \
"SELECT properties, presence FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
"ORDER BY op_depth DESC " \
""
#define STMT_SELECT_ACTUAL_PROPS 44
#define STMT_44_INFO {"STMT_SELECT_ACTUAL_PROPS", NULL}
#define STMT_44 \
"SELECT properties FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_UPDATE_ACTUAL_PROPS 45
#define STMT_45_INFO {"STMT_UPDATE_ACTUAL_PROPS", NULL}
#define STMT_45 \
"UPDATE actual_node SET properties = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_INSERT_ACTUAL_PROPS 46
#define STMT_46_INFO {"STMT_INSERT_ACTUAL_PROPS", NULL}
#define STMT_46 \
"INSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties) " \
"VALUES (?1, ?2, ?3, ?4) " \
""
#define STMT_INSERT_LOCK 47
#define STMT_47_INFO {"STMT_INSERT_LOCK", NULL}
#define STMT_47 \
"INSERT OR REPLACE INTO lock " \
"(repos_id, repos_relpath, lock_token, lock_owner, lock_comment, " \
" lock_date) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6) " \
""
#define STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE 48
#define STMT_48_INFO {"STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE", NULL}
#define STMT_48 \
"SELECT nodes.repos_id, nodes.repos_path, lock_token " \
"FROM nodes " \
"LEFT JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath " \
"WHERE wc_id = ?1 AND op_depth = 0 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_INSERT_WCROOT 49
#define STMT_49_INFO {"STMT_INSERT_WCROOT", NULL}
#define STMT_49 \
"INSERT INTO wcroot (local_abspath) " \
"VALUES (?1) " \
""
#define STMT_UPDATE_BASE_NODE_DAV_CACHE 50
#define STMT_50_INFO {"STMT_UPDATE_BASE_NODE_DAV_CACHE", NULL}
#define STMT_50 \
"UPDATE nodes SET dav_cache = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_SELECT_BASE_DAV_CACHE 51
#define STMT_51_INFO {"STMT_SELECT_BASE_DAV_CACHE", NULL}
#define STMT_51 \
"SELECT dav_cache FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_SELECT_DELETION_INFO 52
#define STMT_52_INFO {"STMT_SELECT_DELETION_INFO", NULL}
#define STMT_52 \
"SELECT b.presence, w.presence, w.op_depth, w.moved_to " \
"FROM nodes w " \
"LEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0 " \
"WHERE w.wc_id = ?1 AND w.local_relpath = ?2 " \
" AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
" WHERE d.wc_id = ?1 AND d.local_relpath = ?2 " \
" AND d.op_depth > 0) " \
"LIMIT 1 " \
""
#define STMT_SELECT_MOVED_TO_NODE 53
#define STMT_53_INFO {"STMT_SELECT_MOVED_TO_NODE", NULL}
#define STMT_53 \
"SELECT op_depth, moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL " \
"ORDER BY op_depth DESC " \
""
#define STMT_SELECT_OP_DEPTH_MOVED_TO 54
#define STMT_54_INFO {"STMT_SELECT_OP_DEPTH_MOVED_TO", NULL}
#define STMT_54 \
"SELECT op_depth, moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 " \
" AND EXISTS(SELECT * from nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
" AND presence IN ('normal', 'incomplete')) " \
"ORDER BY op_depth ASC " \
"LIMIT 1 " \
""
#define STMT_SELECT_MOVED_TO 55
#define STMT_55_INFO {"STMT_SELECT_MOVED_TO", NULL}
#define STMT_55 \
"SELECT moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
#define STMT_SELECT_MOVED_BACK 56
#define STMT_56_INFO {"STMT_SELECT_MOVED_BACK", NULL}
#define STMT_56 \
"SELECT u.local_relpath, " \
" u.presence, u.repos_id, u.repos_path, u.revision, " \
" l.presence, l.repos_id, l.repos_path, l.revision, " \
" u.moved_here, u.moved_to " \
"FROM nodes u " \
"LEFT OUTER JOIN nodes l ON l.wc_id = ?1 " \
" AND l.local_relpath = u.local_relpath " \
" AND l.op_depth = ?3 " \
"WHERE u.wc_id = ?1 " \
" AND u.local_relpath = ?2 " \
" AND u.op_depth = ?4 " \
"UNION ALL " \
"SELECT u.local_relpath, " \
" u.presence, u.repos_id, u.repos_path, u.revision, " \
" l.presence, l.repos_id, l.repos_path, l.revision, " \
" u.moved_here, NULL " \
"FROM nodes u " \
"LEFT OUTER JOIN nodes l ON l.wc_id=?1 " \
" AND l.local_relpath=u.local_relpath " \
" AND l.op_depth=?3 " \
"WHERE u.wc_id = ?1 " \
" AND (((u.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((u.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND u.op_depth = ?4 " \
""
#define STMT_DELETE_LOCK 57
#define STMT_57_INFO {"STMT_DELETE_LOCK", NULL}
#define STMT_57 \
"DELETE FROM lock " \
"WHERE repos_id = ?1 AND repos_relpath = ?2 " \
""
#define STMT_DELETE_LOCK_RECURSIVELY 58
#define STMT_58_INFO {"STMT_DELETE_LOCK_RECURSIVELY", NULL}
#define STMT_58 \
"DELETE FROM lock " \
"WHERE repos_id = ?1 AND (repos_relpath = ?2 OR (((repos_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((repos_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
#define STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE 59
#define STMT_59_INFO {"STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE", NULL}
#define STMT_59 \
"UPDATE nodes SET dav_cache = NULL " \
"WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
#define STMT_RECURSIVE_UPDATE_NODE_REPO 60
#define STMT_60_INFO {"STMT_RECURSIVE_UPDATE_NODE_REPO", NULL}
#define STMT_60 \
"UPDATE nodes SET repos_id = ?4, dav_cache = NULL " \
"WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3) " \
" OR (wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND repos_id = ?3) " \
""
#define STMT_UPDATE_LOCK_REPOS_ID 61
#define STMT_61_INFO {"STMT_UPDATE_LOCK_REPOS_ID", NULL}
#define STMT_61 \
"UPDATE lock SET repos_id = ?2 " \
"WHERE repos_id = ?1 " \
""
#define STMT_UPDATE_NODE_FILEINFO 62
#define STMT_62_INFO {"STMT_UPDATE_NODE_FILEINFO", NULL}
#define STMT_62 \
"UPDATE nodes SET translated_size = ?3, last_mod_time = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND op_depth = (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2) " \
""
#define STMT_INSERT_ACTUAL_CONFLICT 63
#define STMT_63_INFO {"STMT_INSERT_ACTUAL_CONFLICT", NULL}
#define STMT_63 \
"INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath) " \
"VALUES (?1, ?2, ?3, ?4) " \
""
#define STMT_UPDATE_ACTUAL_CONFLICT 64
#define STMT_64_INFO {"STMT_UPDATE_ACTUAL_CONFLICT", NULL}
#define STMT_64 \
"UPDATE actual_node SET conflict_data = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_UPDATE_ACTUAL_CHANGELISTS 65
#define STMT_65_INFO {"STMT_UPDATE_ACTUAL_CHANGELISTS", NULL}
#define STMT_65 \
"UPDATE actual_node SET changelist = ?3 " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND local_relpath = (SELECT local_relpath FROM targets_list AS t " \
" WHERE wc_id = ?1 " \
" AND t.local_relpath = actual_node.local_relpath " \
" AND kind = 'file') " \
""
#define STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST 66
#define STMT_66_INFO {"STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST", NULL}
#define STMT_66 \
"UPDATE actual_node SET changelist = NULL " \
" WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_MARK_SKIPPED_CHANGELIST_DIRS 67
#define STMT_67_INFO {"STMT_MARK_SKIPPED_CHANGELIST_DIRS", NULL}
#define STMT_67 \
"INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist) " \
"SELECT wc_id, local_relpath, 7, ?3 " \
"FROM targets_list " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND kind = 'dir' " \
""
#define STMT_RESET_ACTUAL_WITH_CHANGELIST 68
#define STMT_68_INFO {"STMT_RESET_ACTUAL_WITH_CHANGELIST", NULL}
#define STMT_68 \
"REPLACE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath, changelist) " \
"VALUES (?1, ?2, ?3, ?4) " \
""
#define STMT_CREATE_CHANGELIST_LIST 69
#define STMT_69_INFO {"STMT_CREATE_CHANGELIST_LIST", NULL}
#define STMT_69 \
"DROP TABLE IF EXISTS changelist_list; " \
"CREATE TEMPORARY TABLE changelist_list ( " \
" wc_id INTEGER NOT NULL, " \
" local_relpath TEXT NOT NULL, " \
" notify INTEGER NOT NULL, " \
" changelist TEXT NOT NULL, " \
" PRIMARY KEY (wc_id, local_relpath, notify DESC) " \
") " \
""
#define STMT_CREATE_CHANGELIST_TRIGGER 70
#define STMT_70_INFO {"STMT_CREATE_CHANGELIST_TRIGGER", NULL}
#define STMT_70 \
"DROP TRIGGER IF EXISTS trigger_changelist_list_change; " \
"CREATE TEMPORARY TRIGGER trigger_changelist_list_change " \
"BEFORE UPDATE ON actual_node " \
"WHEN old.changelist IS NOT new.changelist " \
"BEGIN " \
" INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist) " \
" SELECT old.wc_id, old.local_relpath, 27, old.changelist " \
" WHERE old.changelist is NOT NULL; " \
" INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist) " \
" SELECT new.wc_id, new.local_relpath, 26, new.changelist " \
" WHERE new.changelist IS NOT NULL; " \
"END " \
""
#define STMT_FINALIZE_CHANGELIST 71
#define STMT_71_INFO {"STMT_FINALIZE_CHANGELIST", NULL}
#define STMT_71 \
"DROP TRIGGER trigger_changelist_list_change; " \
"DROP TABLE changelist_list; " \
"DROP TABLE targets_list " \
""
#define STMT_SELECT_CHANGELIST_LIST 72
#define STMT_72_INFO {"STMT_SELECT_CHANGELIST_LIST", NULL}
#define STMT_72 \
"SELECT wc_id, local_relpath, notify, changelist " \
"FROM changelist_list " \
"ORDER BY wc_id, local_relpath ASC, notify DESC " \
""
#define STMT_CREATE_TARGETS_LIST 73
#define STMT_73_INFO {"STMT_CREATE_TARGETS_LIST", NULL}
#define STMT_73 \
"DROP TABLE IF EXISTS targets_list; " \
"CREATE TEMPORARY TABLE targets_list ( " \
" wc_id INTEGER NOT NULL, " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" kind TEXT NOT NULL, " \
" PRIMARY KEY (wc_id, local_relpath) " \
" ); " \
""
#define STMT_DROP_TARGETS_LIST 74
#define STMT_74_INFO {"STMT_DROP_TARGETS_LIST", NULL}
#define STMT_74 \
"DROP TABLE targets_list " \
""
#define STMT_INSERT_TARGET 75
#define STMT_75_INFO {"STMT_INSERT_TARGET", NULL}
#define STMT_75 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
""
#define STMT_INSERT_TARGET_DEPTH_FILES 76
#define STMT_76_INFO {"STMT_INSERT_TARGET_DEPTH_FILES", NULL}
#define STMT_76 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
" AND kind = 'file' " \
""
#define STMT_INSERT_TARGET_DEPTH_IMMEDIATES 77
#define STMT_77_INFO {"STMT_INSERT_TARGET_DEPTH_IMMEDIATES", NULL}
#define STMT_77 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
""
#define STMT_INSERT_TARGET_DEPTH_INFINITY 78
#define STMT_78_INFO {"STMT_INSERT_TARGET_DEPTH_INFINITY", NULL}
#define STMT_78 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_INSERT_TARGET_WITH_CHANGELIST 79
#define STMT_79_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST", NULL}
#define STMT_79 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
" ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath " \
" WHERE N.wc_id = ?1 " \
" AND N.local_relpath = ?2 " \
" AND A.changelist = ?3 " \
""
#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES 80
#define STMT_80_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES", NULL}
#define STMT_80 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
" ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath " \
" WHERE N.wc_id = ?1 " \
" AND N.parent_relpath = ?2 " \
" AND kind = 'file' " \
" AND A.changelist = ?3 " \
""
#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES 81
#define STMT_81_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES", NULL}
#define STMT_81 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
" ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath " \
" WHERE N.wc_id = ?1 " \
" AND N.parent_relpath = ?2 " \
" AND A.changelist = ?3 " \
""
#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY 82
#define STMT_82_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY", NULL}
#define STMT_82 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
" ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath " \
" WHERE N.wc_id = ?1 " \
" AND (((N.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((N.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND A.changelist = ?3 " \
""
#define STMT_INSERT_ACTUAL_EMPTIES 83
#define STMT_83_INFO {"STMT_INSERT_ACTUAL_EMPTIES", NULL}
#define STMT_83 \
"INSERT OR IGNORE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath) " \
"SELECT wc_id, local_relpath, parent_relpath " \
"FROM targets_list " \
""
#define STMT_INSERT_ACTUAL_EMPTIES_FILES 84
#define STMT_84_INFO {"STMT_INSERT_ACTUAL_EMPTIES_FILES", NULL}
#define STMT_84 \
"INSERT OR IGNORE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath) " \
"SELECT wc_id, local_relpath, parent_relpath " \
"FROM targets_list " \
"WHERE kind='file' " \
""
#define STMT_DELETE_ACTUAL_EMPTY 85
#define STMT_85_INFO {"STMT_DELETE_ACTUAL_EMPTY", NULL}
#define STMT_85 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND properties IS NULL " \
" AND conflict_data IS NULL " \
" AND changelist IS NULL " \
" AND text_mod IS NULL " \
" AND older_checksum IS NULL " \
" AND right_checksum IS NULL " \
" AND left_checksum IS NULL " \
""
#define STMT_DELETE_ACTUAL_EMPTIES 86
#define STMT_86_INFO {"STMT_DELETE_ACTUAL_EMPTIES", NULL}
#define STMT_86 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND properties IS NULL " \
" AND conflict_data IS NULL " \
" AND changelist IS NULL " \
" AND text_mod IS NULL " \
" AND older_checksum IS NULL " \
" AND right_checksum IS NULL " \
" AND left_checksum IS NULL " \
""
#define STMT_DELETE_BASE_NODE 87
#define STMT_87_INFO {"STMT_DELETE_BASE_NODE", NULL}
#define STMT_87 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_DELETE_WORKING_NODE 88
#define STMT_88_INFO {"STMT_DELETE_WORKING_NODE", NULL}
#define STMT_88 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND op_depth = (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0) " \
""
#define STMT_DELETE_LOWEST_WORKING_NODE 89
#define STMT_89_INFO {"STMT_DELETE_LOWEST_WORKING_NODE", NULL}
#define STMT_89 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND op_depth = (SELECT MIN(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3) " \
" AND presence = 'base-deleted' " \
""
#define STMT_DELETE_NODE_ALL_LAYERS 90
#define STMT_90_INFO {"STMT_DELETE_NODE_ALL_LAYERS", NULL}
#define STMT_90 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE 91
#define STMT_91_INFO {"STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE", NULL}
#define STMT_91 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth >= ?3 " \
""
#define STMT_DELETE_ACTUAL_NODE 92
#define STMT_92_INFO {"STMT_DELETE_ACTUAL_NODE", NULL}
#define STMT_92 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_DELETE_ACTUAL_NODE_RECURSIVE 93
#define STMT_93_INFO {"STMT_DELETE_ACTUAL_NODE_RECURSIVE", NULL}
#define STMT_93 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
#define STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST 94
#define STMT_94_INFO {"STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST", NULL}
#define STMT_94 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
" AND (changelist IS NULL " \
" OR NOT EXISTS (SELECT 1 FROM nodes_current c " \
" WHERE c.wc_id = ?1 AND c.local_relpath = ?2 " \
" AND c.kind = 'file')) " \
""
#define STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 95
#define STMT_95_INFO {"STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE", NULL}
#define STMT_95 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND (changelist IS NULL " \
" OR NOT EXISTS (SELECT 1 FROM nodes_current c " \
" WHERE c.wc_id = ?1 " \
" AND c.local_relpath = actual_node.local_relpath " \
" AND c.kind = 'file')) " \
""
#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST 96
#define STMT_96_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST", NULL}
#define STMT_96 \
"UPDATE actual_node " \
"SET properties = NULL, " \
" text_mod = NULL, " \
" conflict_data = NULL, " \
" tree_conflict_data = NULL, " \
" older_checksum = NULL, " \
" left_checksum = NULL, " \
" right_checksum = NULL " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT 97
#define STMT_97_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT", NULL}
#define STMT_97 \
"UPDATE actual_node " \
"SET properties = NULL, " \
" text_mod = NULL, " \
" tree_conflict_data = NULL, " \
" older_checksum = NULL, " \
" left_checksum = NULL, " \
" right_checksum = NULL, " \
" changelist = NULL " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 98
#define STMT_98_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE", NULL}
#define STMT_98 \
"UPDATE actual_node " \
"SET properties = NULL, " \
" text_mod = NULL, " \
" conflict_data = NULL, " \
" tree_conflict_data = NULL, " \
" older_checksum = NULL, " \
" left_checksum = NULL, " \
" right_checksum = NULL " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
#define STMT_UPDATE_NODE_BASE_DEPTH 99
#define STMT_99_INFO {"STMT_UPDATE_NODE_BASE_DEPTH", NULL}
#define STMT_99 \
"UPDATE nodes SET depth = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
" AND kind='dir' " \
" AND presence IN ('normal', 'incomplete') " \
""
#define STMT_UPDATE_NODE_BASE_PRESENCE 100
#define STMT_100_INFO {"STMT_UPDATE_NODE_BASE_PRESENCE", NULL}
#define STMT_100 \
"UPDATE nodes SET presence = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH 101
#define STMT_101_INFO {"STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH", NULL}
#define STMT_101 \
"UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_LOOK_FOR_WORK 102
#define STMT_102_INFO {"STMT_LOOK_FOR_WORK", NULL}
#define STMT_102 \
"SELECT id FROM work_queue LIMIT 1 " \
""
#define STMT_INSERT_WORK_ITEM 103
#define STMT_103_INFO {"STMT_INSERT_WORK_ITEM", NULL}
#define STMT_103 \
"INSERT INTO work_queue (work) VALUES (?1) " \
""
#define STMT_SELECT_WORK_ITEM 104
#define STMT_104_INFO {"STMT_SELECT_WORK_ITEM", NULL}
#define STMT_104 \
"SELECT id, work FROM work_queue ORDER BY id LIMIT 1 " \
""
#define STMT_DELETE_WORK_ITEM 105
#define STMT_105_INFO {"STMT_DELETE_WORK_ITEM", NULL}
#define STMT_105 \
"DELETE FROM work_queue WHERE id = ?1 " \
""
#define STMT_INSERT_OR_IGNORE_PRISTINE 106
#define STMT_106_INFO {"STMT_INSERT_OR_IGNORE_PRISTINE", NULL}
#define STMT_106 \
"INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount) " \
"VALUES (?1, ?2, ?3, 0) " \
""
#define STMT_INSERT_PRISTINE 107
#define STMT_107_INFO {"STMT_INSERT_PRISTINE", NULL}
#define STMT_107 \
"INSERT INTO pristine (checksum, md5_checksum, size, refcount) " \
"VALUES (?1, ?2, ?3, 0) " \
""
#define STMT_SELECT_PRISTINE 108
#define STMT_108_INFO {"STMT_SELECT_PRISTINE", NULL}
#define STMT_108 \
"SELECT md5_checksum " \
"FROM pristine " \
"WHERE checksum = ?1 " \
""
#define STMT_SELECT_PRISTINE_SIZE 109
#define STMT_109_INFO {"STMT_SELECT_PRISTINE_SIZE", NULL}
#define STMT_109 \
"SELECT size " \
"FROM pristine " \
"WHERE checksum = ?1 LIMIT 1 " \
""
#define STMT_SELECT_PRISTINE_BY_MD5 110
#define STMT_110_INFO {"STMT_SELECT_PRISTINE_BY_MD5", NULL}
#define STMT_110 \
"SELECT checksum " \
"FROM pristine " \
"WHERE md5_checksum = ?1 " \
""
#define STMT_SELECT_UNREFERENCED_PRISTINES 111
#define STMT_111_INFO {"STMT_SELECT_UNREFERENCED_PRISTINES", NULL}
#define STMT_111 \
"SELECT checksum " \
"FROM pristine " \
"WHERE refcount = 0 " \
""
#define STMT_DELETE_PRISTINE_IF_UNREFERENCED 112
#define STMT_112_INFO {"STMT_DELETE_PRISTINE_IF_UNREFERENCED", NULL}
#define STMT_112 \
"DELETE FROM pristine " \
"WHERE checksum = ?1 AND refcount = 0 " \
""
#define STMT_SELECT_COPY_PRISTINES 113
#define STMT_113_INFO {"STMT_SELECT_COPY_PRISTINES", NULL}
#define STMT_113 \
"SELECT n.checksum, md5_checksum, size " \
"FROM nodes_current n " \
"LEFT JOIN pristine p ON n.checksum = p.checksum " \
"WHERE wc_id = ?1 " \
" AND n.local_relpath = ?2 " \
" AND n.checksum IS NOT NULL " \
"UNION ALL " \
"SELECT n.checksum, md5_checksum, size " \
"FROM nodes n " \
"LEFT JOIN pristine p ON n.checksum = p.checksum " \
"WHERE wc_id = ?1 " \
" AND (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth >= " \
" (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2) " \
" AND n.checksum IS NOT NULL " \
""
#define STMT_VACUUM 114
#define STMT_114_INFO {"STMT_VACUUM", NULL}
#define STMT_114 \
"VACUUM " \
""
#define STMT_SELECT_CONFLICT_VICTIMS 115
#define STMT_115_INFO {"STMT_SELECT_CONFLICT_VICTIMS", NULL}
#define STMT_115 \
"SELECT local_relpath, conflict_data " \
"FROM actual_node " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND " \
" NOT (conflict_data IS NULL) " \
""
#define STMT_INSERT_WC_LOCK 116
#define STMT_116_INFO {"STMT_INSERT_WC_LOCK", NULL}
#define STMT_116 \
"INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels) " \
"VALUES (?1, ?2, ?3) " \
""
#define STMT_SELECT_WC_LOCK 117
#define STMT_117_INFO {"STMT_SELECT_WC_LOCK", NULL}
#define STMT_117 \
"SELECT locked_levels FROM wc_lock " \
"WHERE wc_id = ?1 AND local_dir_relpath = ?2 " \
""
#define STMT_SELECT_ANCESTOR_WCLOCKS 118
#define STMT_118_INFO {"STMT_SELECT_ANCESTOR_WCLOCKS", NULL}
#define STMT_118 \
"SELECT local_dir_relpath, locked_levels FROM wc_lock " \
"WHERE wc_id = ?1 " \
" AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2) " \
" OR local_dir_relpath = '') " \
""
#define STMT_DELETE_WC_LOCK 119
#define STMT_119_INFO {"STMT_DELETE_WC_LOCK", NULL}
#define STMT_119 \
"DELETE FROM wc_lock " \
"WHERE wc_id = ?1 AND local_dir_relpath = ?2 " \
""
#define STMT_FIND_WC_LOCK 120
#define STMT_120_INFO {"STMT_FIND_WC_LOCK", NULL}
#define STMT_120 \
"SELECT local_dir_relpath FROM wc_lock " \
"WHERE wc_id = ?1 " \
" AND (((local_dir_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_dir_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_FIND_CONFLICT_DESCENDANT 121
#define STMT_121_INFO {"STMT_FIND_CONFLICT_DESCENDANT", NULL}
#define STMT_121 \
"SELECT 1 FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND local_relpath > (?2 || '/') " \
" AND local_relpath < (?2 || '0') " \
" AND conflict_data IS NOT NULL " \
"LIMIT 1 " \
""
#define STMT_DELETE_WC_LOCK_ORPHAN 122
#define STMT_122_INFO {"STMT_DELETE_WC_LOCK_ORPHAN", NULL}
#define STMT_122 \
"DELETE FROM wc_lock " \
"WHERE wc_id = ?1 AND local_dir_relpath = ?2 " \
"AND NOT EXISTS (SELECT 1 FROM nodes " \
" WHERE nodes.wc_id = ?1 " \
" AND nodes.local_relpath = wc_lock.local_dir_relpath) " \
""
#define STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE 123
#define STMT_123_INFO {"STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE", NULL}
#define STMT_123 \
"DELETE FROM wc_lock " \
"WHERE wc_id = ?1 " \
" AND (local_dir_relpath = ?2 " \
" OR (((local_dir_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_dir_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND NOT EXISTS (SELECT 1 FROM nodes " \
" WHERE nodes.wc_id = ?1 " \
" AND nodes.local_relpath = wc_lock.local_dir_relpath) " \
""
#define STMT_APPLY_CHANGES_TO_BASE_NODE 124
#define STMT_124_INFO {"STMT_APPLY_CHANGES_TO_BASE_NODE", NULL}
#define STMT_124 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, dav_cache, symlink_target, " \
" inherited_props, file_external ) " \
"VALUES (?1, ?2, 0, " \
" ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, " \
" (SELECT file_external FROM nodes " \
" WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
" AND op_depth = 0)) " \
""
#define STMT_INSTALL_WORKING_NODE_FOR_DELETE 125
#define STMT_125_INFO {"STMT_INSTALL_WORKING_NODE_FOR_DELETE", NULL}
#define STMT_125 \
"INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, " \
" parent_relpath, presence, kind) " \
"VALUES(?1, ?2, ?3, ?4, 'base-deleted', ?5) " \
""
#define STMT_REPLACE_WITH_BASE_DELETED 126
#define STMT_126_INFO {"STMT_REPLACE_WITH_BASE_DELETED", NULL}
#define STMT_126 \
"INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath, " \
" kind, moved_to, presence) " \
"SELECT wc_id, local_relpath, op_depth, parent_relpath, " \
" kind, moved_to, 'base-deleted' " \
" FROM nodes " \
" WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
" AND op_depth = ?3 " \
""
#define STMT_INSERT_DELETE_FROM_NODE_RECURSIVE 127
#define STMT_127_INFO {"STMT_INSERT_DELETE_FROM_NODE_RECURSIVE", NULL}
#define STMT_127 \
"INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, presence, kind) " \
"SELECT wc_id, local_relpath, ?4 , parent_relpath, 'base-deleted', " \
" kind " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
"UNION ALL " \
"SELECT wc_id, local_relpath, ?4 , parent_relpath, 'base-deleted', " \
" kind " \
"FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
" AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'server-excluded') " \
" AND file_external IS NULL " \
"ORDER BY local_relpath " \
""
#define STMT_INSERT_WORKING_NODE_FROM_BASE_COPY 128
#define STMT_128_INFO {"STMT_INSERT_WORKING_NODE_FROM_BASE_COPY", NULL}
#define STMT_128 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, last_mod_time, " \
" symlink_target, moved_to ) " \
"SELECT wc_id, local_relpath, ?3 , parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, kind, changed_revision, " \
" changed_date, changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, " \
" (SELECT moved_to FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_INSERT_DELETE_FROM_BASE 129
#define STMT_129_INFO {"STMT_INSERT_DELETE_FROM_BASE", NULL}
#define STMT_129 \
"INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, presence, kind) " \
"SELECT wc_id, local_relpath, ?3 , parent_relpath, " \
" 'base-deleted', kind " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE 130
#define STMT_130_INFO {"STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE", NULL}
#define STMT_130 \
"UPDATE nodes SET op_depth = ?3 + 1 " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
""
#define STMT_COPY_OP_DEPTH_RECURSIVE 131
#define STMT_131_INFO {"STMT_COPY_OP_DEPTH_RECURSIVE", NULL}
#define STMT_131 \
"INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, last_mod_time, " \
" symlink_target, moved_here, moved_to ) " \
"SELECT " \
" wc_id, local_relpath, ?4, parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, kind, changed_revision, " \
" changed_date, changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, NULL, NULL " \
"FROM nodes " \
"WHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2 " \
"UNION ALL " \
"SELECT " \
" wc_id, local_relpath, ?4, parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, kind, changed_revision, " \
" changed_date, changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, NULL, NULL " \
"FROM nodes " \
"WHERE wc_id = ?1 AND op_depth = ?3 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
"ORDER BY local_relpath " \
""
#define STMT_DOES_NODE_EXIST 132
#define STMT_132_INFO {"STMT_DOES_NODE_EXIST", NULL}
#define STMT_132 \
"SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 " \
"LIMIT 1 " \
""
#define STMT_HAS_SERVER_EXCLUDED_DESCENDANTS 133
#define STMT_133_INFO {"STMT_HAS_SERVER_EXCLUDED_DESCENDANTS", NULL}
#define STMT_133 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = 0 AND presence = 'server-excluded' " \
"LIMIT 1 " \
""
#define STMT_SELECT_ALL_EXCLUDED_DESCENDANTS 134
#define STMT_134_INFO {"STMT_SELECT_ALL_EXCLUDED_DESCENDANTS", NULL}
#define STMT_134 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = 0 " \
" AND (presence = 'server-excluded' OR presence = 'excluded') " \
""
#define STMT_INSERT_WORKING_NODE_COPY_FROM 135
#define STMT_135_INFO {"STMT_INSERT_WORKING_NODE_COPY_FROM", NULL}
#define STMT_135 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, moved_here, kind, changed_revision, " \
" changed_date, changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, moved_to ) " \
"SELECT wc_id, ?3 , ?4 , ?5 , " \
" repos_id, repos_path, revision, ?6 , depth, " \
" ?7, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, " \
" (SELECT dst.moved_to FROM nodes AS dst " \
" WHERE dst.wc_id = ?1 " \
" AND dst.local_relpath = ?3 " \
" AND dst.op_depth = ?4) " \
"FROM nodes_current " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH 136
#define STMT_136_INFO {"STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH", NULL}
#define STMT_136 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, moved_here, kind, changed_revision, " \
" changed_date, changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, moved_to ) " \
"SELECT wc_id, ?3 , ?4 , ?5 , " \
" repos_id, repos_path, revision, ?6 , depth, " \
" ?8 , kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, " \
" last_mod_time, symlink_target, " \
" (SELECT dst.moved_to FROM nodes AS dst " \
" WHERE dst.wc_id = ?1 " \
" AND dst.local_relpath = ?3 " \
" AND dst.op_depth = ?4) " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7 " \
""
#define STMT_UPDATE_BASE_REVISION 137
#define STMT_137_INFO {"STMT_UPDATE_BASE_REVISION", NULL}
#define STMT_137 \
"UPDATE nodes SET revision = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_UPDATE_BASE_REPOS 138
#define STMT_138_INFO {"STMT_UPDATE_BASE_REPOS", NULL}
#define STMT_138 \
"UPDATE nodes SET repos_id = ?3, repos_path = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
#define STMT_ACTUAL_HAS_CHILDREN 139
#define STMT_139_INFO {"STMT_ACTUAL_HAS_CHILDREN", NULL}
#define STMT_139 \
"SELECT 1 FROM actual_node " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
"LIMIT 1 " \
""
#define STMT_INSERT_EXTERNAL 140
#define STMT_140_INFO {"STMT_INSERT_EXTERNAL", NULL}
#define STMT_140 \
"INSERT OR REPLACE INTO externals ( " \
" wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath, " \
" repos_id, def_repos_relpath, def_operational_revision, def_revision) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10) " \
""
#define STMT_SELECT_EXTERNAL_INFO 141
#define STMT_141_INFO {"STMT_SELECT_EXTERNAL_INFO", NULL}
#define STMT_141 \
"SELECT presence, kind, def_local_relpath, repos_id, " \
" def_repos_relpath, def_operational_revision, def_revision " \
"FROM externals WHERE wc_id = ?1 AND local_relpath = ?2 " \
"LIMIT 1 " \
""
#define STMT_DELETE_FILE_EXTERNALS 142
#define STMT_142_INFO {"STMT_DELETE_FILE_EXTERNALS", NULL}
#define STMT_142 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = 0 " \
" AND file_external IS NOT NULL " \
""
#define STMT_DELETE_FILE_EXTERNAL_REGISTATIONS 143
#define STMT_143_INFO {"STMT_DELETE_FILE_EXTERNAL_REGISTATIONS", NULL}
#define STMT_143 \
"DELETE FROM externals " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND kind != 'dir' " \
""
#define STMT_DELETE_EXTERNAL_REGISTATIONS 144
#define STMT_144_INFO {"STMT_DELETE_EXTERNAL_REGISTATIONS", NULL}
#define STMT_144 \
"DELETE FROM externals " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW 145
#define STMT_145_INFO {"STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW", NULL}
#define STMT_145 \
"SELECT local_relpath, kind, def_repos_relpath, " \
" (SELECT root FROM repository AS r WHERE r.id = e.repos_id) " \
"FROM externals e " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND def_revision IS NULL " \
" AND repos_id = (SELECT repos_id " \
" FROM nodes AS n " \
" WHERE n.wc_id = ?1 " \
" AND n.local_relpath = '' " \
" AND n.op_depth = 0) " \
" AND ((kind='dir') " \
" OR EXISTS (SELECT 1 FROM nodes " \
" WHERE nodes.wc_id = e.wc_id " \
" AND nodes.local_relpath = e.parent_relpath)) " \
""
#define STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW 146
#define STMT_146_INFO {"STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW", NULL}
#define STMT_146 \
"SELECT local_relpath, kind, def_repos_relpath, " \
" (SELECT root FROM repository AS r WHERE r.id = e.repos_id) " \
"FROM externals e " \
"WHERE wc_id = ?1 " \
" AND (((e.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((e.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND parent_relpath = ?2 " \
" AND def_revision IS NULL " \
" AND repos_id = (SELECT repos_id " \
" FROM nodes AS n " \
" WHERE n.wc_id = ?1 " \
" AND n.local_relpath = '' " \
" AND n.op_depth = 0) " \
" AND ((kind='dir') " \
" OR EXISTS (SELECT 1 FROM nodes " \
" WHERE nodes.wc_id = e.wc_id " \
" AND nodes.local_relpath = e.parent_relpath)) " \
""
#define STMT_SELECT_EXTERNALS_DEFINED 147
#define STMT_147_INFO {"STMT_SELECT_EXTERNALS_DEFINED", NULL}
#define STMT_147 \
"SELECT local_relpath, def_local_relpath " \
"FROM externals " \
"WHERE (wc_id = ?1 AND def_local_relpath = ?2) " \
" OR (wc_id = ?1 AND (((def_local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((def_local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
#define STMT_DELETE_EXTERNAL 148
#define STMT_148_INFO {"STMT_DELETE_EXTERNAL", NULL}
#define STMT_148 \
"DELETE FROM externals " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
#define STMT_SELECT_EXTERNAL_PROPERTIES 149
#define STMT_149_INFO {"STMT_SELECT_EXTERNAL_PROPERTIES", NULL}
#define STMT_149 \
"SELECT IFNULL((SELECT properties FROM actual_node a " \
" WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), " \
" properties), " \
" local_relpath, depth " \
"FROM nodes_current n " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND kind = 'dir' AND presence IN ('normal', 'incomplete') " \
"UNION ALL " \
"SELECT IFNULL((SELECT properties FROM actual_node a " \
" WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), " \
" properties), " \
" local_relpath, depth " \
"FROM nodes_current n " \
"WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND kind = 'dir' AND presence IN ('normal', 'incomplete') " \
""
#define STMT_SELECT_CURRENT_PROPS_RECURSIVE 150
#define STMT_150_INFO {"STMT_SELECT_CURRENT_PROPS_RECURSIVE", NULL}
#define STMT_150 \
"SELECT IFNULL((SELECT properties FROM actual_node a " \
" WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), " \
" properties), " \
" local_relpath " \
"FROM nodes_current n " \
"WHERE (wc_id = ?1 AND local_relpath = ?2) " \
" OR (wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
#define STMT_PRAGMA_LOCKING_MODE 151
#define STMT_151_INFO {"STMT_PRAGMA_LOCKING_MODE", NULL}
#define STMT_151 \
"PRAGMA locking_mode = exclusive; " \
"PRAGMA journal_mode = DELETE " \
""
#define STMT_INSERT_ACTUAL_NODE 152
#define STMT_152_INFO {"STMT_INSERT_ACTUAL_NODE", NULL}
#define STMT_152 \
"INSERT OR REPLACE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6) " \
""
#define STMT_SELECT_ALL_FILES 153
#define STMT_153_INFO {"STMT_SELECT_ALL_FILES", NULL}
#define STMT_153 \
"SELECT local_relpath FROM nodes_current " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = 'file' " \
""
#define STMT_UPDATE_NODE_PROPS 154
#define STMT_154_INFO {"STMT_UPDATE_NODE_PROPS", NULL}
#define STMT_154 \
"UPDATE nodes SET properties = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
#define STMT_PRAGMA_TABLE_INFO_NODES 155
#define STMT_155_INFO {"STMT_PRAGMA_TABLE_INFO_NODES", NULL}
#define STMT_155 \
"PRAGMA table_info(\"NODES\") " \
""
#define STMT_CREATE_TARGET_PROP_CACHE 156
#define STMT_156_INFO {"STMT_CREATE_TARGET_PROP_CACHE", NULL}
#define STMT_156 \
"DROP TABLE IF EXISTS target_prop_cache; " \
"CREATE TEMPORARY TABLE target_prop_cache ( " \
" local_relpath TEXT NOT NULL PRIMARY KEY, " \
" kind TEXT NOT NULL, " \
" properties BLOB " \
"); " \
""
#define STMT_CACHE_TARGET_PROPS 157
#define STMT_157_INFO {"STMT_CACHE_TARGET_PROPS", NULL}
#define STMT_157 \
"INSERT INTO target_prop_cache(local_relpath, kind, properties) " \
" SELECT n.local_relpath, n.kind, " \
" IFNULL((SELECT properties FROM actual_node AS a " \
" WHERE a.wc_id = n.wc_id " \
" AND a.local_relpath = n.local_relpath), " \
" n.properties) " \
" FROM targets_list AS t " \
" JOIN nodes AS n " \
" ON n.wc_id = ?1 " \
" AND n.local_relpath = t.local_relpath " \
" AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3 " \
" WHERE n3.wc_id = ?1 " \
" AND n3.local_relpath = t.local_relpath) " \
" WHERE t.wc_id = ?1 " \
" AND (presence='normal' OR presence='incomplete') " \
" ORDER BY t.local_relpath " \
""
#define STMT_CACHE_TARGET_PRISTINE_PROPS 158
#define STMT_158_INFO {"STMT_CACHE_TARGET_PRISTINE_PROPS", NULL}
#define STMT_158 \
"INSERT INTO target_prop_cache(local_relpath, kind, properties) " \
" SELECT n.local_relpath, n.kind, " \
" CASE n.presence " \
" WHEN 'base-deleted' " \
" THEN (SELECT properties FROM nodes AS p " \
" WHERE p.wc_id = n.wc_id " \
" AND p.local_relpath = n.local_relpath " \
" AND p.op_depth < n.op_depth " \
" ORDER BY p.op_depth DESC ) " \
" ELSE properties END " \
" FROM targets_list AS t " \
" JOIN nodes AS n " \
" ON n.wc_id = ?1 " \
" AND n.local_relpath = t.local_relpath " \
" AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3 " \
" WHERE n3.wc_id = ?1 " \
" AND n3.local_relpath = t.local_relpath) " \
" WHERE t.wc_id = ?1 " \
" AND (presence = 'normal' " \
" OR presence = 'incomplete' " \
" OR presence = 'base-deleted') " \
" ORDER BY t.local_relpath " \
""
#define STMT_SELECT_ALL_TARGET_PROP_CACHE 159
#define STMT_159_INFO {"STMT_SELECT_ALL_TARGET_PROP_CACHE", NULL}
#define STMT_159 \
"SELECT local_relpath, properties FROM target_prop_cache " \
"ORDER BY local_relpath " \
""
#define STMT_DROP_TARGET_PROP_CACHE 160
#define STMT_160_INFO {"STMT_DROP_TARGET_PROP_CACHE", NULL}
#define STMT_160 \
"DROP TABLE target_prop_cache; " \
""
#define STMT_CREATE_REVERT_LIST 161
#define STMT_161_INFO {"STMT_CREATE_REVERT_LIST", NULL}
#define STMT_161 \
"DROP TABLE IF EXISTS revert_list; " \
"CREATE TEMPORARY TABLE revert_list ( " \
" local_relpath TEXT NOT NULL, " \
" actual INTEGER NOT NULL, " \
" conflict_data BLOB, " \
" notify INTEGER, " \
" op_depth INTEGER, " \
" repos_id INTEGER, " \
" kind TEXT, " \
" PRIMARY KEY (local_relpath, actual) " \
" ); " \
"DROP TRIGGER IF EXISTS trigger_revert_list_nodes; " \
"CREATE TEMPORARY TRIGGER trigger_revert_list_nodes " \
"BEFORE DELETE ON nodes " \
"BEGIN " \
" INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth, " \
" repos_id, kind) " \
" SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind; " \
"END; " \
"DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete; " \
"CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete " \
"BEFORE DELETE ON actual_node " \
"BEGIN " \
" INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data, " \
" notify) " \
" SELECT OLD.local_relpath, 1, OLD.conflict_data, " \
" CASE " \
" WHEN OLD.properties IS NOT NULL " \
" THEN 1 " \
" WHEN NOT EXISTS(SELECT 1 FROM NODES n " \
" WHERE n.wc_id = OLD.wc_id " \
" AND n.local_relpath = OLD.local_relpath) " \
" THEN 1 " \
" END notify " \
" WHERE OLD.conflict_data IS NOT NULL " \
" OR notify IS NOT NULL; " \
"END; " \
"DROP TRIGGER IF EXISTS trigger_revert_list_actual_update; " \
"CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update " \
"BEFORE UPDATE ON actual_node " \
"BEGIN " \
" INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data, " \
" notify) " \
" SELECT OLD.local_relpath, 1, OLD.conflict_data, " \
" CASE " \
" WHEN OLD.properties IS NOT NULL " \
" THEN 1 " \
" WHEN NOT EXISTS(SELECT 1 FROM NODES n " \
" WHERE n.wc_id = OLD.wc_id " \
" AND n.local_relpath = OLD.local_relpath) " \
" THEN 1 " \
" END notify " \
" WHERE OLD.conflict_data IS NOT NULL " \
" OR notify IS NOT NULL; " \
"END " \
""
#define STMT_DROP_REVERT_LIST_TRIGGERS 162
#define STMT_162_INFO {"STMT_DROP_REVERT_LIST_TRIGGERS", NULL}
#define STMT_162 \
"DROP TRIGGER trigger_revert_list_nodes; " \
"DROP TRIGGER trigger_revert_list_actual_delete; " \
"DROP TRIGGER trigger_revert_list_actual_update " \
""
#define STMT_SELECT_REVERT_LIST 163
#define STMT_163_INFO {"STMT_SELECT_REVERT_LIST", NULL}
#define STMT_163 \
"SELECT actual, notify, kind, op_depth, repos_id, conflict_data " \
"FROM revert_list " \
"WHERE local_relpath = ?1 " \
"ORDER BY actual DESC " \
""
#define STMT_SELECT_REVERT_LIST_COPIED_CHILDREN 164
#define STMT_164_INFO {"STMT_SELECT_REVERT_LIST_COPIED_CHILDREN", NULL}
#define STMT_164 \
"SELECT local_relpath, kind " \
"FROM revert_list " \
"WHERE (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END)) " \
" AND op_depth >= ?2 " \
" AND repos_id IS NOT NULL " \
"ORDER BY local_relpath " \
""
#define STMT_DELETE_REVERT_LIST 165
#define STMT_165_INFO {"STMT_DELETE_REVERT_LIST", NULL}
#define STMT_165 \
"DELETE FROM revert_list WHERE local_relpath = ?1 " \
""
#define STMT_SELECT_REVERT_LIST_RECURSIVE 166
#define STMT_166_INFO {"STMT_SELECT_REVERT_LIST_RECURSIVE", NULL}
#define STMT_166 \
"SELECT p.local_relpath, n.kind, a.notify, a.kind " \
"FROM (SELECT DISTINCT local_relpath " \
" FROM revert_list " \
" WHERE (local_relpath = ?1 " \
" OR (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END)))) p " \
"LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0 " \
"LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1 " \
"ORDER BY p.local_relpath " \
""
#define STMT_DELETE_REVERT_LIST_RECURSIVE 167
#define STMT_167_INFO {"STMT_DELETE_REVERT_LIST_RECURSIVE", NULL}
#define STMT_167 \
"DELETE FROM revert_list " \
"WHERE (local_relpath = ?1 " \
" OR (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END))) " \
""
#define STMT_DROP_REVERT_LIST 168
#define STMT_168_INFO {"STMT_DROP_REVERT_LIST", NULL}
#define STMT_168 \
"DROP TABLE IF EXISTS revert_list " \
""
#define STMT_CREATE_DELETE_LIST 169
#define STMT_169_INFO {"STMT_CREATE_DELETE_LIST", NULL}
#define STMT_169 \
"DROP TABLE IF EXISTS delete_list; " \
"CREATE TEMPORARY TABLE delete_list ( " \
" local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE " \
" ) " \
""
#define STMT_INSERT_DELETE_LIST 170
#define STMT_170_INFO {"STMT_INSERT_DELETE_LIST", NULL}
#define STMT_170 \
"INSERT INTO delete_list(local_relpath) " \
"SELECT ?2 " \
"UNION ALL " \
"SELECT local_relpath FROM nodes AS n " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth >= ?3 " \
" AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s " \
" WHERE s.wc_id = ?1 " \
" AND s.local_relpath = n.local_relpath) " \
" AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'server-excluded') " \
" AND file_external IS NULL " \
"ORDER by local_relpath " \
""
#define STMT_SELECT_DELETE_LIST 171
#define STMT_171_INFO {"STMT_SELECT_DELETE_LIST", NULL}
#define STMT_171 \
"SELECT local_relpath FROM delete_list " \
"ORDER BY local_relpath " \
""
#define STMT_FINALIZE_DELETE 172
#define STMT_172_INFO {"STMT_FINALIZE_DELETE", NULL}
#define STMT_172 \
"DROP TABLE IF EXISTS delete_list " \
""
#define STMT_CREATE_UPDATE_MOVE_LIST 173
#define STMT_173_INFO {"STMT_CREATE_UPDATE_MOVE_LIST", NULL}
#define STMT_173 \
"DROP TABLE IF EXISTS update_move_list; " \
"CREATE TEMPORARY TABLE update_move_list ( " \
" local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE, " \
" action INTEGER NOT NULL, " \
" kind TEXT NOT NULL, " \
" content_state INTEGER NOT NULL, " \
" prop_state INTEGER NOT NULL " \
" ) " \
""
#define STMT_INSERT_UPDATE_MOVE_LIST 174
#define STMT_174_INFO {"STMT_INSERT_UPDATE_MOVE_LIST", NULL}
#define STMT_174 \
"INSERT INTO update_move_list(local_relpath, action, kind, content_state, " \
" prop_state) " \
"VALUES (?1, ?2, ?3, ?4, ?5) " \
""
#define STMT_SELECT_UPDATE_MOVE_LIST 175
#define STMT_175_INFO {"STMT_SELECT_UPDATE_MOVE_LIST", NULL}
#define STMT_175 \
"SELECT local_relpath, action, kind, content_state, prop_state " \
"FROM update_move_list " \
"ORDER BY local_relpath " \
""
#define STMT_FINALIZE_UPDATE_MOVE 176
#define STMT_176_INFO {"STMT_FINALIZE_UPDATE_MOVE", NULL}
#define STMT_176 \
"DROP TABLE IF EXISTS update_move_list " \
""
#define STMT_MOVE_NOTIFY_TO_REVERT 177
#define STMT_177_INFO {"STMT_MOVE_NOTIFY_TO_REVERT", NULL}
#define STMT_177 \
"INSERT INTO revert_list (local_relpath, notify, kind, actual) " \
" SELECT local_relpath, 2, kind, 1 FROM update_move_list; " \
"DROP TABLE update_move_list " \
""
#define STMT_SELECT_MIN_MAX_REVISIONS 178
#define STMT_178_INFO {"STMT_SELECT_MIN_MAX_REVISIONS", NULL}
#define STMT_178 \
"SELECT MIN(revision), MAX(revision), " \
" MIN(changed_revision), MAX(changed_revision) FROM nodes " \
" WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND presence IN ('normal', 'incomplete') " \
" AND file_external IS NULL " \
" AND op_depth = 0 " \
""
#define STMT_HAS_SPARSE_NODES 179
#define STMT_179_INFO {"STMT_HAS_SPARSE_NODES", NULL}
#define STMT_179 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = 0 " \
" AND (presence IN ('server-excluded', 'excluded') " \
" OR depth NOT IN ('infinity', 'unknown')) " \
" AND file_external IS NULL " \
"LIMIT 1 " \
""
#define STMT_SUBTREE_HAS_TREE_MODIFICATIONS 180
#define STMT_180_INFO {"STMT_SUBTREE_HAS_TREE_MODIFICATIONS", NULL}
#define STMT_180 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth > 0 " \
"LIMIT 1 " \
""
#define STMT_SUBTREE_HAS_PROP_MODIFICATIONS 181
#define STMT_181_INFO {"STMT_SUBTREE_HAS_PROP_MODIFICATIONS", NULL}
#define STMT_181 \
"SELECT 1 FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND properties IS NOT NULL " \
"LIMIT 1 " \
""
#define STMT_HAS_SWITCHED 182
#define STMT_182_INFO {"STMT_HAS_SWITCHED", NULL}
#define STMT_182 \
"SELECT 1 " \
"FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = 0 " \
" AND file_external IS NULL " \
" AND presence IN ('normal', 'incomplete') " \
" AND repos_path IS NOT (CASE WHEN (?2) = '' THEN (CASE WHEN (?3) = '' THEN (local_relpath) WHEN (local_relpath) = '' THEN (?3) ELSE (?3) || '/' || (local_relpath) END) WHEN (?3) = '' THEN (CASE WHEN (?2) = '' THEN (local_relpath) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN '' WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN (?3) WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?3) || SUBSTR((local_relpath), LENGTH(?2)+1) END END) " \
"LIMIT 1 " \
""
#define STMT_SELECT_MOVED_FROM_RELPATH 183
#define STMT_183_INFO {"STMT_SELECT_MOVED_FROM_RELPATH", NULL}
#define STMT_183 \
"SELECT local_relpath, op_depth FROM nodes " \
"WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 " \
""
#define STMT_UPDATE_MOVED_TO_RELPATH 184
#define STMT_184_INFO {"STMT_UPDATE_MOVED_TO_RELPATH", NULL}
#define STMT_184 \
"UPDATE nodes SET moved_to = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
#define STMT_CLEAR_MOVED_TO_RELPATH 185
#define STMT_185_INFO {"STMT_CLEAR_MOVED_TO_RELPATH", NULL}
#define STMT_185 \
"UPDATE nodes SET moved_to = NULL " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
#define STMT_CLEAR_MOVED_HERE_RECURSIVE 186
#define STMT_186_INFO {"STMT_CLEAR_MOVED_HERE_RECURSIVE", NULL}
#define STMT_186 \
"UPDATE nodes SET moved_here = NULL " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = ?3 " \
""
#define STMT_SELECT_MOVED_HERE_CHILDREN 187
#define STMT_187_INFO {"STMT_SELECT_MOVED_HERE_CHILDREN", NULL}
#define STMT_187 \
"SELECT moved_to, local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND op_depth > 0 " \
" AND (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_SELECT_MOVED_FOR_DELETE 188
#define STMT_188_INFO {"STMT_SELECT_MOVED_FOR_DELETE", NULL}
#define STMT_188 \
"SELECT local_relpath, moved_to, op_depth, " \
" (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r " \
" WHERE r.wc_id = ?1 " \
" AND r.local_relpath = n.local_relpath " \
" AND r.op_depth < n.op_depth " \
" ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth " \
" FROM nodes n " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND moved_to IS NOT NULL " \
" AND op_depth >= ?3 " \
""
#define STMT_SELECT_MOVED_FROM_FOR_DELETE 189
#define STMT_189_INFO {"STMT_SELECT_MOVED_FROM_FOR_DELETE", NULL}
#define STMT_189 \
"SELECT local_relpath, op_depth, " \
" (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r " \
" WHERE r.wc_id = ?1 " \
" AND r.local_relpath = n.local_relpath " \
" AND r.op_depth < n.op_depth " \
" ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth " \
" FROM nodes n " \
"WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 " \
""
#define STMT_UPDATE_MOVED_TO_DESCENDANTS 190
#define STMT_190_INFO {"STMT_UPDATE_MOVED_TO_DESCENDANTS", NULL}
#define STMT_190 \
"UPDATE nodes SET moved_to = (CASE WHEN (?2) = '' THEN (CASE WHEN (?3) = '' THEN (moved_to) WHEN (moved_to) = '' THEN (?3) ELSE (?3) || '/' || (moved_to) END) WHEN (?3) = '' THEN (CASE WHEN (?2) = '' THEN (moved_to) WHEN SUBSTR((moved_to), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(moved_to) THEN '' WHEN SUBSTR((moved_to), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((moved_to), LENGTH(?2)+2) END END) WHEN SUBSTR((moved_to), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(moved_to) THEN (?3) WHEN SUBSTR((moved_to), LENGTH(?2)+1, 1) = '/' THEN (?3) || SUBSTR((moved_to), LENGTH(?2)+1) END END) " \
" WHERE wc_id = ?1 " \
" AND (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_CLEAR_MOVED_TO_DESCENDANTS 191
#define STMT_191_INFO {"STMT_CLEAR_MOVED_TO_DESCENDANTS", NULL}
#define STMT_191 \
"UPDATE nodes SET moved_to = NULL " \
" WHERE wc_id = ?1 " \
" AND (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_SELECT_MOVED_PAIR3 192
#define STMT_192_INFO {"STMT_SELECT_MOVED_PAIR3", NULL}
#define STMT_192 \
"SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind " \
"FROM nodes n " \
"JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath " \
" AND d.op_depth = (SELECT MIN(dd.op_depth) " \
" FROM nodes dd " \
" WHERE dd.wc_id = ?1 " \
" AND dd.local_relpath = d.local_relpath " \
" AND dd.op_depth > ?3) " \
"WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3 " \
" AND d.moved_to IS NOT NULL " \
"UNION ALL " \
"SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind " \
"FROM nodes n " \
"JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath " \
" AND d.op_depth = (SELECT MIN(dd.op_depth) " \
" FROM nodes dd " \
" WHERE dd.wc_id = ?1 " \
" AND dd.local_relpath = d.local_relpath " \
" AND dd.op_depth > ?3) " \
"WHERE n.wc_id = ?1 AND (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND n.op_depth = ?3 " \
" AND d.moved_to IS NOT NULL " \
"ORDER BY n.local_relpath " \
""
#define STMT_SELECT_MOVED_OUTSIDE 193
#define STMT_193_INFO {"STMT_SELECT_MOVED_OUTSIDE", NULL}
#define STMT_193 \
"SELECT local_relpath, moved_to, op_depth FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth >= ?3 " \
" AND moved_to IS NOT NULL " \
" AND NOT (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
#define STMT_SELECT_MOVED_DESCENDANTS_SRC 194
#define STMT_194_INFO {"STMT_SELECT_MOVED_DESCENDANTS_SRC", NULL}
#define STMT_194 \
"SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to " \
"FROM nodes n " \
"JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath " \
" AND s.op_depth = (SELECT MIN(d.op_depth) " \
" FROM nodes d " \
" WHERE d.wc_id = ?1 " \
" AND d.local_relpath = s.local_relpath " \
" AND d.op_depth > ?3) " \
"WHERE n.wc_id = ?1 AND n.op_depth = ?3 " \
" AND (n.local_relpath = ?2 OR (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND s.moved_to IS NOT NULL " \
""
#define STMT_COMMIT_UPDATE_ORIGIN 195
#define STMT_195_INFO {"STMT_COMMIT_UPDATE_ORIGIN", NULL}
#define STMT_195 \
"UPDATE nodes SET repos_id = ?4, " \
" repos_path = (CASE WHEN (?2) = '' THEN (CASE WHEN (?5) = '' THEN (local_relpath) WHEN (local_relpath) = '' THEN (?5) ELSE (?5) || '/' || (local_relpath) END) WHEN (?5) = '' THEN (CASE WHEN (?2) = '' THEN (local_relpath) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN '' WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN (?5) WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?5) || SUBSTR((local_relpath), LENGTH(?2)+1) END END), " \
" revision = ?6 " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = ?3 " \
""
#define STMT_HAS_LAYER_BETWEEN 196
#define STMT_196_INFO {"STMT_HAS_LAYER_BETWEEN", NULL}
#define STMT_196 \
"SELECT 1 FROM NODES " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4 " \
""
#define STMT_SELECT_REPOS_PATH_REVISION 197
#define STMT_197_INFO {"STMT_SELECT_REPOS_PATH_REVISION", NULL}
#define STMT_197 \
"SELECT local_relpath, repos_path, revision FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = 0 " \
"ORDER BY local_relpath " \
""
#define STMT_SELECT_HAS_NON_FILE_CHILDREN 198
#define STMT_198_INFO {"STMT_SELECT_HAS_NON_FILE_CHILDREN", NULL}
#define STMT_198 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != 'file' " \
"LIMIT 1 " \
""
#define STMT_SELECT_HAS_GRANDCHILDREN 199
#define STMT_199_INFO {"STMT_SELECT_HAS_GRANDCHILDREN", NULL}
#define STMT_199 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((parent_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((parent_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
" AND file_external IS NULL " \
"LIMIT 1 " \
""
#define STMT_SELECT_ALL_NODES 200
#define STMT_200_INFO {"STMT_SELECT_ALL_NODES", NULL}
#define STMT_200 \
"SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes " \
"WHERE wc_id = ?1 " \
""
#define STMT_SELECT_IPROPS 201
#define STMT_201_INFO {"STMT_SELECT_IPROPS", NULL}
#define STMT_201 \
"SELECT inherited_props FROM nodes " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
" AND op_depth = 0 " \
""
#define STMT_UPDATE_IPROP 202
#define STMT_202_INFO {"STMT_UPDATE_IPROP", NULL}
#define STMT_202 \
"UPDATE nodes " \
"SET inherited_props = ?3 " \
"WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0) " \
""
#define STMT_SELECT_IPROPS_NODE 203
#define STMT_203_INFO {"STMT_SELECT_IPROPS_NODE", NULL}
#define STMT_203 \
"SELECT local_relpath, repos_path FROM nodes " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
" AND op_depth = 0 " \
" AND (inherited_props not null) " \
""
#define STMT_SELECT_IPROPS_RECURSIVE 204
#define STMT_204_INFO {"STMT_SELECT_IPROPS_RECURSIVE", NULL}
#define STMT_204 \
"SELECT local_relpath, repos_path FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = 0 " \
" AND (inherited_props not null) " \
""
#define STMT_SELECT_IPROPS_CHILDREN 205
#define STMT_205_INFO {"STMT_SELECT_IPROPS_CHILDREN", NULL}
#define STMT_205 \
"SELECT local_relpath, repos_path FROM nodes " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
" AND op_depth = 0 " \
" AND (inherited_props not null) " \
""
#define STMT_HAVE_STAT1_TABLE 206
#define STMT_206_INFO {"STMT_HAVE_STAT1_TABLE", NULL}
#define STMT_206 \
"SELECT 1 FROM sqlite_master WHERE name='sqlite_stat1' AND type='table' " \
"LIMIT 1 " \
""
#define STMT_CREATE_SCHEMA 207
#define STMT_207_INFO {"STMT_CREATE_SCHEMA", NULL}
#define STMT_207 \
"CREATE TABLE REPOSITORY ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" root TEXT UNIQUE NOT NULL, " \
" uuid TEXT NOT NULL " \
" ); " \
"CREATE INDEX I_UUID ON REPOSITORY (uuid); " \
"CREATE INDEX I_ROOT ON REPOSITORY (root); " \
"CREATE TABLE WCROOT ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" local_abspath TEXT UNIQUE " \
" ); " \
"CREATE UNIQUE INDEX I_LOCAL_ABSPATH ON WCROOT (local_abspath); " \
"CREATE TABLE PRISTINE ( " \
" checksum TEXT NOT NULL PRIMARY KEY, " \
" compression INTEGER, " \
" size INTEGER NOT NULL, " \
" refcount INTEGER NOT NULL, " \
" md5_checksum TEXT NOT NULL " \
" ); " \
"CREATE INDEX I_PRISTINE_MD5 ON PRISTINE (md5_checksum); " \
"CREATE TABLE ACTUAL_NODE ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" properties BLOB, " \
" conflict_old TEXT, " \
" conflict_new TEXT, " \
" conflict_working TEXT, " \
" prop_reject TEXT, " \
" changelist TEXT, " \
" text_mod TEXT, " \
" tree_conflict_data TEXT, " \
" conflict_data BLOB, " \
" older_checksum TEXT REFERENCES PRISTINE (checksum), " \
" left_checksum TEXT REFERENCES PRISTINE (checksum), " \
" right_checksum TEXT REFERENCES PRISTINE (checksum), " \
" PRIMARY KEY (wc_id, local_relpath) " \
" ); " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"CREATE TABLE LOCK ( " \
" repos_id INTEGER NOT NULL REFERENCES REPOSITORY (id), " \
" repos_relpath TEXT NOT NULL, " \
" lock_token TEXT NOT NULL, " \
" lock_owner TEXT, " \
" lock_comment TEXT, " \
" lock_date INTEGER, " \
" PRIMARY KEY (repos_id, repos_relpath) " \
" ); " \
"CREATE TABLE WORK_QUEUE ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" work BLOB NOT NULL " \
" ); " \
"CREATE TABLE WC_LOCK ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_dir_relpath TEXT NOT NULL, " \
" locked_levels INTEGER NOT NULL DEFAULT -1, " \
" PRIMARY KEY (wc_id, local_dir_relpath) " \
" ); " \
"PRAGMA user_version = " \
APR_STRINGIFY(SVN_WC__VERSION) \
"; " \
""
#define STMT_CREATE_NODES 208
#define STMT_208_INFO {"STMT_CREATE_NODES", NULL}
#define STMT_208 \
"CREATE TABLE NODES ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" op_depth INTEGER NOT NULL, " \
" parent_relpath TEXT, " \
" repos_id INTEGER REFERENCES REPOSITORY (id), " \
" repos_path TEXT, " \
" revision INTEGER, " \
" presence TEXT NOT NULL, " \
" moved_here INTEGER, " \
" moved_to TEXT, " \
" kind TEXT NOT NULL, " \
" properties BLOB, " \
" depth TEXT, " \
" checksum TEXT REFERENCES PRISTINE (checksum), " \
" symlink_target TEXT, " \
" changed_revision INTEGER, " \
" changed_date INTEGER, " \
" changed_author TEXT, " \
" translated_size INTEGER, " \
" last_mod_time INTEGER, " \
" dav_cache BLOB, " \
" file_external INTEGER, " \
" inherited_props BLOB, " \
" PRIMARY KEY (wc_id, local_relpath, op_depth) " \
" ); " \
"CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, " \
" local_relpath, op_depth); " \
"CREATE UNIQUE INDEX I_NODES_MOVED ON NODES (wc_id, moved_to, op_depth); " \
"CREATE VIEW NODES_CURRENT AS " \
" SELECT * FROM nodes AS n " \
" WHERE op_depth = (SELECT MAX(op_depth) FROM nodes AS n2 " \
" WHERE n2.wc_id = n.wc_id " \
" AND n2.local_relpath = n.local_relpath); " \
"CREATE VIEW NODES_BASE AS " \
" SELECT * FROM nodes " \
" WHERE op_depth = 0; " \
""
#define STMT_CREATE_NODES_TRIGGERS 209
#define STMT_209_INFO {"STMT_CREATE_NODES_TRIGGERS", NULL}
#define STMT_209 \
"CREATE TRIGGER nodes_insert_trigger " \
"AFTER INSERT ON nodes " \
"WHEN NEW.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
"END; " \
"CREATE TRIGGER nodes_delete_trigger " \
"AFTER DELETE ON nodes " \
"WHEN OLD.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
"CREATE TRIGGER nodes_update_checksum_trigger " \
"AFTER UPDATE OF checksum ON nodes " \
"WHEN NEW.checksum IS NOT OLD.checksum " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
""
#define STMT_CREATE_EXTERNALS 210
#define STMT_210_INFO {"STMT_CREATE_EXTERNALS", NULL}
#define STMT_210 \
"CREATE TABLE EXTERNALS ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT NOT NULL, " \
" repos_id INTEGER NOT NULL REFERENCES REPOSITORY (id), " \
" presence TEXT NOT NULL, " \
" kind TEXT NOT NULL, " \
" def_local_relpath TEXT NOT NULL, " \
" def_repos_relpath TEXT NOT NULL, " \
" def_operational_revision TEXT, " \
" def_revision TEXT, " \
" PRIMARY KEY (wc_id, local_relpath) " \
"); " \
"CREATE UNIQUE INDEX I_EXTERNALS_DEFINED ON EXTERNALS (wc_id, " \
" def_local_relpath, " \
" local_relpath); " \
""
#define STMT_INSTALL_SCHEMA_STATISTICS 211
#define STMT_211_INFO {"STMT_INSTALL_SCHEMA_STATISTICS", NULL}
#define STMT_211 \
"ANALYZE sqlite_master; " \
"DELETE FROM sqlite_stat1 " \
"WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK', 'EXTERNALS'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'sqlite_autoindex_NODES_1', '8000 8000 2 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_PARENT', '8000 8000 10 2 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_MOVED', '8000 8000 1 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1', '8000 8000 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'I_ACTUAL_PARENT', '8000 8000 10 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('LOCK', 'sqlite_autoindex_LOCK_1', '100 100 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1', '100 100 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('EXTERNALS','sqlite_autoindex_EXTERNALS_1', '100 100 1'); " \
"INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('EXTERNALS','I_EXTERNALS_DEFINED', '100 100 3 1'); " \
"ANALYZE sqlite_master; " \
""
#define STMT_UPGRADE_TO_20 212
#define STMT_212_INFO {"STMT_UPGRADE_TO_20", NULL}
#define STMT_212 \
"UPDATE BASE_NODE SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = BASE_NODE.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine WHERE md5_checksum = BASE_NODE.checksum); " \
"UPDATE WORKING_NODE SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = WORKING_NODE.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine " \
" WHERE md5_checksum = WORKING_NODE.checksum); " \
"INSERT INTO NODES ( " \
" wc_id, local_relpath, op_depth, parent_relpath, " \
" repos_id, repos_path, revision, " \
" presence, depth, moved_here, moved_to, kind, " \
" changed_revision, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external ) " \
"SELECT wc_id, local_relpath, 0 , parent_relpath, " \
" repos_id, repos_relpath, revnum, " \
" presence, depth, NULL , NULL , kind, " \
" changed_rev, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external " \
"FROM BASE_NODE; " \
"INSERT INTO NODES ( " \
" wc_id, local_relpath, op_depth, parent_relpath, " \
" repos_id, repos_path, revision, " \
" presence, depth, moved_here, moved_to, kind, " \
" changed_revision, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" dav_cache, symlink_target, file_external ) " \
"SELECT wc_id, local_relpath, 2 , parent_relpath, " \
" copyfrom_repos_id, copyfrom_repos_path, copyfrom_revnum, " \
" presence, depth, NULL , NULL , kind, " \
" changed_rev, changed_date, changed_author, " \
" checksum, properties, translated_size, last_mod_time, " \
" NULL , symlink_target, NULL " \
"FROM WORKING_NODE; " \
"DROP TABLE BASE_NODE; " \
"DROP TABLE WORKING_NODE; " \
"PRAGMA user_version = 20; " \
""
#define STMT_UPGRADE_TO_21 213
#define STMT_213_INFO {"STMT_UPGRADE_TO_21", NULL}
#define STMT_213 \
"PRAGMA user_version = 21; " \
""
#define STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT 214
#define STMT_214_INFO {"STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT", NULL}
#define STMT_214 \
"SELECT wc_id, local_relpath, tree_conflict_data " \
"FROM actual_node " \
"WHERE tree_conflict_data IS NOT NULL " \
""
#define STMT_UPGRADE_21_ERASE_OLD_CONFLICTS 215
#define STMT_215_INFO {"STMT_UPGRADE_21_ERASE_OLD_CONFLICTS", NULL}
#define STMT_215 \
"UPDATE actual_node SET tree_conflict_data = NULL " \
""
#define STMT_UPGRADE_TO_22 216
#define STMT_216_INFO {"STMT_UPGRADE_TO_22", NULL}
#define STMT_216 \
"UPDATE actual_node SET tree_conflict_data = conflict_data; " \
"UPDATE actual_node SET conflict_data = NULL; " \
"PRAGMA user_version = 22; " \
""
#define STMT_UPGRADE_TO_23 217
#define STMT_217_INFO {"STMT_UPGRADE_TO_23", NULL}
#define STMT_217 \
"PRAGMA user_version = 23; " \
""
#define STMT_UPGRADE_23_HAS_WORKING_NODES 218
#define STMT_218_INFO {"STMT_UPGRADE_23_HAS_WORKING_NODES", NULL}
#define STMT_218 \
"SELECT 1 FROM nodes WHERE op_depth > 0 " \
"LIMIT 1 " \
""
#define STMT_UPGRADE_TO_24 219
#define STMT_219_INFO {"STMT_UPGRADE_TO_24", NULL}
#define STMT_219 \
"UPDATE pristine SET refcount = " \
" (SELECT COUNT(*) FROM nodes " \
" WHERE checksum = pristine.checksum ); " \
"PRAGMA user_version = 24; " \
""
#define STMT_UPGRADE_TO_25 220
#define STMT_220_INFO {"STMT_UPGRADE_TO_25", NULL}
#define STMT_220 \
"DROP VIEW IF EXISTS NODES_CURRENT; " \
"CREATE VIEW NODES_CURRENT AS " \
" SELECT * FROM nodes " \
" JOIN (SELECT wc_id, local_relpath, MAX(op_depth) AS op_depth FROM nodes " \
" GROUP BY wc_id, local_relpath) AS filter " \
" ON nodes.wc_id = filter.wc_id " \
" AND nodes.local_relpath = filter.local_relpath " \
" AND nodes.op_depth = filter.op_depth; " \
"PRAGMA user_version = 25; " \
""
#define STMT_UPGRADE_TO_26 221
#define STMT_221_INFO {"STMT_UPGRADE_TO_26", NULL}
#define STMT_221 \
"DROP VIEW IF EXISTS NODES_BASE; " \
"CREATE VIEW NODES_BASE AS " \
" SELECT * FROM nodes " \
" WHERE op_depth = 0; " \
"PRAGMA user_version = 26; " \
""
#define STMT_UPGRADE_TO_27 222
#define STMT_222_INFO {"STMT_UPGRADE_TO_27", NULL}
#define STMT_222 \
"PRAGMA user_version = 27; " \
""
#define STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS 223
#define STMT_223_INFO {"STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS", NULL}
#define STMT_223 \
"SELECT 1 FROM actual_node " \
"WHERE NOT ((prop_reject IS NULL) AND (conflict_old IS NULL) " \
" AND (conflict_new IS NULL) AND (conflict_working IS NULL) " \
" AND (tree_conflict_data IS NULL)) " \
"LIMIT 1 " \
""
#define STMT_UPGRADE_TO_28 224
#define STMT_224_INFO {"STMT_UPGRADE_TO_28", NULL}
#define STMT_224 \
"UPDATE NODES SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = nodes.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine WHERE md5_checksum = nodes.checksum); " \
"PRAGMA user_version = 28; " \
""
#define STMT_UPGRADE_TO_29 225
#define STMT_225_INFO {"STMT_UPGRADE_TO_29", NULL}
#define STMT_225 \
"DROP TRIGGER IF EXISTS nodes_update_checksum_trigger; " \
"DROP TRIGGER IF EXISTS nodes_insert_trigger; " \
"DROP TRIGGER IF EXISTS nodes_delete_trigger; " \
"CREATE TRIGGER nodes_update_checksum_trigger " \
"AFTER UPDATE OF checksum ON nodes " \
"WHEN NEW.checksum IS NOT OLD.checksum " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
"CREATE TRIGGER nodes_insert_trigger " \
"AFTER INSERT ON nodes " \
"WHEN NEW.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount + 1 " \
" WHERE checksum = NEW.checksum; " \
"END; " \
"CREATE TRIGGER nodes_delete_trigger " \
"AFTER DELETE ON nodes " \
"WHEN OLD.checksum IS NOT NULL " \
"BEGIN " \
" UPDATE pristine SET refcount = refcount - 1 " \
" WHERE checksum = OLD.checksum; " \
"END; " \
"PRAGMA user_version = 29; " \
""
#define STMT_UPGRADE_TO_30 226
#define STMT_226_INFO {"STMT_UPGRADE_TO_30", NULL}
#define STMT_226 \
"CREATE UNIQUE INDEX IF NOT EXISTS I_NODES_MOVED " \
"ON NODES (wc_id, moved_to, op_depth); " \
"CREATE INDEX IF NOT EXISTS I_PRISTINE_MD5 ON PRISTINE (md5_checksum); " \
"UPDATE nodes SET presence = \"server-excluded\" WHERE presence = \"absent\"; " \
"UPDATE nodes SET file_external=1 WHERE file_external IS NOT NULL; " \
""
#define STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE 227
#define STMT_227_INFO {"STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE", NULL}
#define STMT_227 \
"SELECT wc_id, local_relpath, " \
" conflict_old, conflict_working, conflict_new, prop_reject, tree_conflict_data " \
"FROM actual_node " \
"WHERE conflict_old IS NOT NULL " \
" OR conflict_working IS NOT NULL " \
" OR conflict_new IS NOT NULL " \
" OR prop_reject IS NOT NULL " \
" OR tree_conflict_data IS NOT NULL " \
"ORDER by wc_id, local_relpath " \
""
#define STMT_UPGRADE_30_SET_CONFLICT 228
#define STMT_228_INFO {"STMT_UPGRADE_30_SET_CONFLICT", NULL}
#define STMT_228 \
"UPDATE actual_node SET conflict_data = ?3, conflict_old = NULL, " \
" conflict_working = NULL, conflict_new = NULL, prop_reject = NULL, " \
" tree_conflict_data = NULL " \
"WHERE wc_id = ?1 and local_relpath = ?2 " \
""
#define STMT_UPGRADE_TO_31_ALTER_TABLE 229
#define STMT_229_INFO {"STMT_UPGRADE_TO_31_ALTER_TABLE", NULL}
#define STMT_229 \
"ALTER TABLE NODES ADD COLUMN inherited_props BLOB; " \
""
#define STMT_UPGRADE_TO_31_FINALIZE 230
#define STMT_230_INFO {"STMT_UPGRADE_TO_31_FINALIZE", NULL}
#define STMT_230 \
"DROP INDEX IF EXISTS I_ACTUAL_CHANGELIST; " \
"DROP INDEX IF EXISTS I_EXTERNALS_PARENT; " \
"DROP INDEX I_NODES_PARENT; " \
"CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, " \
" local_relpath, op_depth); " \
"DROP INDEX I_ACTUAL_PARENT; " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"PRAGMA user_version = 31; " \
""
#define STMT_UPGRADE_31_SELECT_WCROOT_NODES 231
#define STMT_231_INFO {"STMT_UPGRADE_31_SELECT_WCROOT_NODES", NULL}
#define STMT_231 \
"SELECT l.wc_id, l.local_relpath FROM nodes as l " \
"LEFT OUTER JOIN nodes as r " \
"ON l.wc_id = r.wc_id " \
" AND r.local_relpath = l.parent_relpath " \
" AND r.op_depth = 0 " \
"WHERE l.op_depth = 0 " \
" AND l.repos_path != '' " \
" AND ((l.repos_id IS NOT r.repos_id) " \
" OR (l.repos_path IS NOT (CASE WHEN (r.local_relpath) = '' THEN (CASE WHEN (r.repos_path) = '' THEN (l.local_relpath) WHEN (l.local_relpath) = '' THEN (r.repos_path) ELSE (r.repos_path) || '/' || (l.local_relpath) END) WHEN (r.repos_path) = '' THEN (CASE WHEN (r.local_relpath) = '' THEN (l.local_relpath) WHEN SUBSTR((l.local_relpath), 1, LENGTH(r.local_relpath)) = (r.local_relpath) THEN CASE WHEN LENGTH(r.local_relpath) = LENGTH(l.local_relpath) THEN '' WHEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1, 1) = '/' THEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+2) END END) WHEN SUBSTR((l.local_relpath), 1, LENGTH(r.local_relpath)) = (r.local_relpath) THEN CASE WHEN LENGTH(r.local_relpath) = LENGTH(l.local_relpath) THEN (r.repos_path) WHEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1, 1) = '/' THEN (r.repos_path) || SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1) END END))) " \
""
#define STMT_UPGRADE_TO_32 232
#define STMT_232_INFO {"STMT_UPGRADE_TO_32", NULL}
#define STMT_232 \
"DROP INDEX IF EXISTS I_ACTUAL_CHANGELIST; " \
"DROP INDEX IF EXISTS I_EXTERNALS_PARENT; " \
"CREATE INDEX I_EXTERNALS_PARENT ON EXTERNALS (wc_id, parent_relpath); " \
"DROP INDEX I_NODES_PARENT; " \
"CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, " \
" local_relpath, op_depth); " \
"DROP INDEX I_ACTUAL_PARENT; " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"-- format: YYY " \
""
#define WC_QUERIES_SQL_99 \
"CREATE TABLE ACTUAL_NODE_BACKUP ( " \
" wc_id INTEGER NOT NULL, " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" properties BLOB, " \
" conflict_old TEXT, " \
" conflict_new TEXT, " \
" conflict_working TEXT, " \
" prop_reject TEXT, " \
" changelist TEXT, " \
" text_mod TEXT " \
" ); " \
"INSERT INTO ACTUAL_NODE_BACKUP SELECT " \
" wc_id, local_relpath, parent_relpath, properties, conflict_old, " \
" conflict_new, conflict_working, prop_reject, changelist, text_mod " \
"FROM ACTUAL_NODE; " \
"DROP TABLE ACTUAL_NODE; " \
"CREATE TABLE ACTUAL_NODE ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
" parent_relpath TEXT, " \
" properties BLOB, " \
" conflict_old TEXT, " \
" conflict_new TEXT, " \
" conflict_working TEXT, " \
" prop_reject TEXT, " \
" changelist TEXT, " \
" text_mod TEXT, " \
" PRIMARY KEY (wc_id, local_relpath) " \
" ); " \
"CREATE UNIQUE INDEX I_ACTUAL_PARENT ON ACTUAL_NODE (wc_id, parent_relpath, " \
" local_relpath); " \
"INSERT INTO ACTUAL_NODE SELECT " \
" wc_id, local_relpath, parent_relpath, properties, conflict_old, " \
" conflict_new, conflict_working, prop_reject, changelist, text_mod " \
"FROM ACTUAL_NODE_BACKUP; " \
"DROP TABLE ACTUAL_NODE_BACKUP; " \
""
#define STMT_VERIFICATION_TRIGGERS 233
#define STMT_233_INFO {"STMT_VERIFICATION_TRIGGERS", NULL}
#define STMT_233 \
"CREATE TEMPORARY TRIGGER no_repository_updates BEFORE UPDATE ON repository " \
"BEGIN " \
" SELECT RAISE(FAIL, 'Updates to REPOSITORY are not allowed.'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_01 BEFORE INSERT ON nodes " \
"WHEN NOT ((new.local_relpath = '' AND new.parent_relpath IS NULL) " \
" OR (relpath_depth(new.local_relpath) " \
" = relpath_depth(new.parent_relpath) + 1)) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 01 failed'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_02 BEFORE INSERT ON nodes " \
"WHEN NOT new.op_depth <= relpath_depth(new.local_relpath) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 02 failed'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_03 BEFORE INSERT ON nodes " \
"WHEN NOT ( " \
" (new.op_depth = relpath_depth(new.local_relpath)) " \
" OR " \
" (EXISTS (SELECT 1 FROM nodes " \
" WHERE wc_id = new.wc_id AND op_depth = new.op_depth " \
" AND local_relpath = new.parent_relpath)) " \
" ) " \
" AND NOT (new.file_external IS NOT NULL AND new.op_depth = 0) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 03 failed'); " \
"END; " \
"CREATE TEMPORARY TRIGGER validation_04 BEFORE INSERT ON actual_node " \
"WHEN NOT (new.local_relpath = '' " \
" OR EXISTS (SELECT 1 FROM nodes " \
" WHERE wc_id = new.wc_id " \
" AND local_relpath = new.parent_relpath)) " \
"BEGIN " \
" SELECT RAISE(FAIL, 'WC DB validity check 04 failed'); " \
"END; " \
""
#define STMT_STATIC_VERIFY 234
#define STMT_234_INFO {"STMT_STATIC_VERIFY", NULL}
#define STMT_234 \
"SELECT local_relpath, op_depth, 1, 'Invalid parent relpath set in NODES' " \
"FROM nodes n WHERE local_relpath != '' " \
" AND (parent_relpath IS NULL " \
" OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
" OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
"UNION ALL " \
"SELECT local_relpath, -1, 2, 'Invalid parent relpath set in ACTUAL' " \
"FROM actual_node a WHERE local_relpath != '' " \
" AND (parent_relpath IS NULL " \
" OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
" OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
"UNION ALL " \
"SELECT local_relpath, -1, 10, 'No ancestor in ACTUAL' " \
"FROM actual_node a WHERE local_relpath != '' " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=a.wc_id " \
" AND i.local_relpath=a.parent_relpath) " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=a.wc_id " \
" AND i.local_relpath=a.local_relpath) " \
"UNION ALL " \
"SELECT a.local_relpath, -1, 11, 'Bad or Unneeded actual data' " \
"FROM actual_node a " \
"LEFT JOIN nodes n on n.wc_id = a.wc_id AND n.local_relpath = a.local_relpath " \
" AND n.op_depth = (SELECT MAX(op_depth) from nodes i " \
" WHERE i.wc_id=a.wc_id AND i.local_relpath=a.local_relpath) " \
"WHERE (a.properties IS NOT NULL " \
" AND (n.presence IS NULL " \
" OR n.presence NOT IN ('normal', 'incomplete'))) " \
" OR (a.changelist IS NOT NULL AND (n.kind IS NOT NULL AND n.kind != 'file')) " \
" OR (a.conflict_data IS NULL AND a.properties IS NULL AND a.changelist IS NULL) " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=a.wc_id " \
" AND i.local_relpath=a.parent_relpath) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 20, 'No ancestor in NODES' " \
"FROM nodes n WHERE local_relpath != '' " \
" AND file_external IS NULL " \
" AND NOT EXISTS(SELECT 1 from nodes i " \
" WHERE i.wc_id=n.wc_id " \
" AND i.local_relpath=n.parent_relpath " \
" AND i.op_depth <= n.op_depth) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 21, 'Unneeded node data' " \
"FROM nodes " \
"WHERE presence NOT IN ('normal', 'incomplete') " \
"AND (properties IS NOT NULL " \
" OR checksum IS NOT NULL " \
" OR depth IS NOT NULL " \
" OR symlink_target IS NOT NULL " \
" OR changed_revision IS NOT NULL " \
" OR (changed_date IS NOT NULL AND changed_date != 0) " \
" OR changed_author IS NOT NULL " \
" OR translated_size IS NOT NULL " \
" OR last_mod_time IS NOT NULL " \
" OR dav_cache IS NOT NULL " \
" OR file_external IS NOT NULL " \
" OR inherited_props IS NOT NULL) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 22, 'Unneeded base-deleted node data' " \
"FROM nodes " \
"WHERE presence IN ('base-deleted') " \
"AND (repos_id IS NOT NULL " \
" OR repos_path IS NOT NULL " \
" OR revision IS NOT NULL) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 23, 'Kind specific data invalid on normal' " \
"FROM nodes " \
"WHERE presence IN ('normal', 'incomplete') " \
"AND (kind IS NULL " \
" OR (repos_path IS NULL " \
" AND (properties IS NOT NULL " \
" OR changed_revision IS NOT NULL " \
" OR changed_author IS NOT NULL " \
" OR (changed_date IS NOT NULL AND changed_date != 0))) " \
" OR (CASE WHEN kind = 'file' AND repos_path IS NOT NULL " \
" THEN checksum IS NULL " \
" ELSE checksum IS NOT NULL END) " \
" OR (CASE WHEN kind = 'dir' THEN depth IS NULL " \
" ELSE depth IS NOT NULL END) " \
" OR (CASE WHEN kind = 'symlink' THEN symlink_target IS NULL " \
" ELSE symlink_target IS NOT NULL END)) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 24, 'Invalid op-depth for local add' " \
"FROM nodes " \
"WHERE presence IN ('normal', 'incomplete') " \
" AND repos_path IS NULL " \
" AND op_depth != relpath_depth(local_relpath) " \
"UNION ALL " \
"SELECT local_relpath, op_depth, 25, 'Node missing op-depth ancestor' " \
"FROM nodes n " \
"WHERE op_depth < relpath_depth(local_relpath) " \
" AND file_external IS NULL " \
" AND NOT EXISTS(SELECT 1 FROM nodes p " \
" WHERE p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
" AND p.op_depth=n.op_depth " \
" AND (p.presence IN ('normal', 'incomplete') " \
" OR (p.presence IN ('base-deleted', 'not-present') " \
" AND n.presence = 'base-deleted'))) " \
"UNION ALL " \
"SELECT n.local_relpath, n.op_depth, 26, 'Copied descendant mismatch' " \
"FROM nodes n " \
"JOIN nodes p " \
" ON p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
" AND n.op_depth=p.op_depth " \
"WHERE n.op_depth > 0 AND n.presence IN ('normal', 'incomplete') " \
" AND (n.repos_id != p.repos_id " \
" OR n.repos_path != " \
" (CASE WHEN (n.parent_relpath) = '' THEN (CASE WHEN (p.repos_path) = '' THEN (n.local_relpath) WHEN (n.local_relpath) = '' THEN (p.repos_path) ELSE (p.repos_path) || '/' || (n.local_relpath) END) WHEN (p.repos_path) = '' THEN (CASE WHEN (n.parent_relpath) = '' THEN (n.local_relpath) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN '' WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+2) END END) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN (p.repos_path) WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN (p.repos_path) || SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1) END END) " \
" OR n.revision != p.revision " \
" OR p.kind != 'dir' " \
" OR n.moved_here IS NOT p.moved_here) " \
"UNION ALL " \
"SELECT n.local_relpath, n.op_depth, 27, 'Invalid op-root presence' " \
"FROM nodes n " \
"WHERE n.op_depth = relpath_depth(local_relpath) " \
" AND presence NOT IN ('normal', 'incomplete', 'base-deleted') " \
"UNION ALL " \
"SELECT n.local_relpath, s.op_depth, 28, 'Incomplete shadowing' " \
"FROM nodes n " \
"JOIN nodes s ON s.wc_id=n.wc_id AND s.local_relpath=n.local_relpath " \
" AND s.op_depth = relpath_depth(s.local_relpath) " \
" AND s.op_depth = (SELECT MIN(op_depth) FROM nodes d " \
" WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
" AND d.op_depth > n.op_depth) " \
"WHERE n.presence IN ('normal', 'incomplete') " \
" AND EXISTS(SELECT 1 " \
" FROM nodes dn " \
" WHERE dn.wc_id=n.wc_id AND dn.op_depth=n.op_depth " \
" AND dn.presence IN ('normal', 'incomplete') " \
" AND (((dn.local_relpath) > (CASE (n.local_relpath) WHEN '' THEN '' ELSE (n.local_relpath) || '/' END)) AND ((dn.local_relpath) < CASE (n.local_relpath) WHEN '' THEN X'FFFF' ELSE (n.local_relpath) || '0' END)) " \
" AND dn.file_external IS NULL " \
" AND NOT EXISTS(SELECT 1 " \
" FROM nodes ds " \
" WHERE ds.wc_id=n.wc_id AND ds.op_depth=s.op_depth " \
" AND ds.local_relpath=dn.local_relpath)) " \
"UNION ALL " \
"SELECT s.local_relpath, s.op_depth, 29, 'Invalid base-delete' " \
"FROM nodes s " \
"LEFT JOIN nodes n ON n.wc_id=s.wc_id AND n.local_relpath=s.local_relpath " \
" AND n.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
" WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
" AND d.op_depth < s.op_depth) " \
"WHERE s.presence = 'base-deleted' " \
" AND (n.presence IS NULL " \
" OR n.presence NOT IN ('normal', 'incomplete') " \
" ) " \
"UNION ALL " \
"SELECT n.local_relpath, n.op_depth, 30, 'Invalid data for BASE' " \
"FROM nodes n " \
"WHERE n.op_depth = 0 " \
" AND (n.moved_to IS NOT NULL " \
" OR n.moved_here IS NOT NULL) " \
"UNION ALL " \
"SELECT d.local_relpath, d.op_depth, 60, 'Moved here without origin' " \
"FROM nodes d " \
"WHERE d.op_depth = relpath_depth(d.local_relpath) " \
" AND d.moved_here IS NOT NULL " \
" AND NOT EXISTS(SELECT 1 FROM nodes s " \
" WHERE s.wc_id = d.wc_id AND s.moved_to = d.local_relpath) " \
"UNION ALL " \
"SELECT s.local_relpath, s.op_depth, 61, 'Moved to without target' " \
"FROM nodes s " \
"WHERE s.moved_to IS NOT NULL " \
" AND NOT EXISTS(SELECT 1 FROM nodes d " \
" WHERE d.wc_id = s.wc_id AND d.local_relpath = s.moved_to " \
" AND d.op_depth = relpath_depth(d.local_relpath) " \
" AND d.moved_here =1 AND d.repos_path IS NOT NULL) " \
""
#define WC_QUERIES_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
STMT_1, \
STMT_2, \
STMT_3, \
STMT_4, \
STMT_5, \
STMT_6, \
STMT_7, \
STMT_8, \
STMT_9, \
STMT_10, \
STMT_11, \
STMT_12, \
STMT_13, \
STMT_14, \
STMT_15, \
STMT_16, \
STMT_17, \
STMT_18, \
STMT_19, \
STMT_20, \
STMT_21, \
STMT_22, \
STMT_23, \
STMT_24, \
STMT_25, \
STMT_26, \
STMT_27, \
STMT_28, \
STMT_29, \
STMT_30, \
STMT_31, \
STMT_32, \
STMT_33, \
STMT_34, \
STMT_35, \
STMT_36, \
STMT_37, \
STMT_38, \
STMT_39, \
STMT_40, \
STMT_41, \
STMT_42, \
STMT_43, \
STMT_44, \
STMT_45, \
STMT_46, \
STMT_47, \
STMT_48, \
STMT_49, \
STMT_50, \
STMT_51, \
STMT_52, \
STMT_53, \
STMT_54, \
STMT_55, \
STMT_56, \
STMT_57, \
STMT_58, \
STMT_59, \
STMT_60, \
STMT_61, \
STMT_62, \
STMT_63, \
STMT_64, \
STMT_65, \
STMT_66, \
STMT_67, \
STMT_68, \
STMT_69, \
STMT_70, \
STMT_71, \
STMT_72, \
STMT_73, \
STMT_74, \
STMT_75, \
STMT_76, \
STMT_77, \
STMT_78, \
STMT_79, \
STMT_80, \
STMT_81, \
STMT_82, \
STMT_83, \
STMT_84, \
STMT_85, \
STMT_86, \
STMT_87, \
STMT_88, \
STMT_89, \
STMT_90, \
STMT_91, \
STMT_92, \
STMT_93, \
STMT_94, \
STMT_95, \
STMT_96, \
STMT_97, \
STMT_98, \
STMT_99, \
STMT_100, \
STMT_101, \
STMT_102, \
STMT_103, \
STMT_104, \
STMT_105, \
STMT_106, \
STMT_107, \
STMT_108, \
STMT_109, \
STMT_110, \
STMT_111, \
STMT_112, \
STMT_113, \
STMT_114, \
STMT_115, \
STMT_116, \
STMT_117, \
STMT_118, \
STMT_119, \
STMT_120, \
STMT_121, \
STMT_122, \
STMT_123, \
STMT_124, \
STMT_125, \
STMT_126, \
STMT_127, \
STMT_128, \
STMT_129, \
STMT_130, \
STMT_131, \
STMT_132, \
STMT_133, \
STMT_134, \
STMT_135, \
STMT_136, \
STMT_137, \
STMT_138, \
STMT_139, \
STMT_140, \
STMT_141, \
STMT_142, \
STMT_143, \
STMT_144, \
STMT_145, \
STMT_146, \
STMT_147, \
STMT_148, \
STMT_149, \
STMT_150, \
STMT_151, \
STMT_152, \
STMT_153, \
STMT_154, \
STMT_155, \
STMT_156, \
STMT_157, \
STMT_158, \
STMT_159, \
STMT_160, \
STMT_161, \
STMT_162, \
STMT_163, \
STMT_164, \
STMT_165, \
STMT_166, \
STMT_167, \
STMT_168, \
STMT_169, \
STMT_170, \
STMT_171, \
STMT_172, \
STMT_173, \
STMT_174, \
STMT_175, \
STMT_176, \
STMT_177, \
STMT_178, \
STMT_179, \
STMT_180, \
STMT_181, \
STMT_182, \
STMT_183, \
STMT_184, \
STMT_185, \
STMT_186, \
STMT_187, \
STMT_188, \
STMT_189, \
STMT_190, \
STMT_191, \
STMT_192, \
STMT_193, \
STMT_194, \
STMT_195, \
STMT_196, \
STMT_197, \
STMT_198, \
STMT_199, \
STMT_200, \
STMT_201, \
STMT_202, \
STMT_203, \
STMT_204, \
STMT_205, \
STMT_206, \
STMT_207, \
STMT_208, \
STMT_209, \
STMT_210, \
STMT_211, \
STMT_212, \
STMT_213, \
STMT_214, \
STMT_215, \
STMT_216, \
STMT_217, \
STMT_218, \
STMT_219, \
STMT_220, \
STMT_221, \
STMT_222, \
STMT_223, \
STMT_224, \
STMT_225, \
STMT_226, \
STMT_227, \
STMT_228, \
STMT_229, \
STMT_230, \
STMT_231, \
STMT_232, \
STMT_233, \
STMT_234, \
NULL \
}
#define WC_QUERIES_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
STMT_1_INFO, \
STMT_2_INFO, \
STMT_3_INFO, \
STMT_4_INFO, \
STMT_5_INFO, \
STMT_6_INFO, \
STMT_7_INFO, \
STMT_8_INFO, \
STMT_9_INFO, \
STMT_10_INFO, \
STMT_11_INFO, \
STMT_12_INFO, \
STMT_13_INFO, \
STMT_14_INFO, \
STMT_15_INFO, \
STMT_16_INFO, \
STMT_17_INFO, \
STMT_18_INFO, \
STMT_19_INFO, \
STMT_20_INFO, \
STMT_21_INFO, \
STMT_22_INFO, \
STMT_23_INFO, \
STMT_24_INFO, \
STMT_25_INFO, \
STMT_26_INFO, \
STMT_27_INFO, \
STMT_28_INFO, \
STMT_29_INFO, \
STMT_30_INFO, \
STMT_31_INFO, \
STMT_32_INFO, \
STMT_33_INFO, \
STMT_34_INFO, \
STMT_35_INFO, \
STMT_36_INFO, \
STMT_37_INFO, \
STMT_38_INFO, \
STMT_39_INFO, \
STMT_40_INFO, \
STMT_41_INFO, \
STMT_42_INFO, \
STMT_43_INFO, \
STMT_44_INFO, \
STMT_45_INFO, \
STMT_46_INFO, \
STMT_47_INFO, \
STMT_48_INFO, \
STMT_49_INFO, \
STMT_50_INFO, \
STMT_51_INFO, \
STMT_52_INFO, \
STMT_53_INFO, \
STMT_54_INFO, \
STMT_55_INFO, \
STMT_56_INFO, \
STMT_57_INFO, \
STMT_58_INFO, \
STMT_59_INFO, \
STMT_60_INFO, \
STMT_61_INFO, \
STMT_62_INFO, \
STMT_63_INFO, \
STMT_64_INFO, \
STMT_65_INFO, \
STMT_66_INFO, \
STMT_67_INFO, \
STMT_68_INFO, \
STMT_69_INFO, \
STMT_70_INFO, \
STMT_71_INFO, \
STMT_72_INFO, \
STMT_73_INFO, \
STMT_74_INFO, \
STMT_75_INFO, \
STMT_76_INFO, \
STMT_77_INFO, \
STMT_78_INFO, \
STMT_79_INFO, \
STMT_80_INFO, \
STMT_81_INFO, \
STMT_82_INFO, \
STMT_83_INFO, \
STMT_84_INFO, \
STMT_85_INFO, \
STMT_86_INFO, \
STMT_87_INFO, \
STMT_88_INFO, \
STMT_89_INFO, \
STMT_90_INFO, \
STMT_91_INFO, \
STMT_92_INFO, \
STMT_93_INFO, \
STMT_94_INFO, \
STMT_95_INFO, \
STMT_96_INFO, \
STMT_97_INFO, \
STMT_98_INFO, \
STMT_99_INFO, \
STMT_100_INFO, \
STMT_101_INFO, \
STMT_102_INFO, \
STMT_103_INFO, \
STMT_104_INFO, \
STMT_105_INFO, \
STMT_106_INFO, \
STMT_107_INFO, \
STMT_108_INFO, \
STMT_109_INFO, \
STMT_110_INFO, \
STMT_111_INFO, \
STMT_112_INFO, \
STMT_113_INFO, \
STMT_114_INFO, \
STMT_115_INFO, \
STMT_116_INFO, \
STMT_117_INFO, \
STMT_118_INFO, \
STMT_119_INFO, \
STMT_120_INFO, \
STMT_121_INFO, \
STMT_122_INFO, \
STMT_123_INFO, \
STMT_124_INFO, \
STMT_125_INFO, \
STMT_126_INFO, \
STMT_127_INFO, \
STMT_128_INFO, \
STMT_129_INFO, \
STMT_130_INFO, \
STMT_131_INFO, \
STMT_132_INFO, \
STMT_133_INFO, \
STMT_134_INFO, \
STMT_135_INFO, \
STMT_136_INFO, \
STMT_137_INFO, \
STMT_138_INFO, \
STMT_139_INFO, \
STMT_140_INFO, \
STMT_141_INFO, \
STMT_142_INFO, \
STMT_143_INFO, \
STMT_144_INFO, \
STMT_145_INFO, \
STMT_146_INFO, \
STMT_147_INFO, \
STMT_148_INFO, \
STMT_149_INFO, \
STMT_150_INFO, \
STMT_151_INFO, \
STMT_152_INFO, \
STMT_153_INFO, \
STMT_154_INFO, \
STMT_155_INFO, \
STMT_156_INFO, \
STMT_157_INFO, \
STMT_158_INFO, \
STMT_159_INFO, \
STMT_160_INFO, \
STMT_161_INFO, \
STMT_162_INFO, \
STMT_163_INFO, \
STMT_164_INFO, \
STMT_165_INFO, \
STMT_166_INFO, \
STMT_167_INFO, \
STMT_168_INFO, \
STMT_169_INFO, \
STMT_170_INFO, \
STMT_171_INFO, \
STMT_172_INFO, \
STMT_173_INFO, \
STMT_174_INFO, \
STMT_175_INFO, \
STMT_176_INFO, \
STMT_177_INFO, \
STMT_178_INFO, \
STMT_179_INFO, \
STMT_180_INFO, \
STMT_181_INFO, \
STMT_182_INFO, \
STMT_183_INFO, \
STMT_184_INFO, \
STMT_185_INFO, \
STMT_186_INFO, \
STMT_187_INFO, \
STMT_188_INFO, \
STMT_189_INFO, \
STMT_190_INFO, \
STMT_191_INFO, \
STMT_192_INFO, \
STMT_193_INFO, \
STMT_194_INFO, \
STMT_195_INFO, \
STMT_196_INFO, \
STMT_197_INFO, \
STMT_198_INFO, \
STMT_199_INFO, \
STMT_200_INFO, \
STMT_201_INFO, \
STMT_202_INFO, \
STMT_203_INFO, \
STMT_204_INFO, \
STMT_205_INFO, \
STMT_206_INFO, \
STMT_207_INFO, \
STMT_208_INFO, \
STMT_209_INFO, \
STMT_210_INFO, \
STMT_211_INFO, \
STMT_212_INFO, \
STMT_213_INFO, \
STMT_214_INFO, \
STMT_215_INFO, \
STMT_216_INFO, \
STMT_217_INFO, \
STMT_218_INFO, \
STMT_219_INFO, \
STMT_220_INFO, \
STMT_221_INFO, \
STMT_222_INFO, \
STMT_223_INFO, \
STMT_224_INFO, \
STMT_225_INFO, \
STMT_226_INFO, \
STMT_227_INFO, \
STMT_228_INFO, \
STMT_229_INFO, \
STMT_230_INFO, \
STMT_231_INFO, \
STMT_232_INFO, \
STMT_233_INFO, \
STMT_234_INFO, \
{NULL, NULL} \
}
Index: stable/11/contrib/subversion/subversion/svn/info-cmd.c
===================================================================
--- stable/11/contrib/subversion/subversion/svn/info-cmd.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/svn/info-cmd.c (revision 309511)
@@ -1,1004 +1,1004 @@
/*
* info-cmd.c -- Display information about a resource
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* ==================================================================== */
/*** Includes. ***/
#include "svn_string.h"
#include "svn_cmdline.h"
#include "svn_wc.h"
#include "svn_pools.h"
#include "svn_error_codes.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_time.h"
#include "svn_xml.h"
#include "cl.h"
#include "svn_private_config.h"
#include "cl-conflicts.h"
/*** Code. ***/
static svn_error_t *
svn_cl__info_print_time(apr_time_t atime,
const char *desc,
apr_pool_t *pool)
{
const char *time_utf8;
time_utf8 = svn_time_to_human_cstring(atime, pool);
return svn_cmdline_printf(pool, "%s: %s\n", desc, time_utf8);
}
/* Return string representation of SCHEDULE */
static const char *
schedule_str(svn_wc_schedule_t schedule)
{
switch (schedule)
{
case svn_wc_schedule_normal:
return "normal";
case svn_wc_schedule_add:
return "add";
case svn_wc_schedule_delete:
return "delete";
case svn_wc_schedule_replace:
return "replace";
default:
return "none";
}
}
/* Return a relative URL from information in INFO using POOL for
temporary allocation. */
static const char*
relative_url(const svn_client_info2_t *info, apr_pool_t *pool)
{
return apr_pstrcat(pool, "^/",
svn_path_uri_encode(
svn_uri_skip_ancestor(info->repos_root_URL,
info->URL, pool),
pool), SVN_VA_NULL);
}
/* The kinds of items for print_info_item(). */
typedef enum
{
/* Entry kind */
info_item_kind,
/* Repository location. */
info_item_url,
info_item_relative_url,
info_item_repos_root_url,
info_item_repos_uuid,
/* Working copy revision or repository HEAD revision */
info_item_revision,
/* Commit details. */
info_item_last_changed_rev,
info_item_last_changed_date,
info_item_last_changed_author,
/* Working copy information */
info_item_wc_root
} info_item_t;
/* Mapping between option keywords and info_item_t. */
typedef struct info_item_map_t
{
const svn_string_t keyword;
const info_item_t print_what;
} info_item_map_t;
#define MAKE_STRING(x) { x, sizeof(x) - 1 }
static const info_item_map_t info_item_map[] =
{
{ MAKE_STRING("kind"), info_item_kind },
{ MAKE_STRING("url"), info_item_url },
{ MAKE_STRING("relative-url"), info_item_relative_url },
{ MAKE_STRING("repos-root-url"), info_item_repos_root_url },
{ MAKE_STRING("repos-uuid"), info_item_repos_uuid },
{ MAKE_STRING("revision"), info_item_revision },
{ MAKE_STRING("last-changed-revision"),
info_item_last_changed_rev },
{ MAKE_STRING("last-changed-date"), info_item_last_changed_date },
{ MAKE_STRING("last-changed-author"), info_item_last_changed_author },
{ MAKE_STRING("wc-root"), info_item_wc_root }
};
#undef MAKE_STRING
static const apr_size_t info_item_map_len =
(sizeof(info_item_map) / sizeof(info_item_map[0]));
/* The baton type used by the info receiver functions. */
typedef struct print_info_baton_t
{
/* The path prefix that output paths should be normalized to. */
const char *path_prefix;
/*
* The following fields are used by print_info_item().
*/
/* Which item to print. */
info_item_t print_what;
/* Do we expect to show info for multiple targets? */
svn_boolean_t multiple_targets;
/* TRUE iff the current is a local path. */
svn_boolean_t target_is_path;
/* Did we already print a line of output? */
svn_boolean_t start_new_line;
} print_info_baton_t;
/* Find the appropriate info_item_t for KEYWORD and initialize
* RECEIVER_BATON for print_info_item(). Use SCRATCH_POOL for
* temporary allocation.
*/
static svn_error_t *
find_print_what(const char *keyword,
print_info_baton_t *receiver_baton,
apr_pool_t *scratch_pool)
{
svn_cl__simcheck_t **keywords = apr_palloc(
scratch_pool, info_item_map_len * sizeof(svn_cl__simcheck_t*));
svn_cl__simcheck_t *kwbuf = apr_palloc(
scratch_pool, info_item_map_len * sizeof(svn_cl__simcheck_t));
apr_size_t i;
for (i = 0; i < info_item_map_len; ++i)
{
keywords[i] = &kwbuf[i];
kwbuf[i].token.data = info_item_map[i].keyword.data;
kwbuf[i].token.len = info_item_map[i].keyword.len;
kwbuf[i].data = &info_item_map[i];
}
switch (svn_cl__similarity_check(keyword, keywords,
info_item_map_len, scratch_pool))
{
const info_item_map_t *kw0;
const info_item_map_t *kw1;
const info_item_map_t *kw2;
case 0: /* Exact match. */
kw0 = keywords[0]->data;
receiver_baton->print_what = kw0->print_what;
return SVN_NO_ERROR;
case 1:
/* The best alternative isn't good enough */
return svn_error_createf(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("'%s' is not a valid value for --show-item"),
keyword);
case 2:
/* There is only one good candidate */
kw0 = keywords[0]->data;
return svn_error_createf(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("'%s' is not a valid value for --show-item;"
" did you mean '%s'?"),
keyword, kw0->keyword.data);
case 3:
/* Suggest a list of the most likely candidates */
kw0 = keywords[0]->data;
kw1 = keywords[1]->data;
return svn_error_createf(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("'%s' is not a valid value for --show-item;"
" did you mean '%s' or '%s'?"),
keyword, kw0->keyword.data, kw1->keyword.data);
default:
/* Never suggest more than three candidates */
kw0 = keywords[0]->data;
kw1 = keywords[1]->data;
kw2 = keywords[2]->data;
return svn_error_createf(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("'%s' is not a valid value for --show-item;"
" did you mean '%s', '%s' or '%s'?"),
keyword, kw0->keyword.data, kw1->keyword.data, kw2->keyword.data);
}
}
/* A callback of type svn_client_info_receiver2_t.
Prints svn info in xml mode to standard out */
static svn_error_t *
print_info_xml(void *baton,
const char *target,
const svn_client_info2_t *info,
apr_pool_t *pool)
{
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
const char *rev_str;
print_info_baton_t *const receiver_baton = baton;
if (SVN_IS_VALID_REVNUM(info->rev))
rev_str = apr_psprintf(pool, "%ld", info->rev);
else
rev_str = apr_pstrdup(pool, _("Resource is not under version control."));
/* "<entry ...>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "entry",
"path", svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix, target, pool),
"kind", svn_cl__node_kind_str_xml(info->kind),
"revision", rev_str,
SVN_VA_NULL);
/* "<url> xx </url>" */
svn_cl__xml_tagged_cdata(&sb, pool, "url", info->URL);
if (info->repos_root_URL && info->URL)
{
/* "<relative-url> xx </relative-url>" */
svn_cl__xml_tagged_cdata(&sb, pool, "relative-url",
relative_url(info, pool));
}
if (info->repos_root_URL || info->repos_UUID)
{
/* "<repository>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "repository",
SVN_VA_NULL);
/* "<root> xx </root>" */
svn_cl__xml_tagged_cdata(&sb, pool, "root", info->repos_root_URL);
/* "<uuid> xx </uuid>" */
svn_cl__xml_tagged_cdata(&sb, pool, "uuid", info->repos_UUID);
/* "</repository>" */
svn_xml_make_close_tag(&sb, pool, "repository");
}
if (info->wc_info)
{
/* "<wc-info>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "wc-info",
SVN_VA_NULL);
/* "<wcroot-abspath> xx </wcroot-abspath>" */
if (info->wc_info->wcroot_abspath)
svn_cl__xml_tagged_cdata(&sb, pool, "wcroot-abspath",
info->wc_info->wcroot_abspath);
/* "<schedule> xx </schedule>" */
svn_cl__xml_tagged_cdata(&sb, pool, "schedule",
schedule_str(info->wc_info->schedule));
/* "<depth> xx </depth>" */
{
svn_depth_t depth = info->wc_info->depth;
/* In the entries world info just passed depth infinity for files */
if (depth == svn_depth_unknown && info->kind == svn_node_file)
depth = svn_depth_infinity;
svn_cl__xml_tagged_cdata(&sb, pool, "depth", svn_depth_to_word(depth));
}
/* "<copy-from-url> xx </copy-from-url>" */
svn_cl__xml_tagged_cdata(&sb, pool, "copy-from-url",
info->wc_info->copyfrom_url);
/* "<copy-from-rev> xx </copy-from-rev>" */
if (SVN_IS_VALID_REVNUM(info->wc_info->copyfrom_rev))
svn_cl__xml_tagged_cdata(&sb, pool, "copy-from-rev",
apr_psprintf(pool, "%ld",
info->wc_info->copyfrom_rev));
/* "<text-updated> xx </text-updated>" */
if (info->wc_info->recorded_time)
svn_cl__xml_tagged_cdata(&sb, pool, "text-updated",
svn_time_to_cstring(
info->wc_info->recorded_time,
pool));
/* "<checksum> xx </checksum>" */
/* ### Print the checksum kind. */
svn_cl__xml_tagged_cdata(&sb, pool, "checksum",
svn_checksum_to_cstring(info->wc_info->checksum,
pool));
if (info->wc_info->changelist)
/* "<changelist> xx </changelist>" */
svn_cl__xml_tagged_cdata(&sb, pool, "changelist",
info->wc_info->changelist);
if (info->wc_info->moved_from_abspath)
{
const char *relpath;
relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath,
info->wc_info->moved_from_abspath);
/* <moved-from> xx </moved-from> */
if (relpath && relpath[0] != '\0')
svn_cl__xml_tagged_cdata(&sb, pool, "moved-from", relpath);
else
svn_cl__xml_tagged_cdata(&sb, pool, "moved-from",
info->wc_info->moved_from_abspath);
}
if (info->wc_info->moved_to_abspath)
{
const char *relpath;
relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath,
info->wc_info->moved_to_abspath);
/* <moved-to> xx </moved-to> */
if (relpath && relpath[0] != '\0')
svn_cl__xml_tagged_cdata(&sb, pool, "moved-to", relpath);
else
svn_cl__xml_tagged_cdata(&sb, pool, "moved-to",
info->wc_info->moved_to_abspath);
}
/* "</wc-info>" */
svn_xml_make_close_tag(&sb, pool, "wc-info");
}
if (info->last_changed_author
|| SVN_IS_VALID_REVNUM(info->last_changed_rev)
|| info->last_changed_date)
{
svn_cl__print_xml_commit(&sb, info->last_changed_rev,
info->last_changed_author,
svn_time_to_cstring(info->last_changed_date,
pool),
pool);
}
if (info->wc_info && info->wc_info->conflicts)
{
int i;
for (i = 0; i < info->wc_info->conflicts->nelts; i++)
{
const svn_wc_conflict_description2_t *conflict =
APR_ARRAY_IDX(info->wc_info->conflicts, i,
const svn_wc_conflict_description2_t *);
SVN_ERR(svn_cl__append_conflict_info_xml(sb, conflict, pool));
}
}
if (info->lock)
svn_cl__print_xml_lock(&sb, info->lock, pool);
/* "</entry>" */
svn_xml_make_close_tag(&sb, pool, "entry");
return svn_cl__error_checked_fputs(sb->data, stdout);
}
/* A callback of type svn_client_info_receiver2_t. */
static svn_error_t *
print_info(void *baton,
const char *target,
const svn_client_info2_t *info,
apr_pool_t *pool)
{
print_info_baton_t *const receiver_baton = baton;
SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix, target, pool)));
/* ### remove this someday: it's only here for cmdline output
compatibility with svn 1.1 and older. */
if (info->kind != svn_node_dir)
SVN_ERR(svn_cmdline_printf(pool, _("Name: %s\n"),
svn_dirent_basename(target, pool)));
if (info->wc_info && info->wc_info->wcroot_abspath)
SVN_ERR(svn_cmdline_printf(pool, _("Working Copy Root Path: %s\n"),
svn_dirent_local_style(
info->wc_info->wcroot_abspath,
pool)));
if (info->URL)
SVN_ERR(svn_cmdline_printf(pool, _("URL: %s\n"), info->URL));
if (info->URL && info->repos_root_URL)
SVN_ERR(svn_cmdline_printf(pool, _("Relative URL: %s\n"),
relative_url(info, pool)));
if (info->repos_root_URL)
SVN_ERR(svn_cmdline_printf(pool, _("Repository Root: %s\n"),
info->repos_root_URL));
if (info->repos_UUID)
SVN_ERR(svn_cmdline_printf(pool, _("Repository UUID: %s\n"),
info->repos_UUID));
if (SVN_IS_VALID_REVNUM(info->rev))
SVN_ERR(svn_cmdline_printf(pool, _("Revision: %ld\n"), info->rev));
switch (info->kind)
{
case svn_node_file:
SVN_ERR(svn_cmdline_printf(pool, _("Node Kind: file\n")));
break;
case svn_node_dir:
SVN_ERR(svn_cmdline_printf(pool, _("Node Kind: directory\n")));
break;
case svn_node_none:
SVN_ERR(svn_cmdline_printf(pool, _("Node Kind: none\n")));
break;
case svn_node_unknown:
default:
SVN_ERR(svn_cmdline_printf(pool, _("Node Kind: unknown\n")));
break;
}
if (info->wc_info)
{
switch (info->wc_info->schedule)
{
case svn_wc_schedule_normal:
SVN_ERR(svn_cmdline_printf(pool, _("Schedule: normal\n")));
break;
case svn_wc_schedule_add:
SVN_ERR(svn_cmdline_printf(pool, _("Schedule: add\n")));
break;
case svn_wc_schedule_delete:
SVN_ERR(svn_cmdline_printf(pool, _("Schedule: delete\n")));
break;
case svn_wc_schedule_replace:
SVN_ERR(svn_cmdline_printf(pool, _("Schedule: replace\n")));
break;
default:
break;
}
switch (info->wc_info->depth)
{
case svn_depth_unknown:
/* Unknown depth is the norm for remote directories anyway
(although infinity would be equally appropriate). Let's
not bother to print it. */
break;
case svn_depth_empty:
SVN_ERR(svn_cmdline_printf(pool, _("Depth: empty\n")));
break;
case svn_depth_files:
SVN_ERR(svn_cmdline_printf(pool, _("Depth: files\n")));
break;
case svn_depth_immediates:
SVN_ERR(svn_cmdline_printf(pool, _("Depth: immediates\n")));
break;
case svn_depth_exclude:
SVN_ERR(svn_cmdline_printf(pool, _("Depth: exclude\n")));
break;
case svn_depth_infinity:
/* Infinity is the default depth for working copy
directories. Let's not print it, it's not special enough
to be worth mentioning. */
break;
default:
/* Other depths should never happen here. */
SVN_ERR(svn_cmdline_printf(pool, _("Depth: INVALID\n")));
}
if (info->wc_info->copyfrom_url)
SVN_ERR(svn_cmdline_printf(pool, _("Copied From URL: %s\n"),
info->wc_info->copyfrom_url));
if (SVN_IS_VALID_REVNUM(info->wc_info->copyfrom_rev))
SVN_ERR(svn_cmdline_printf(pool, _("Copied From Rev: %ld\n"),
info->wc_info->copyfrom_rev));
if (info->wc_info->moved_from_abspath)
SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix,
info->wc_info->moved_from_abspath,
pool)));
if (info->wc_info->moved_to_abspath)
SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix,
info->wc_info->moved_to_abspath,
pool)));
}
if (info->last_changed_author)
SVN_ERR(svn_cmdline_printf(pool, _("Last Changed Author: %s\n"),
info->last_changed_author));
if (SVN_IS_VALID_REVNUM(info->last_changed_rev))
SVN_ERR(svn_cmdline_printf(pool, _("Last Changed Rev: %ld\n"),
info->last_changed_rev));
if (info->last_changed_date)
SVN_ERR(svn_cl__info_print_time(info->last_changed_date,
_("Last Changed Date"), pool));
if (info->wc_info)
{
if (info->wc_info->recorded_time)
SVN_ERR(svn_cl__info_print_time(info->wc_info->recorded_time,
_("Text Last Updated"), pool));
if (info->wc_info->checksum)
SVN_ERR(svn_cmdline_printf(pool, _("Checksum: %s\n"),
svn_checksum_to_cstring(
info->wc_info->checksum, pool)));
if (info->wc_info->conflicts)
{
svn_boolean_t printed_prop_conflict_file = FALSE;
svn_boolean_t printed_tc = FALSE;
int i;
for (i = 0; i < info->wc_info->conflicts->nelts; i++)
{
const svn_wc_conflict_description2_t *conflict =
APR_ARRAY_IDX(info->wc_info->conflicts, i,
const svn_wc_conflict_description2_t *);
const char *desc;
switch (conflict->kind)
{
case svn_wc_conflict_kind_text:
if (conflict->base_abspath)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Previous Base File: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix,
conflict->base_abspath,
pool)));
if (conflict->my_abspath)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Previous Working File: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix,
conflict->my_abspath,
pool)));
if (conflict->their_abspath)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Current Base File: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix,
conflict->their_abspath,
pool)));
break;
case svn_wc_conflict_kind_property:
if (! printed_prop_conflict_file)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Properties File: %s\n"),
svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix,
conflict->prop_reject_abspath,
pool)));
printed_prop_conflict_file = TRUE;
break;
case svn_wc_conflict_kind_tree:
printed_tc = TRUE;
SVN_ERR(
svn_cl__get_human_readable_tree_conflict_description(
&desc, conflict, pool));
SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n",
_("Tree conflict"), desc));
break;
}
}
/* We only store one left and right version for all conflicts, which is
referenced from all conflicts.
Print it after the conflicts to match the 1.6/1.7 output where it is
only available for tree conflicts */
{
const char *src_left_version;
const char *src_right_version;
const svn_wc_conflict_description2_t *conflict =
APR_ARRAY_IDX(info->wc_info->conflicts, 0,
const svn_wc_conflict_description2_t *);
if (!printed_tc)
{
const char *desc;
SVN_ERR(svn_cl__get_human_readable_action_description(&desc,
svn_wc_conflict_action_edit,
conflict->operation,
conflict->node_kind, pool));
SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n",
_("Conflict Details"), desc));
}
src_left_version =
svn_cl__node_description(conflict->src_left_version,
info->repos_root_URL, pool);
src_right_version =
svn_cl__node_description(conflict->src_right_version,
info->repos_root_URL, pool);
if (src_left_version)
SVN_ERR(svn_cmdline_printf(pool, " %s: %s\n",
_("Source left"), /* (1) */
src_left_version));
/* (1): Sneaking in a space in "Source left" so that
* it is the same length as "Source right" while it still
* starts in the same column. That's just a tiny tweak in
* the English `svn'. */
if (src_right_version)
SVN_ERR(svn_cmdline_printf(pool, " %s: %s\n",
_("Source right"),
src_right_version));
}
}
}
if (info->lock)
{
if (info->lock->token)
SVN_ERR(svn_cmdline_printf(pool, _("Lock Token: %s\n"),
info->lock->token));
if (info->lock->owner)
SVN_ERR(svn_cmdline_printf(pool, _("Lock Owner: %s\n"),
info->lock->owner));
if (info->lock->creation_date)
SVN_ERR(svn_cl__info_print_time(info->lock->creation_date,
_("Lock Created"), pool));
if (info->lock->expiration_date)
SVN_ERR(svn_cl__info_print_time(info->lock->expiration_date,
_("Lock Expires"), pool));
if (info->lock->comment)
{
int comment_lines;
/* NOTE: The stdio will handle newline translation. */
comment_lines = svn_cstring_count_newlines(info->lock->comment) + 1;
SVN_ERR(svn_cmdline_printf(pool,
Q_("Lock Comment (%i line):\n%s\n",
"Lock Comment (%i lines):\n%s\n",
comment_lines),
comment_lines,
info->lock->comment));
}
}
if (info->wc_info && info->wc_info->changelist)
SVN_ERR(svn_cmdline_printf(pool, _("Changelist: %s\n"),
info->wc_info->changelist));
/* Print extra newline separator. */
return svn_cmdline_printf(pool, "\n");
}
/* Helper for print_info_item(): Print the value TEXT for TARGET_PATH,
either of which may be NULL. Use POOL for temporary allocation. */
static svn_error_t *
print_info_item_string(const char *text, const char *target_path,
apr_pool_t *pool)
{
if (text)
{
if (target_path)
SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", text, target_path));
else
SVN_ERR(svn_cmdline_fputs(text, stdout, pool));
}
else if (target_path)
SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", "", target_path));
return SVN_NO_ERROR;
}
/* Helper for print_info_item(): Print the revision number REV, which
may be SVN_INVALID_REVNUM, for TARGET_PATH, which may be NULL. Use
POOL for temporary allocation. */
static svn_error_t *
print_info_item_revision(svn_revnum_t rev, const char *target_path,
apr_pool_t *pool)
{
if (SVN_IS_VALID_REVNUM(rev))
{
if (target_path)
SVN_ERR(svn_cmdline_printf(pool, "%-10ld %s", rev, target_path));
else
- SVN_ERR(svn_cmdline_printf(pool, "%-10ld", rev));
+ SVN_ERR(svn_cmdline_printf(pool, "%ld", rev));
}
else if (target_path)
SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", "", target_path));
return SVN_NO_ERROR;
}
/* A callback of type svn_client_info_receiver2_t. */
static svn_error_t *
print_info_item(void *baton,
const char *target,
const svn_client_info2_t *info,
apr_pool_t *pool)
{
print_info_baton_t *const receiver_baton = baton;
const char *const target_path =
(!receiver_baton->multiple_targets ? NULL
: (!receiver_baton->target_is_path ? info->URL
: svn_cl__local_style_skip_ancestor(
receiver_baton->path_prefix, target, pool)));
if (receiver_baton->start_new_line)
SVN_ERR(svn_cmdline_fputs("\n", stdout, pool));
switch (receiver_baton->print_what)
{
case info_item_kind:
SVN_ERR(print_info_item_string(svn_node_kind_to_word(info->kind),
target_path, pool));
break;
case info_item_url:
SVN_ERR(print_info_item_string(info->URL, target_path, pool));
break;
case info_item_relative_url:
SVN_ERR(print_info_item_string(relative_url(info, pool),
target_path, pool));
break;
case info_item_repos_root_url:
SVN_ERR(print_info_item_string(info->repos_root_URL, target_path, pool));
break;
case info_item_repos_uuid:
SVN_ERR(print_info_item_string(info->repos_UUID, target_path, pool));
break;
case info_item_revision:
SVN_ERR(print_info_item_revision(info->rev, target_path, pool));
break;
case info_item_last_changed_rev:
SVN_ERR(print_info_item_revision(info->last_changed_rev,
target_path, pool));
break;
case info_item_last_changed_date:
SVN_ERR(print_info_item_string(
(!info->last_changed_date ? NULL
: svn_time_to_cstring(info->last_changed_date, pool)),
target_path, pool));
break;
case info_item_last_changed_author:
SVN_ERR(print_info_item_string(info->last_changed_author,
target_path, pool));
break;
case info_item_wc_root:
SVN_ERR(print_info_item_string(
(info->wc_info && info->wc_info->wcroot_abspath
? info->wc_info->wcroot_abspath : NULL),
target_path, pool));
break;
default:
SVN_ERR_MALFUNCTION();
}
receiver_baton->start_new_line = TRUE;
return SVN_NO_ERROR;
}
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__info(apr_getopt_t *os,
void *baton,
apr_pool_t *pool)
{
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets = NULL;
apr_pool_t *subpool = svn_pool_create(pool);
int i;
svn_error_t *err;
svn_boolean_t seen_nonexistent_target = FALSE;
svn_opt_revision_t peg_revision;
svn_client_info_receiver2_t receiver;
print_info_baton_t receiver_baton = { 0 };
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
ctx, FALSE, pool));
/* Add "." if user passed 0 arguments. */
svn_opt_push_implicit_dot_target(targets, pool);
if (opt_state->xml)
{
receiver = print_info_xml;
if (opt_state->show_item)
return svn_error_create(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--show-item is not valid in --xml mode"));
if (opt_state->no_newline)
return svn_error_create(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--no-newline is not valid in --xml mode"));
/* If output is not incremental, output the XML header and wrap
everything in a top-level element. This makes the output in
its entirety a well-formed XML document. */
if (! opt_state->incremental)
SVN_ERR(svn_cl__xml_print_header("info", pool));
}
else if (opt_state->show_item)
{
receiver = print_info_item;
if (opt_state->incremental)
return svn_error_create(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--incremental is only valid in --xml mode"));
receiver_baton.multiple_targets = (opt_state->depth > svn_depth_empty
|| targets->nelts > 1);
if (receiver_baton.multiple_targets && opt_state->no_newline)
return svn_error_create(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--no-newline is only available for single-target,"
" non-recursive info operations"));
SVN_ERR(find_print_what(opt_state->show_item, &receiver_baton, pool));
receiver_baton.start_new_line = FALSE;
}
else
{
receiver = print_info;
if (opt_state->incremental)
return svn_error_create(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--incremental is only valid in --xml mode"));
if (opt_state->no_newline)
return svn_error_create(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--no-newline' is only valid with --show-item"));
}
if (opt_state->depth == svn_depth_unknown)
opt_state->depth = svn_depth_empty;
SVN_ERR(svn_dirent_get_absolute(&receiver_baton.path_prefix, "", pool));
for (i = 0; i < targets->nelts; i++)
{
const char *truepath;
const char *target = APR_ARRAY_IDX(targets, i, const char *);
svn_pool_clear(subpool);
SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
/* Get peg revisions. */
SVN_ERR(svn_opt_parse_path(&peg_revision, &truepath, target, subpool));
/* If no peg-rev was attached to a URL target, then assume HEAD. */
if (svn_path_is_url(truepath))
{
if (peg_revision.kind == svn_opt_revision_unspecified)
peg_revision.kind = svn_opt_revision_head;
receiver_baton.target_is_path = FALSE;
}
else
{
SVN_ERR(svn_dirent_get_absolute(&truepath, truepath, subpool));
receiver_baton.target_is_path = TRUE;
}
err = svn_client_info4(truepath,
&peg_revision, &(opt_state->start_revision),
opt_state->depth,
TRUE /* fetch_excluded */,
TRUE /* fetch_actual_only */,
opt_state->include_externals,
opt_state->changelists,
receiver, &receiver_baton,
ctx, subpool);
if (err)
{
/* If one of the targets is a non-existent URL or wc-entry,
don't bail out. Just warn and move on to the next target. */
if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND ||
err->apr_err == SVN_ERR_RA_ILLEGAL_URL)
{
svn_handle_warning2(stderr, err, "svn: ");
svn_error_clear(svn_cmdline_fprintf(stderr, subpool, "\n"));
}
else
{
return svn_error_trace(err);
}
svn_error_clear(err);
err = NULL;
seen_nonexistent_target = TRUE;
}
}
svn_pool_destroy(subpool);
if (opt_state->xml && (! opt_state->incremental))
SVN_ERR(svn_cl__xml_print_footer("info", pool));
else if (opt_state->show_item && !opt_state->no_newline
&& receiver_baton.start_new_line)
SVN_ERR(svn_cmdline_fputs("\n", stdout, pool));
if (seen_nonexistent_target)
return svn_error_create(
SVN_ERR_ILLEGAL_TARGET, NULL,
_("Could not display info for all targets because some "
"targets don't exist"));
else
return SVN_NO_ERROR;
}
Index: stable/11/contrib/subversion/subversion/svn/merge-cmd.c
===================================================================
--- stable/11/contrib/subversion/subversion/svn/merge-cmd.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/svn/merge-cmd.c (revision 309511)
@@ -1,454 +1,459 @@
/*
* merge-cmd.c -- Merging changes into a working copy.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
/* ==================================================================== */
/*** Includes. ***/
#include "svn_client.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_error.h"
#include "svn_types.h"
#include "cl.h"
#include "private/svn_client_private.h"
#include "svn_private_config.h"
/*** Code. ***/
/* Throw an error if PATH_OR_URL is a path and REVISION isn't a repository
* revision. */
static svn_error_t *
ensure_wc_path_has_repo_revision(const char *path_or_url,
const svn_opt_revision_t *revision,
apr_pool_t *scratch_pool)
{
if (revision->kind != svn_opt_revision_number
&& revision->kind != svn_opt_revision_date
&& revision->kind != svn_opt_revision_head
&& ! svn_path_is_url(path_or_url))
return svn_error_createf(
SVN_ERR_CLIENT_BAD_REVISION, NULL,
_("Invalid merge source '%s'; a working copy path can only be "
"used with a repository revision (a number, a date, or head)"),
svn_dirent_local_style(path_or_url, scratch_pool));
return SVN_NO_ERROR;
}
/* Run a merge.
*
* (No docs yet, as this code was just hoisted out of svn_cl__merge().)
*
* Having FIRST_RANGE_START/_END params is ugly -- we should be able to use
* PEG_REVISION1/2 and/or RANGES_TO_MERGE instead, maybe adjusting the caller.
*/
static svn_error_t *
run_merge(svn_boolean_t two_sources_specified,
const char *sourcepath1,
svn_opt_revision_t peg_revision1,
const char *sourcepath2,
const char *targetpath,
apr_array_header_t *ranges_to_merge,
svn_opt_revision_t first_range_start,
svn_opt_revision_t first_range_end,
svn_cl__opt_state_t *opt_state,
apr_array_header_t *options,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
svn_error_t *merge_err;
if (opt_state->reintegrate)
{
merge_err = svn_cl__deprecated_merge_reintegrate(
sourcepath1, &peg_revision1, targetpath,
opt_state->dry_run, options, ctx, scratch_pool);
}
else if (! two_sources_specified)
{
/* If we don't have at least one valid revision range, pick a
good one that spans the entire set of revisions on our
source. */
if ((first_range_start.kind == svn_opt_revision_unspecified)
&& (first_range_end.kind == svn_opt_revision_unspecified))
{
ranges_to_merge = NULL;
}
if (opt_state->verbose)
SVN_ERR(svn_cmdline_printf(scratch_pool, _("--- Merging\n")));
merge_err = svn_client_merge_peg5(sourcepath1,
ranges_to_merge,
&peg_revision1,
targetpath,
opt_state->depth,
opt_state->ignore_ancestry,
opt_state->ignore_ancestry,
opt_state->force, /* force_delete */
opt_state->record_only,
opt_state->dry_run,
opt_state->allow_mixed_rev,
options,
ctx,
scratch_pool);
}
else
{
if (svn_path_is_url(sourcepath1) != svn_path_is_url(sourcepath2))
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Merge sources must both be "
"either paths or URLs"));
+ if (svn_path_is_url(targetpath))
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Merge target '%s' must be a local path "
+ "but looks like a URL"), targetpath);
+
if (opt_state->verbose)
SVN_ERR(svn_cmdline_printf(scratch_pool, _("--- Merging\n")));
merge_err = svn_client_merge5(sourcepath1,
&first_range_start,
sourcepath2,
&first_range_end,
targetpath,
opt_state->depth,
opt_state->ignore_ancestry,
opt_state->ignore_ancestry,
opt_state->force, /* force_delete */
opt_state->record_only,
opt_state->dry_run,
opt_state->allow_mixed_rev,
options,
ctx,
scratch_pool);
}
return merge_err;
}
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__merge(apr_getopt_t *os,
void *baton,
apr_pool_t *pool)
{
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
const char *sourcepath1 = NULL, *sourcepath2 = NULL, *targetpath = "";
svn_boolean_t two_sources_specified = TRUE;
svn_error_t *merge_err;
svn_opt_revision_t first_range_start, first_range_end, peg_revision1,
peg_revision2;
apr_array_header_t *options, *ranges_to_merge = opt_state->revision_ranges;
svn_boolean_t has_explicit_target = FALSE;
/* Merge doesn't support specifying a revision or revision range
when using --reintegrate. */
if (opt_state->reintegrate
&& opt_state->start_revision.kind != svn_opt_revision_unspecified)
{
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("-r and -c can't be used with --reintegrate"));
}
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
ctx, FALSE, pool));
/* For now, we require at least one source. That may change in
future versions of Subversion, for example if we have support for
negated mergeinfo. See this IRC conversation:
<bhuvan> kfogel: yeah, i think you are correct; we should
specify the source url
<kfogel> bhuvan: I'll change the help output and propose for
backport. Thanks.
<bhuvan> kfogel: np; while we are at it, 'svn merge' simply
returns nothing; i think we should say: """svn: Not
enough arguments provided; try 'svn help' for more
info"""
<kfogel> good idea
<kfogel> (in the future, 'svn merge' might actually do
something, but that's all the more reason to make
sure it errors now)
<cmpilato> actually, i'm pretty sure 'svn merge' does something
<cmpilato> it says "please merge any unmerged changes from
myself to myself."
<cmpilato> :-)
<kfogel> har har
<cmpilato> kfogel: i was serious.
<kfogel> cmpilato: urrr, uh. Is that meaningful? Is there
ever a reason for a user to run it?
<cmpilato> kfogel: not while we don't have support for negated
mergeinfo.
<kfogel> cmpilato: do you concur that until it does something
useful it should error?
<cmpilato> kfogel: yup.
<kfogel> cool
*/
if (targets->nelts < 1)
{
return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0,
_("Merge source required"));
}
else /* Parse at least one, and possible two, sources. */
{
SVN_ERR(svn_opt_parse_path(&peg_revision1, &sourcepath1,
APR_ARRAY_IDX(targets, 0, const char *),
pool));
if (targets->nelts >= 2)
SVN_ERR(svn_opt_parse_path(&peg_revision2, &sourcepath2,
APR_ARRAY_IDX(targets, 1, const char *),
pool));
}
/* We could have one or two sources. Deliberately written to stay
correct even if we someday permit implied merge source. */
if (targets->nelts <= 1)
{
two_sources_specified = FALSE;
}
else if (targets->nelts == 2)
{
if (svn_path_is_url(sourcepath1) && !svn_path_is_url(sourcepath2))
two_sources_specified = FALSE;
}
if (opt_state->revision_ranges->nelts > 0)
{
first_range_start = APR_ARRAY_IDX(opt_state->revision_ranges, 0,
svn_opt_revision_range_t *)->start;
first_range_end = APR_ARRAY_IDX(opt_state->revision_ranges, 0,
svn_opt_revision_range_t *)->end;
}
else
{
first_range_start.kind = first_range_end.kind =
svn_opt_revision_unspecified;
}
/* If revision_ranges has at least one real range at this point, then
we know the user must have used the '-r' and/or '-c' switch(es).
This means we're *not* doing two distinct sources. */
if (first_range_start.kind != svn_opt_revision_unspecified)
{
/* A revision *range* is required. */
if (first_range_end.kind == svn_opt_revision_unspecified)
return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0,
_("Second revision required"));
two_sources_specified = FALSE;
}
if (! two_sources_specified) /* TODO: Switch order of if */
{
if (targets->nelts > 2)
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Too many arguments given"));
/* Set the default value for unspecified paths and peg revision. */
/* targets->nelts is 1 ("svn merge SOURCE") or 2 ("svn merge
SOURCE WCPATH") here. */
sourcepath2 = sourcepath1;
if (peg_revision1.kind == svn_opt_revision_unspecified)
peg_revision1.kind = svn_path_is_url(sourcepath1)
? svn_opt_revision_head : svn_opt_revision_working;
if (targets->nelts == 2)
{
targetpath = APR_ARRAY_IDX(targets, 1, const char *);
has_explicit_target = TRUE;
if (svn_path_is_url(targetpath))
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Cannot specify a revision range "
"with two URLs"));
}
}
else /* using @rev syntax */
{
if (targets->nelts < 2)
return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, NULL, NULL);
if (targets->nelts > 3)
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Too many arguments given"));
first_range_start = peg_revision1;
first_range_end = peg_revision2;
/* Catch 'svn merge wc_path1 wc_path2 [target]' without explicit
revisions--since it ignores local modifications it may not do what
the user expects. That is, it doesn't read from the WC itself, it
reads from the WC's URL. Forcing the user to specify a repository
revision should avoid any confusion. */
SVN_ERR(ensure_wc_path_has_repo_revision(sourcepath1, &first_range_start,
pool));
SVN_ERR(ensure_wc_path_has_repo_revision(sourcepath2, &first_range_end,
pool));
/* Default peg revisions to each URL's youngest revision. */
if (first_range_start.kind == svn_opt_revision_unspecified)
first_range_start.kind = svn_opt_revision_head;
if (first_range_end.kind == svn_opt_revision_unspecified)
first_range_end.kind = svn_opt_revision_head;
/* Decide where to apply the delta (defaulting to "."). */
if (targets->nelts == 3)
{
targetpath = APR_ARRAY_IDX(targets, 2, const char *);
has_explicit_target = TRUE;
}
}
/* If no targetpath was specified, see if we can infer it from the
sourcepaths. */
if (! has_explicit_target
&& sourcepath1 && sourcepath2
&& strcmp(targetpath, "") == 0)
{
/* If the sourcepath is a URL, it can only refer to a target in
the current working directory or which is the current working
directory. However, if the sourcepath is a local path, it can
refer to a target somewhere deeper in the directory structure. */
if (svn_path_is_url(sourcepath1))
{
const char *sp1_basename = svn_uri_basename(sourcepath1, pool);
const char *sp2_basename = svn_uri_basename(sourcepath2, pool);
if (strcmp(sp1_basename, sp2_basename) == 0)
{
const char *target_url;
const char *target_base;
SVN_ERR(svn_client_url_from_path2(&target_url, targetpath, ctx,
pool, pool));
target_base = svn_uri_basename(target_url, pool);
/* If the basename of the source is the same as the basename of
the cwd assume the cwd is the target. */
if (strcmp(sp1_basename, target_base) != 0)
{
svn_node_kind_t kind;
/* If the basename of the source differs from the basename
of the target. We still might assume the cwd is the
target, but first check if there is a file in the cwd
with the same name as the source basename. If there is,
then assume that file is the target. */
SVN_ERR(svn_io_check_path(sp1_basename, &kind, pool));
if (kind == svn_node_file)
{
targetpath = sp1_basename;
}
}
}
}
else if (strcmp(sourcepath1, sourcepath2) == 0)
{
svn_node_kind_t kind;
SVN_ERR(svn_io_check_path(sourcepath1, &kind, pool));
if (kind == svn_node_file)
{
targetpath = sourcepath1;
}
}
}
if (opt_state->extensions)
options = svn_cstring_split(opt_state->extensions, " \t\n\r", TRUE, pool);
else
options = NULL;
/* More input validation. */
if (opt_state->reintegrate)
{
if (opt_state->ignore_ancestry)
return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--reintegrate cannot be used with "
"--ignore-ancestry"));
if (opt_state->record_only)
return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--reintegrate cannot be used with "
"--record-only"));
if (opt_state->depth != svn_depth_unknown)
return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--depth cannot be used with "
"--reintegrate"));
if (opt_state->force)
return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--force cannot be used with "
"--reintegrate"));
if (two_sources_specified)
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--reintegrate can only be used with "
"a single merge source"));
if (opt_state->allow_mixed_rev)
return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--allow-mixed-revisions cannot be used "
"with --reintegrate"));
}
merge_err = run_merge(two_sources_specified,
sourcepath1, peg_revision1,
sourcepath2,
targetpath,
ranges_to_merge, first_range_start, first_range_end,
opt_state, options, ctx, pool);
if (merge_err && merge_err->apr_err
== SVN_ERR_CLIENT_INVALID_MERGEINFO_NO_MERGETRACKING)
{
return svn_error_quick_wrap(
merge_err,
_("Merge tracking not possible, use --ignore-ancestry or\n"
"fix invalid mergeinfo in target with 'svn propset'"));
}
if (!opt_state->quiet)
{
svn_error_t *err = svn_cl__notifier_print_conflict_stats(
ctx->notify_baton2, pool);
merge_err = svn_error_compose_create(merge_err, err);
}
return svn_cl__may_need_force(merge_err);
}
Index: stable/11/contrib/subversion/subversion/svnserve/serve.c
===================================================================
--- stable/11/contrib/subversion/subversion/svnserve/serve.c (revision 309510)
+++ stable/11/contrib/subversion/subversion/svnserve/serve.c (revision 309511)
@@ -1,4077 +1,4078 @@
/*
* serve.c : Functions for serving the Subversion protocol
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <limits.h> /* for UINT_MAX */
#include <stdarg.h>
#define APR_WANT_STRFUNC
#include <apr_want.h>
#include <apr_general.h>
#include <apr_lib.h>
#include <apr_strings.h>
#include "svn_compat.h"
#include "svn_private_config.h" /* For SVN_PATH_LOCAL_SEPARATOR */
#include "svn_hash.h"
#include "svn_types.h"
#include "svn_string.h"
#include "svn_pools.h"
#include "svn_error.h"
#include "svn_ra.h" /* for SVN_RA_CAPABILITY_* */
#include "svn_ra_svn.h"
#include "svn_repos.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_time.h"
#include "svn_config.h"
#include "svn_props.h"
#include "svn_mergeinfo.h"
#include "svn_user.h"
#include "private/svn_log.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_ra_svn_private.h"
#include "private/svn_fspath.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h> /* For getpid() */
#endif
#include "server.h"
#include "logger.h"
typedef struct commit_callback_baton_t {
apr_pool_t *pool;
svn_revnum_t *new_rev;
const char **date;
const char **author;
const char **post_commit_err;
} commit_callback_baton_t;
typedef struct report_driver_baton_t {
server_baton_t *sb;
const char *repos_url; /* Decoded repository URL. */
void *report_baton;
svn_error_t *err;
/* so update() can distinguish checkout from update in logging */
int entry_counter;
svn_boolean_t only_empty_entries;
/* for diff() logging */
svn_revnum_t *from_rev;
} report_driver_baton_t;
typedef struct log_baton_t {
const char *fs_path;
svn_ra_svn_conn_t *conn;
int stack_depth;
} log_baton_t;
typedef struct file_revs_baton_t {
svn_ra_svn_conn_t *conn;
apr_pool_t *pool; /* Pool provided in the handler call. */
} file_revs_baton_t;
typedef struct fs_warning_baton_t {
server_baton_t *server;
svn_ra_svn_conn_t *conn;
} fs_warning_baton_t;
typedef struct authz_baton_t {
server_baton_t *server;
svn_ra_svn_conn_t *conn;
} authz_baton_t;
/* svn_error_create() a new error, log_server_error() it, and
return it. */
static void
log_error(svn_error_t *err, server_baton_t *server)
{
logger__log_error(server->logger, err, server->repository,
server->client_info);
}
/* svn_error_create() a new error, log_server_error() it, and
return it. */
static svn_error_t *
error_create_and_log(apr_status_t apr_err, svn_error_t *child,
const char *message, server_baton_t *server)
{
svn_error_t *err = svn_error_create(apr_err, child, message);
log_error(err, server);
return err;
}
/* Log a failure ERR, transmit ERR back to the client (as part of a
"failure" notification), consume ERR, and flush the connection. */
static svn_error_t *
log_fail_and_flush(svn_error_t *err, server_baton_t *server,
svn_ra_svn_conn_t *conn, apr_pool_t *pool)
{
svn_error_t *io_err;
log_error(err, server);
io_err = svn_ra_svn__write_cmd_failure(conn, pool, err);
svn_error_clear(err);
SVN_ERR(io_err);
return svn_ra_svn__flush(conn, pool);
}
/* Log a client command. */
static svn_error_t *log_command(server_baton_t *b,
svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *fmt, ...)
{
const char *remote_host, *timestr, *log, *line;
va_list ap;
apr_size_t nbytes;
if (b->logger == NULL)
return SVN_NO_ERROR;
remote_host = svn_ra_svn_conn_remote_host(conn);
timestr = svn_time_to_cstring(apr_time_now(), pool);
va_start(ap, fmt);
log = apr_pvsprintf(pool, fmt, ap);
va_end(ap);
line = apr_psprintf(pool, "%" APR_PID_T_FMT
" %s %s %s %s %s" APR_EOL_STR,
getpid(), timestr,
(remote_host ? remote_host : "-"),
(b->client_info->user ? b->client_info->user : "-"),
b->repository->repos_name, log);
nbytes = strlen(line);
return logger__write(b->logger, line, nbytes);
}
/* Log an authz failure */
static svn_error_t *
log_authz_denied(const char *path,
svn_repos_authz_access_t required,
server_baton_t *b,
apr_pool_t *pool)
{
const char *timestr, *remote_host, *line;
if (!b->logger)
return SVN_NO_ERROR;
if (!b->client_info || !b->client_info->user)
return SVN_NO_ERROR;
timestr = svn_time_to_cstring(apr_time_now(), pool);
remote_host = b->client_info->remote_host;
line = apr_psprintf(pool, "%" APR_PID_T_FMT
" %s %s %s %s Authorization Failed %s%s %s" APR_EOL_STR,
getpid(), timestr,
(remote_host ? remote_host : "-"),
b->client_info->user,
b->repository->repos_name,
(required & svn_authz_recursive ? "recursive " : ""),
(required & svn_authz_write ? "write" : "read"),
(path && path[0] ? path : "/"));
return logger__write(b->logger, line, strlen(line));
}
/* If CFG specifies a path to the password DB, read that DB through
* CONFIG_POOL and store it in REPOSITORY->PWDB.
*/
static svn_error_t *
load_pwdb_config(repository_t *repository,
svn_config_t *cfg,
svn_repos__config_pool_t *config_pool,
apr_pool_t *pool)
{
const char *pwdb_path;
svn_error_t *err;
svn_config_get(cfg, &pwdb_path,
SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_PASSWORD_DB, NULL);
repository->pwdb = NULL;
if (pwdb_path)
{
pwdb_path = svn_dirent_internal_style(pwdb_path, pool);
pwdb_path = svn_dirent_join(repository->base, pwdb_path, pool);
err = svn_repos__config_pool_get(&repository->pwdb, NULL, config_pool,
pwdb_path, TRUE, FALSE,
repository->repos, pool);
if (err)
{
/* Because it may be possible to read the pwdb file with some
access methods and not others, ignore errors reading the pwdb
file and just don't present password authentication as an
option. Also, some authentications (e.g. --tunnel) can
proceed without it anyway.
### Not entirely sure why SVN_ERR_BAD_FILENAME is checked
### for here. That seems to have been introduced in r856914,
### and only in r870942 was the APR_EACCES check introduced. */
if (err->apr_err != SVN_ERR_BAD_FILENAME
&& ! APR_STATUS_IS_EACCES(err->apr_err))
{
return svn_error_create(SVN_ERR_AUTHN_FAILED, err, NULL);
}
else
/* Ignore SVN_ERR_BAD_FILENAME and APR_EACCES and proceed. */
svn_error_clear(err);
}
}
return SVN_NO_ERROR;
}
/* Canonicalize *ACCESS_FILE based on the type of argument. Results are
* placed in *ACCESS_FILE. REPOSITORY is used to convert relative paths to
* absolute paths rooted at the server root. REPOS_ROOT is used to calculate
* an absolute URL for repos-relative URLs. */
static svn_error_t *
canonicalize_access_file(const char **access_file, repository_t *repository,
const char *repos_root, apr_pool_t *pool)
{
if (svn_path_is_url(*access_file))
{
*access_file = svn_uri_canonicalize(*access_file, pool);
}
else if (svn_path_is_repos_relative_url(*access_file))
{
const char *repos_root_url;
SVN_ERR(svn_uri_get_file_url_from_dirent(&repos_root_url, repos_root,
pool));
SVN_ERR(svn_path_resolve_repos_relative_url(access_file, *access_file,
repos_root_url, pool));
*access_file = svn_uri_canonicalize(*access_file, pool);
}
else
{
*access_file = svn_dirent_internal_style(*access_file, pool);
*access_file = svn_dirent_join(repository->base, *access_file, pool);
}
return SVN_NO_ERROR;
}
/* Load the authz database for the listening server through AUTHZ_POOL
based on the entries in the SERVER struct.
SERVER and CONN must not be NULL. The real errors will be logged with
SERVER and CONN but return generic errors to the client. */
static svn_error_t *
load_authz_config(repository_t *repository,
const char *repos_root,
svn_config_t *cfg,
svn_repos__authz_pool_t *authz_pool,
apr_pool_t *pool)
{
const char *authzdb_path;
const char *groupsdb_path;
svn_error_t *err;
/* Read authz configuration. */
svn_config_get(cfg, &authzdb_path, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_AUTHZ_DB, NULL);
svn_config_get(cfg, &groupsdb_path, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_GROUPS_DB, NULL);
if (authzdb_path)
{
const char *case_force_val;
/* Canonicalize and add the base onto the authzdb_path (if needed). */
err = canonicalize_access_file(&authzdb_path, repository,
repos_root, pool);
/* Same for the groupsdb_path if it is present. */
if (groupsdb_path && !err)
err = canonicalize_access_file(&groupsdb_path, repository,
repos_root, pool);
if (!err)
err = svn_repos__authz_pool_get(&repository->authzdb, authz_pool,
authzdb_path, groupsdb_path, TRUE,
repository->repos, pool);
if (err)
return svn_error_create(SVN_ERR_AUTHZ_INVALID_CONFIG, err, NULL);
/* Are we going to be case-normalizing usernames when we consult
* this authz file? */
svn_config_get(cfg, &case_force_val,
SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_FORCE_USERNAME_CASE, NULL);
if (case_force_val)
{
if (strcmp(case_force_val, "upper") == 0)
repository->username_case = CASE_FORCE_UPPER;
else if (strcmp(case_force_val, "lower") == 0)
repository->username_case = CASE_FORCE_LOWER;
else
repository->username_case = CASE_ASIS;
}
}
else
{
repository->authzdb = NULL;
repository->username_case = CASE_ASIS;
}
return SVN_NO_ERROR;
}
/* If ERROR is a AUTH* error as returned by load_pwdb_config or
* load_authz_config, write it to SERVER's log file.
* Return a sanitized version of ERROR.
*/
static svn_error_t *
handle_config_error(svn_error_t *error,
server_baton_t *server)
{
if ( error
&& ( error->apr_err == SVN_ERR_AUTHZ_INVALID_CONFIG
|| error->apr_err == SVN_ERR_AUTHN_FAILED))
{
apr_status_t apr_err = error->apr_err;
log_error(error, server);
/* Now that we've logged the error, clear it and return a
* nice, generic error to the user:
* http://subversion.tigris.org/issues/show_bug.cgi?id=2271 */
svn_error_clear(error);
return svn_error_create(apr_err, NULL, NULL);
}
return error;
}
/* Set *FS_PATH to the portion of URL that is the path within the
repository, if URL is inside REPOS_URL (if URL is not inside
REPOS_URL, then error, with the effect on *FS_PATH undefined).
If the resultant fs path would be the empty string (i.e., URL and
REPOS_URL are the same), then set *FS_PATH to "/".
Assume that REPOS_URL and URL are already URI-decoded. */
static svn_error_t *get_fs_path(const char *repos_url, const char *url,
const char **fs_path)
{
apr_size_t len;
len = strlen(repos_url);
if (strncmp(url, repos_url, len) != 0)
return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
"'%s' is not the same repository as '%s'",
url, repos_url);
*fs_path = url + len;
if (! **fs_path)
*fs_path = "/";
return SVN_NO_ERROR;
}
/* --- AUTHENTICATION AND AUTHORIZATION FUNCTIONS --- */
/* Convert TEXT to upper case if TO_UPPERCASE is TRUE, else
converts it to lower case. */
static void convert_case(char *text, svn_boolean_t to_uppercase)
{
char *c = text;
while (*c)
{
*c = (char)(to_uppercase ? apr_toupper(*c) : apr_tolower(*c));
++c;
}
}
/* Set *ALLOWED to TRUE if PATH is accessible in the REQUIRED mode to
the user described in BATON according to the authz rules in BATON.
Use POOL for temporary allocations only. If no authz rules are
present in BATON, grant access by default. */
static svn_error_t *authz_check_access(svn_boolean_t *allowed,
const char *path,
svn_repos_authz_access_t required,
server_baton_t *b,
apr_pool_t *pool)
{
repository_t *repository = b->repository;
client_info_t *client_info = b->client_info;
/* If authz cannot be performed, grant access. This is NOT the same
as the default policy when authz is performed on a path with no
rules. In the latter case, the default is to deny access, and is
set by svn_repos_authz_check_access. */
if (!repository->authzdb)
{
*allowed = TRUE;
return SVN_NO_ERROR;
}
/* If the authz request is for the empty path (ie. ""), replace it
with the root path. This happens because of stripping done at
various levels in svnserve that remove the leading / on an
absolute path. Passing such a malformed path to the authz
routines throws them into an infinite loop and makes them miss
ACLs. */
if (path)
path = svn_fspath__canonicalize(path, pool);
/* If we have a username, and we've not yet used it + any username
case normalization that might be requested to determine "the
username we used for authz purposes", do so now. */
if (client_info->user && (! client_info->authz_user))
{
char *authz_user = apr_pstrdup(b->pool, client_info->user);
if (repository->username_case == CASE_FORCE_UPPER)
convert_case(authz_user, TRUE);
else if (repository->username_case == CASE_FORCE_LOWER)
convert_case(authz_user, FALSE);
client_info->authz_user = authz_user;
}
SVN_ERR(svn_repos_authz_check_access(repository->authzdb,
repository->authz_repos_name,
path, client_info->authz_user,
required, allowed, pool));
if (!*allowed)
SVN_ERR(log_authz_denied(path, required, b, pool));
return SVN_NO_ERROR;
}
/* Set *ALLOWED to TRUE if PATH is readable by the user described in
* BATON. Use POOL for temporary allocations only. ROOT is not used.
* Implements the svn_repos_authz_func_t interface.
*/
static svn_error_t *authz_check_access_cb(svn_boolean_t *allowed,
svn_fs_root_t *root,
const char *path,
void *baton,
apr_pool_t *pool)
{
authz_baton_t *sb = baton;
return authz_check_access(allowed, path, svn_authz_read,
sb->server, pool);
}
/* If authz is enabled in the specified BATON, return a read authorization
function. Otherwise, return NULL. */
static svn_repos_authz_func_t authz_check_access_cb_func(server_baton_t *baton)
{
if (baton->repository->authzdb)
return authz_check_access_cb;
return NULL;
}
/* Set *ALLOWED to TRUE if the REQUIRED access to PATH is granted,
* according to the state in BATON. Use POOL for temporary
* allocations only. ROOT is not used. Implements the
* svn_repos_authz_callback_t interface.
*/
static svn_error_t *authz_commit_cb(svn_repos_authz_access_t required,
svn_boolean_t *allowed,
svn_fs_root_t *root,
const char *path,
void *baton,
apr_pool_t *pool)
{
authz_baton_t *sb = baton;
return authz_check_access(allowed, path, required, sb->server, pool);
}
/* Return the access level specified for OPTION in CFG. If no such
* setting exists, use DEF. If READ_ONLY is set, unconditionally disable
* write access.
*/
static enum access_type
get_access(svn_config_t *cfg,
const char *option,
const char *def,
svn_boolean_t read_only)
{
enum access_type result;
const char *val;
svn_config_get(cfg, &val, SVN_CONFIG_SECTION_GENERAL, option, def);
result = (strcmp(val, "write") == 0 ? WRITE_ACCESS :
strcmp(val, "read") == 0 ? READ_ACCESS : NO_ACCESS);
return result == WRITE_ACCESS && read_only ? READ_ACCESS : result;
}
/* Set the *_ACCESS members in REPOSITORY according to the settings in
* CFG. If READ_ONLY is set, unconditionally disable write access.
*/
static void
set_access(repository_t *repository,
svn_config_t *cfg,
svn_boolean_t read_only)
{
repository->auth_access = get_access(cfg, SVN_CONFIG_OPTION_AUTH_ACCESS,
"write", read_only);
repository->anon_access = get_access(cfg, SVN_CONFIG_OPTION_ANON_ACCESS,
"read", read_only);
}
/* Return the access level for the user in B.
*/
static enum access_type
current_access(server_baton_t *b)
{
return b->client_info->user ? b->repository->auth_access
: b->repository->anon_access;
}
/* Send authentication mechs for ACCESS_TYPE to the client. If NEEDS_USERNAME
is true, don't send anonymous mech even if that would give the desired
access. */
static svn_error_t *send_mechs(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
server_baton_t *b, enum access_type required,
svn_boolean_t needs_username)
{
if (!needs_username && b->repository->anon_access >= required)
SVN_ERR(svn_ra_svn__write_word(conn, pool, "ANONYMOUS"));
if (b->client_info->tunnel_user && b->repository->auth_access >= required)
SVN_ERR(svn_ra_svn__write_word(conn, pool, "EXTERNAL"));
if (b->repository->pwdb && b->repository->auth_access >= required)
SVN_ERR(svn_ra_svn__write_word(conn, pool, "CRAM-MD5"));
return SVN_NO_ERROR;
}
/* Context for cleanup handler. */
struct cleanup_fs_access_baton
{
svn_fs_t *fs;
apr_pool_t *pool;
};
/* Pool cleanup handler. Make sure fs's access_t points to NULL when
the command pool is destroyed. */
static apr_status_t cleanup_fs_access(void *data)
{
svn_error_t *serr;
struct cleanup_fs_access_baton *baton = data;
serr = svn_fs_set_access(baton->fs, NULL);
if (serr)
{
apr_status_t apr_err = serr->apr_err;
svn_error_clear(serr);
return apr_err;
}
return APR_SUCCESS;
}
/* Create an svn_fs_access_t in POOL for USER and associate it with
B's filesystem. Also, register a cleanup handler with POOL which
de-associates the svn_fs_access_t from B's filesystem. */
static svn_error_t *
create_fs_access(server_baton_t *b, apr_pool_t *pool)
{
svn_fs_access_t *fs_access;
struct cleanup_fs_access_baton *cleanup_baton;
if (!b->client_info->user)
return SVN_NO_ERROR;
SVN_ERR(svn_fs_create_access(&fs_access, b->client_info->user, pool));
SVN_ERR(svn_fs_set_access(b->repository->fs, fs_access));
cleanup_baton = apr_pcalloc(pool, sizeof(*cleanup_baton));
cleanup_baton->pool = pool;
cleanup_baton->fs = b->repository->fs;
apr_pool_cleanup_register(pool, cleanup_baton, cleanup_fs_access,
apr_pool_cleanup_null);
return SVN_NO_ERROR;
}
/* Authenticate, once the client has chosen a mechanism and possibly
* sent an initial mechanism token. On success, set *success to true
* and b->user to the authenticated username (or NULL for anonymous).
* On authentication failure, report failure to the client and set
* *success to FALSE. On communications failure, return an error.
* If NEEDS_USERNAME is TRUE, don't allow anonymous authentication. */
static svn_error_t *auth(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
const char *mech, const char *mecharg,
server_baton_t *b, enum access_type required,
svn_boolean_t needs_username,
svn_boolean_t *success)
{
const char *user;
*success = FALSE;
if (b->repository->auth_access >= required
&& b->client_info->tunnel_user && strcmp(mech, "EXTERNAL") == 0)
{
if (*mecharg && strcmp(mecharg, b->client_info->tunnel_user) != 0)
return svn_ra_svn__write_tuple(conn, pool, "w(c)", "failure",
"Requested username does not match");
b->client_info->user = b->client_info->tunnel_user;
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w()", "success"));
*success = TRUE;
return SVN_NO_ERROR;
}
if (b->repository->anon_access >= required
&& strcmp(mech, "ANONYMOUS") == 0 && ! needs_username)
{
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w()", "success"));
*success = TRUE;
return SVN_NO_ERROR;
}
if (b->repository->auth_access >= required
&& b->repository->pwdb && strcmp(mech, "CRAM-MD5") == 0)
{
SVN_ERR(svn_ra_svn_cram_server(conn, pool, b->repository->pwdb,
&user, success));
b->client_info->user = apr_pstrdup(b->pool, user);
return SVN_NO_ERROR;
}
return svn_ra_svn__write_tuple(conn, pool, "w(c)", "failure",
"Must authenticate with listed mechanism");
}
/* Perform an authentication request using the built-in SASL implementation. */
static svn_error_t *
internal_auth_request(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
server_baton_t *b, enum access_type required,
svn_boolean_t needs_username)
{
svn_boolean_t success;
const char *mech, *mecharg;
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
SVN_ERR(send_mechs(conn, pool, b, required, needs_username));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)c)", b->repository->realm));
do
{
SVN_ERR(svn_ra_svn__read_tuple(conn, pool, "w(?c)", &mech, &mecharg));
if (!*mech)
break;
SVN_ERR(auth(conn, pool, mech, mecharg, b, required, needs_username,
&success));
}
while (!success);
return SVN_NO_ERROR;
}
/* Perform an authentication request in order to get an access level of
* REQUIRED or higher. Since the client may escape the authentication
* exchange, the caller should check current_access(b) to see if
* authentication succeeded. */
static svn_error_t *auth_request(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
server_baton_t *b, enum access_type required,
svn_boolean_t needs_username)
{
#ifdef SVN_HAVE_SASL
if (b->repository->use_sasl)
return cyrus_auth_request(conn, pool, b, required, needs_username);
#endif
return internal_auth_request(conn, pool, b, required, needs_username);
}
/* Send a trivial auth notification on CONN which lists no mechanisms,
* indicating that authentication is unnecessary. Usually called in
* response to invocation of a svnserve command.
*/
static svn_error_t *trivial_auth_request(svn_ra_svn_conn_t *conn,
apr_pool_t *pool, server_baton_t *b)
{
return svn_ra_svn__write_cmd_response(conn, pool, "()c", "");
}
/* Ensure that the client has the REQUIRED access by checking the
* access directives (both blanket and per-directory) in BATON. If
* PATH is NULL, then only the blanket access configuration will
* impact the result.
*
* If NEEDS_USERNAME is TRUE, then a lookup is only successful if the
* user described in BATON is authenticated and, well, has a username
* assigned to him.
*
* Use POOL for temporary allocations only.
*/
static svn_boolean_t lookup_access(apr_pool_t *pool,
server_baton_t *baton,
svn_repos_authz_access_t required,
const char *path,
svn_boolean_t needs_username)
{
enum access_type req = (required & svn_authz_write) ?
WRITE_ACCESS : READ_ACCESS;
svn_boolean_t authorized;
svn_error_t *err;
/* Get authz's opinion on the access. */
err = authz_check_access(&authorized, path, required, baton, pool);
/* If an error made lookup fail, deny access. */
if (err)
{
log_error(err, baton);
svn_error_clear(err);
return FALSE;
}
/* If the required access is blanket-granted AND granted by authz
AND we already have a username if one is required, then the
lookup has succeeded. */
if (current_access(baton) >= req
&& authorized
&& (! needs_username || baton->client_info->user))
return TRUE;
return FALSE;
}
/* Check that the client has the REQUIRED access by consulting the
* authentication and authorization states stored in BATON. If the
* client does not have the required access credentials, attempt to
* authenticate the client to get that access, using CONN for
* communication.
*
* This function is supposed to be called to handle the authentication
* half of a standard svn protocol reply. If an error is returned, it
* probably means that the server can terminate the client connection
* with an apologetic error, as it implies an authentication failure.
*
* PATH and NEEDS_USERNAME are passed along to lookup_access, their
* behaviour is documented there.
*/
static svn_error_t *must_have_access(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
server_baton_t *b,
svn_repos_authz_access_t required,
const char *path,
svn_boolean_t needs_username)
{
enum access_type req = (required & svn_authz_write) ?
WRITE_ACCESS : READ_ACCESS;
/* See whether the user already has the required access. If so,
nothing needs to be done. Create the FS access and send a
trivial auth request. */
if (lookup_access(pool, b, required, path, needs_username))
{
SVN_ERR(create_fs_access(b, pool));
return trivial_auth_request(conn, pool, b);
}
/* If the required blanket access can be obtained by authenticating,
try that. Unfortunately, we can't tell until after
authentication whether authz will work or not. We force
requiring a username because we need one to be able to check
authz configuration again with a different user credentials than
the first time round. */
if (b->client_info->user == NULL
&& b->repository->auth_access >= req
&& (b->client_info->tunnel_user || b->repository->pwdb
|| b->repository->use_sasl))
SVN_ERR(auth_request(conn, pool, b, req, TRUE));
/* Now that an authentication has been done get the new take of
authz on the request. */
if (! lookup_access(pool, b, required, path, needs_username))
return svn_error_create(SVN_ERR_RA_SVN_CMD_ERR,
error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
NULL, NULL, b),
NULL);
/* Else, access is granted, and there is much rejoicing. */
SVN_ERR(create_fs_access(b, pool));
return SVN_NO_ERROR;
}
/* --- REPORTER COMMAND SET --- */
/* To allow for pipelining, reporter commands have no reponses. If we
* get an error, we ignore all subsequent reporter commands and return
* the error finish_report, to be handled by the calling command.
*/
static svn_error_t *set_path(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
report_driver_baton_t *b = baton;
const char *path, *lock_token, *depth_word;
svn_revnum_t rev;
/* Default to infinity, for old clients that don't send depth. */
svn_depth_t depth = svn_depth_infinity;
svn_boolean_t start_empty;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "crb?(?c)?w",
&path, &rev, &start_empty, &lock_token,
&depth_word));
if (depth_word)
depth = svn_depth_from_word(depth_word);
path = svn_relpath_canonicalize(path, pool);
if (b->from_rev && strcmp(path, "") == 0)
*b->from_rev = rev;
if (!b->err)
b->err = svn_repos_set_path3(b->report_baton, path, rev, depth,
start_empty, lock_token, pool);
b->entry_counter++;
if (!start_empty)
b->only_empty_entries = FALSE;
return SVN_NO_ERROR;
}
static svn_error_t *delete_path(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
report_driver_baton_t *b = baton;
const char *path;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &path));
path = svn_relpath_canonicalize(path, pool);
if (!b->err)
b->err = svn_repos_delete_path(b->report_baton, path, pool);
return SVN_NO_ERROR;
}
static svn_error_t *link_path(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
report_driver_baton_t *b = baton;
const char *path, *url, *lock_token, *fs_path, *depth_word;
svn_revnum_t rev;
svn_boolean_t start_empty;
/* Default to infinity, for old clients that don't send depth. */
svn_depth_t depth = svn_depth_infinity;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "ccrb?(?c)?w",
&path, &url, &rev, &start_empty,
&lock_token, &depth_word));
/* ### WHAT?! The link path is an absolute URL?! Didn't see that
coming... -- cmpilato */
path = svn_relpath_canonicalize(path, pool);
url = svn_uri_canonicalize(url, pool);
if (depth_word)
depth = svn_depth_from_word(depth_word);
if (!b->err)
b->err = get_fs_path(svn_path_uri_decode(b->repos_url, pool),
svn_path_uri_decode(url, pool),
&fs_path);
if (!b->err)
b->err = svn_repos_link_path3(b->report_baton, path, fs_path, rev,
depth, start_empty, lock_token, pool);
b->entry_counter++;
return SVN_NO_ERROR;
}
static svn_error_t *finish_report(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
report_driver_baton_t *b = baton;
/* No arguments to parse. */
SVN_ERR(trivial_auth_request(conn, pool, b->sb));
if (!b->err)
b->err = svn_repos_finish_report(b->report_baton, pool);
return SVN_NO_ERROR;
}
static svn_error_t *abort_report(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
report_driver_baton_t *b = baton;
/* No arguments to parse. */
svn_error_clear(svn_repos_abort_report(b->report_baton, pool));
return SVN_NO_ERROR;
}
static const svn_ra_svn_cmd_entry_t report_commands[] = {
{ "set-path", set_path },
{ "delete-path", delete_path },
{ "link-path", link_path },
{ "finish-report", finish_report, TRUE },
{ "abort-report", abort_report, TRUE },
{ NULL }
};
/* Accept a report from the client, drive the network editor with the
* result, and then write an empty command response. If there is a
* non-protocol failure, accept_report will abort the edit and return
* a command error to be reported by handle_commands().
*
* If only_empty_entry is not NULL and the report contains only one
* item, and that item is empty, set *only_empty_entry to TRUE, else
* set it to FALSE.
*
* If from_rev is not NULL, set *from_rev to the revision number from
* the set-path on ""; if somehow set-path "" never happens, set
* *from_rev to SVN_INVALID_REVNUM.
*/
static svn_error_t *accept_report(svn_boolean_t *only_empty_entry,
svn_revnum_t *from_rev,
svn_ra_svn_conn_t *conn, apr_pool_t *pool,
server_baton_t *b, svn_revnum_t rev,
const char *target, const char *tgt_path,
svn_boolean_t text_deltas,
svn_depth_t depth,
svn_boolean_t send_copyfrom_args,
svn_boolean_t ignore_ancestry)
{
const svn_delta_editor_t *editor;
void *edit_baton, *report_baton;
report_driver_baton_t rb;
svn_error_t *err;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
/* Make an svn_repos report baton. Tell it to drive the network editor
* when the report is complete. */
svn_ra_svn_get_editor(&editor, &edit_baton, conn, pool, NULL, NULL);
SVN_CMD_ERR(svn_repos_begin_report3(&report_baton, rev,
b->repository->repos,
b->repository->fs_path->data, target,
tgt_path, text_deltas, depth,
ignore_ancestry, send_copyfrom_args,
editor, edit_baton,
authz_check_access_cb_func(b),
&ab, svn_ra_svn_zero_copy_limit(conn),
pool));
rb.sb = b;
rb.repos_url = svn_path_uri_decode(b->repository->repos_url, pool);
rb.report_baton = report_baton;
rb.err = NULL;
rb.entry_counter = 0;
rb.only_empty_entries = TRUE;
rb.from_rev = from_rev;
if (from_rev)
*from_rev = SVN_INVALID_REVNUM;
err = svn_ra_svn__handle_commands2(conn, pool, report_commands, &rb, TRUE);
if (err)
{
/* Network or protocol error while handling commands. */
svn_error_clear(rb.err);
return err;
}
else if (rb.err)
{
/* Some failure during the reporting or editing operations. */
SVN_CMD_ERR(rb.err);
}
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
if (only_empty_entry)
*only_empty_entry = rb.entry_counter == 1 && rb.only_empty_entries;
return SVN_NO_ERROR;
}
/* --- MAIN COMMAND SET --- */
/* Write out a list of property diffs. PROPDIFFS is an array of svn_prop_t
* values. */
static svn_error_t *write_prop_diffs(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const apr_array_header_t *propdiffs)
{
int i;
for (i = 0; i < propdiffs->nelts; ++i)
{
const svn_prop_t *prop = &APR_ARRAY_IDX(propdiffs, i, svn_prop_t);
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "c(?s)",
prop->name, prop->value));
}
return SVN_NO_ERROR;
}
/* Write out a lock to the client. */
static svn_error_t *write_lock(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const svn_lock_t *lock)
{
const char *cdate, *edate;
cdate = svn_time_to_cstring(lock->creation_date, pool);
edate = lock->expiration_date
? svn_time_to_cstring(lock->expiration_date, pool) : NULL;
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "ccc(?c)c(?c)", lock->path,
lock->token, lock->owner, lock->comment,
cdate, edate));
return SVN_NO_ERROR;
}
/* ### This really belongs in libsvn_repos. */
/* Get the explicit properties and/or inherited properties for a PATH in
ROOT, with hardcoded committed-info values. */
static svn_error_t *
get_props(apr_hash_t **props,
apr_array_header_t **iprops,
authz_baton_t *b,
svn_fs_root_t *root,
const char *path,
apr_pool_t *pool)
{
/* Get the explicit properties. */
if (props)
{
svn_string_t *str;
svn_revnum_t crev;
const char *cdate, *cauthor, *uuid;
SVN_ERR(svn_fs_node_proplist(props, root, path, pool));
/* Hardcode the values for the committed revision, date, and author. */
SVN_ERR(svn_repos_get_committed_info(&crev, &cdate, &cauthor, root,
path, pool));
str = svn_string_createf(pool, "%ld", crev);
svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_REV, str);
str = (cdate) ? svn_string_create(cdate, pool) : NULL;
svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_DATE, str);
str = (cauthor) ? svn_string_create(cauthor, pool) : NULL;
svn_hash_sets(*props, SVN_PROP_ENTRY_LAST_AUTHOR, str);
/* Hardcode the values for the UUID. */
SVN_ERR(svn_fs_get_uuid(svn_fs_root_fs(root), &uuid, pool));
str = (uuid) ? svn_string_create(uuid, pool) : NULL;
svn_hash_sets(*props, SVN_PROP_ENTRY_UUID, str);
}
/* Get any inherited properties the user is authorized to. */
if (iprops)
{
SVN_ERR(svn_repos_fs_get_inherited_props(
iprops, root, path, NULL,
authz_check_access_cb_func(b->server),
b, pool, pool));
}
return SVN_NO_ERROR;
}
/* Set BATON->FS_PATH for the repository URL found in PARAMS. */
static svn_error_t *reparent(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *url;
const char *fs_path;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &url));
url = svn_uri_canonicalize(url, pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repository->repos_url, pool),
svn_path_uri_decode(url, pool),
&fs_path));
SVN_ERR(log_command(b, conn, pool, "%s", svn_log__reparent(fs_path, pool)));
svn_stringbuf_set(b->repository->fs_path, fs_path);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *get_latest_rev(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
SVN_ERR(log_command(b, conn, pool, "get-latest-rev"));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "r", rev));
return SVN_NO_ERROR;
}
static svn_error_t *get_dated_rev(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
apr_time_t tm;
const char *timestr;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &timestr));
SVN_ERR(log_command(b, conn, pool, "get-dated-rev %s", timestr));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(svn_time_from_cstring(&tm, timestr, pool));
SVN_CMD_ERR(svn_repos_dated_revision(&rev, b->repository->repos, tm, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "r", rev));
return SVN_NO_ERROR;
}
/* Common logic for change_rev_prop() and change_rev_prop2(). */
static svn_error_t *do_change_rev_prop(svn_ra_svn_conn_t *conn,
server_baton_t *b,
svn_revnum_t rev,
const char *name,
const svn_string_t *const *old_value_p,
const svn_string_t *value,
apr_pool_t *pool)
{
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write, NULL, FALSE));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__change_rev_prop(rev, name, pool)));
SVN_CMD_ERR(svn_repos_fs_change_rev_prop4(b->repository->repos, rev,
b->client_info->user,
name, old_value_p, value,
TRUE, TRUE,
authz_check_access_cb_func(b), &ab,
pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *change_rev_prop2(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *name;
svn_string_t *value;
const svn_string_t *const *old_value_p;
svn_string_t *old_value;
svn_boolean_t dont_care;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "rc(?s)(b?s)",
&rev, &name, &value,
&dont_care, &old_value));
/* Argument parsing. */
if (dont_care)
old_value_p = NULL;
else
old_value_p = (const svn_string_t *const *)&old_value;
/* Input validation. */
if (dont_care && old_value)
{
svn_error_t *err;
err = svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
"'previous-value' and 'dont-care' cannot both be "
"set in 'change-rev-prop2' request");
return log_fail_and_flush(err, b, conn, pool);
}
/* Do it. */
SVN_ERR(do_change_rev_prop(conn, b, rev, name, old_value_p, value, pool));
return SVN_NO_ERROR;
}
static svn_error_t *change_rev_prop(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *name;
svn_string_t *value;
/* Because the revprop value was at one time mandatory, the usual
optional element pattern "(?s)" isn't used. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "rc?s", &rev, &name, &value));
SVN_ERR(do_change_rev_prop(conn, b, rev, name, NULL, value, pool));
return SVN_NO_ERROR;
}
static svn_error_t *rev_proplist(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
apr_hash_t *props;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "r", &rev));
SVN_ERR(log_command(b, conn, pool, "%s", svn_log__rev_proplist(rev, pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(svn_repos_fs_revision_proplist(&props, b->repository->repos,
rev,
authz_check_access_cb_func(b),
&ab, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
SVN_ERR(svn_ra_svn__write_proplist(conn, pool, props));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
return SVN_NO_ERROR;
}
static svn_error_t *rev_prop(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *name;
svn_string_t *value;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "rc", &rev, &name));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__rev_prop(rev, name, pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(svn_repos_fs_revision_prop(&value, b->repository->repos, rev,
name, authz_check_access_cb_func(b),
&ab, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "(?s)", value));
return SVN_NO_ERROR;
}
static svn_error_t *commit_done(const svn_commit_info_t *commit_info,
void *baton, apr_pool_t *pool)
{
commit_callback_baton_t *ccb = baton;
*ccb->new_rev = commit_info->revision;
*ccb->date = commit_info->date
? apr_pstrdup(ccb->pool, commit_info->date): NULL;
*ccb->author = commit_info->author
? apr_pstrdup(ccb->pool, commit_info->author) : NULL;
*ccb->post_commit_err = commit_info->post_commit_err
? apr_pstrdup(ccb->pool, commit_info->post_commit_err) : NULL;
return SVN_NO_ERROR;
}
/* Add the LOCK_TOKENS (if any) to the filesystem access context,
* checking path authorizations using the state in SB as we go.
* LOCK_TOKENS is an array of svn_ra_svn_item_t structs. Return a
* client error if LOCK_TOKENS is not a list of lists. If a lock
* violates the authz configuration, return SVN_ERR_RA_NOT_AUTHORIZED
* to the client. Use POOL for temporary allocations only.
*/
static svn_error_t *add_lock_tokens(const apr_array_header_t *lock_tokens,
server_baton_t *sb,
apr_pool_t *pool)
{
int i;
svn_fs_access_t *fs_access;
SVN_ERR(svn_fs_get_access(&fs_access, sb->repository->fs));
/* If there is no access context, nowhere to add the tokens. */
if (! fs_access)
return SVN_NO_ERROR;
for (i = 0; i < lock_tokens->nelts; ++i)
{
const char *path, *token, *full_path;
svn_ra_svn_item_t *path_item, *token_item;
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(lock_tokens, i,
svn_ra_svn_item_t);
if (item->kind != SVN_RA_SVN_LIST)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Lock tokens aren't a list of lists");
path_item = &APR_ARRAY_IDX(item->u.list, 0, svn_ra_svn_item_t);
if (path_item->kind != SVN_RA_SVN_STRING)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Lock path isn't a string");
token_item = &APR_ARRAY_IDX(item->u.list, 1, svn_ra_svn_item_t);
if (token_item->kind != SVN_RA_SVN_STRING)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Lock token isn't a string");
path = path_item->u.string->data;
full_path = svn_fspath__join(sb->repository->fs_path->data,
svn_relpath_canonicalize(path, pool),
pool);
if (! lookup_access(pool, sb, svn_authz_write, full_path, TRUE))
return error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL, NULL,
sb);
token = token_item->u.string->data;
SVN_ERR(svn_fs_access_add_lock_token2(fs_access, path, token));
}
return SVN_NO_ERROR;
}
/* Implements svn_fs_lock_callback_t. */
static svn_error_t *
lock_cb(void *baton,
const char *path,
const svn_lock_t *lock,
svn_error_t *fs_err,
apr_pool_t *pool)
{
server_baton_t *sb = baton;
log_error(fs_err, sb);
return SVN_NO_ERROR;
}
/* Unlock the paths with lock tokens in LOCK_TOKENS, ignoring any errors.
LOCK_TOKENS contains svn_ra_svn_item_t elements, assumed to be lists. */
static svn_error_t *unlock_paths(const apr_array_header_t *lock_tokens,
server_baton_t *sb,
apr_pool_t *pool)
{
int i;
apr_pool_t *subpool = svn_pool_create(pool);
apr_hash_t *targets = apr_hash_make(subpool);
svn_error_t *err;
for (i = 0; i < lock_tokens->nelts; ++i)
{
svn_ra_svn_item_t *item, *path_item, *token_item;
const char *path, *token, *full_path;
item = &APR_ARRAY_IDX(lock_tokens, i, svn_ra_svn_item_t);
path_item = &APR_ARRAY_IDX(item->u.list, 0, svn_ra_svn_item_t);
token_item = &APR_ARRAY_IDX(item->u.list, 1, svn_ra_svn_item_t);
path = path_item->u.string->data;
full_path = svn_fspath__join(sb->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
subpool);
token = token_item->u.string->data;
svn_hash_sets(targets, full_path, token);
}
/* The lock may have become defunct after the commit, so ignore such
errors. */
err = svn_repos_fs_unlock_many(sb->repository->repos, targets, FALSE,
lock_cb, sb, subpool, subpool);
log_error(err, sb);
svn_error_clear(err);
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
static svn_error_t *commit(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *log_msg,
*date = NULL,
*author = NULL,
*post_commit_err = NULL;
apr_array_header_t *lock_tokens;
svn_boolean_t keep_locks;
apr_array_header_t *revprop_list;
apr_hash_t *revprop_table;
const svn_delta_editor_t *editor;
void *edit_baton;
svn_boolean_t aborted;
commit_callback_baton_t ccb;
svn_revnum_t new_rev;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
if (params->nelts == 1)
{
/* Clients before 1.2 don't send lock-tokens, keep-locks,
and rev-props fields. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &log_msg));
lock_tokens = NULL;
keep_locks = TRUE;
revprop_list = NULL;
}
else
{
/* Clients before 1.5 don't send the rev-props field. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "clb?l", &log_msg,
&lock_tokens, &keep_locks,
&revprop_list));
}
/* The handling for locks is a little problematic, because the
protocol won't let us send several auth requests once one has
succeeded. So we request write access and a username before
adding tokens (if we have any), and subsequently fail if a lock
violates authz. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
NULL,
(lock_tokens && lock_tokens->nelts)));
/* Authorize the lock tokens and give them to the FS if we got
any. */
if (lock_tokens && lock_tokens->nelts)
SVN_CMD_ERR(add_lock_tokens(lock_tokens, b, pool));
/* Ignore LOG_MSG, per the protocol. See ra_svn_commit(). */
if (revprop_list)
SVN_ERR(svn_ra_svn__parse_proplist(revprop_list, pool, &revprop_table));
else
{
revprop_table = apr_hash_make(pool);
svn_hash_sets(revprop_table, SVN_PROP_REVISION_LOG,
svn_string_create(log_msg, pool));
}
/* Get author from the baton, making sure clients can't circumvent
the authentication via the revision props. */
svn_hash_sets(revprop_table, SVN_PROP_REVISION_AUTHOR,
b->client_info->user
? svn_string_create(b->client_info->user, pool)
: NULL);
ccb.pool = pool;
ccb.new_rev = &new_rev;
ccb.date = &date;
ccb.author = &author;
ccb.post_commit_err = &post_commit_err;
/* ### Note that svn_repos_get_commit_editor5 actually wants a decoded URL. */
SVN_CMD_ERR(svn_repos_get_commit_editor5
(&editor, &edit_baton, b->repository->repos, NULL,
svn_path_uri_decode(b->repository->repos_url, pool),
b->repository->fs_path->data, revprop_table,
commit_done, &ccb,
authz_commit_cb, &ab, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
SVN_ERR(svn_ra_svn_drive_editor2(conn, pool, editor, edit_baton,
&aborted, FALSE));
if (!aborted)
{
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__commit(new_rev, pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
/* In tunnel mode, deltify before answering the client, because
answering may cause the client to terminate the connection
and thus kill the server. But otherwise, deltify after
answering the client, to avoid user-visible delay. */
if (b->client_info->tunnel)
SVN_ERR(svn_fs_deltify_revision(b->repository->fs, new_rev, pool));
/* Unlock the paths. */
if (! keep_locks && lock_tokens && lock_tokens->nelts)
SVN_ERR(unlock_paths(lock_tokens, b, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "r(?c)(?c)(?c)",
new_rev, date, author, post_commit_err));
if (! b->client_info->tunnel)
SVN_ERR(svn_fs_deltify_revision(b->repository->fs, new_rev, pool));
}
return SVN_NO_ERROR;
}
static svn_error_t *get_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *path, *full_path, *hex_digest;
svn_revnum_t rev;
svn_fs_root_t *root;
svn_stream_t *contents;
apr_hash_t *props = NULL;
apr_array_header_t *inherited_props;
svn_string_t write_str;
char buf[4096];
apr_size_t len;
svn_boolean_t want_props, want_contents;
apr_uint64_t wants_inherited_props;
svn_checksum_t *checksum;
svn_error_t *err, *write_err;
int i;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
/* Parse arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)bb?B", &path, &rev,
&want_props, &want_contents,
&wants_inherited_props));
if (wants_inherited_props == SVN_RA_SVN_UNSPECIFIED_NUMBER)
wants_inherited_props = FALSE;
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_file(full_path, rev,
want_contents, want_props, pool)));
/* Fetch the properties and a stream for the contents. */
SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
SVN_CMD_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, root,
full_path, TRUE, pool));
hex_digest = svn_checksum_to_cstring_display(checksum, pool);
/* Fetch the file's explicit and/or inherited properties if
requested. Although the wants-iprops boolean was added to the
protocol in 1.8 a standard 1.8 client never requests iprops. */
if (want_props || wants_inherited_props)
SVN_CMD_ERR(get_props(want_props ? &props : NULL,
wants_inherited_props ? &inherited_props : NULL,
&ab, root, full_path,
pool));
if (want_contents)
SVN_CMD_ERR(svn_fs_file_contents(&contents, root, full_path, pool));
/* Send successful command response with revision and props. */
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((?c)r(!", "success",
hex_digest, rev));
SVN_ERR(svn_ra_svn__write_proplist(conn, pool, props));
if (wants_inherited_props)
{
apr_pool_t *iterpool = svn_pool_create(pool);
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)(?!"));
for (i = 0; i < inherited_props->nelts; i++)
{
svn_prop_inherited_item_t *iprop =
APR_ARRAY_IDX(inherited_props, i, svn_prop_inherited_item_t *);
svn_pool_clear(iterpool);
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!(c(!",
iprop->path_or_url));
SVN_ERR(svn_ra_svn__write_proplist(conn, iterpool, iprop->prop_hash));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!))!",
iprop->path_or_url));
}
svn_pool_destroy(iterpool);
}
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
/* Now send the file's contents. */
if (want_contents)
{
err = SVN_NO_ERROR;
while (1)
{
len = sizeof(buf);
err = svn_stream_read_full(contents, buf, &len);
if (err)
break;
if (len > 0)
{
write_str.data = buf;
write_str.len = len;
SVN_ERR(svn_ra_svn__write_string(conn, pool, &write_str));
}
if (len < sizeof(buf))
{
err = svn_stream_close(contents);
break;
}
}
write_err = svn_ra_svn__write_cstring(conn, pool, "");
if (write_err)
{
svn_error_clear(err);
return write_err;
}
SVN_CMD_ERR(err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
}
return SVN_NO_ERROR;
}
static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *path, *full_path;
svn_revnum_t rev;
apr_hash_t *entries, *props = NULL;
apr_array_header_t *inherited_props;
apr_hash_index_t *hi;
svn_fs_root_t *root;
apr_pool_t *subpool;
svn_boolean_t want_props, want_contents;
apr_uint64_t wants_inherited_props;
apr_uint64_t dirent_fields;
apr_array_header_t *dirent_fields_list = NULL;
svn_ra_svn_item_t *elt;
int i;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)bb?l?B", &path, &rev,
&want_props, &want_contents,
&dirent_fields_list,
&wants_inherited_props));
if (wants_inherited_props == SVN_RA_SVN_UNSPECIFIED_NUMBER)
wants_inherited_props = FALSE;
if (! dirent_fields_list)
{
dirent_fields = SVN_DIRENT_ALL;
}
else
{
dirent_fields = 0;
for (i = 0; i < dirent_fields_list->nelts; ++i)
{
elt = &APR_ARRAY_IDX(dirent_fields_list, i, svn_ra_svn_item_t);
if (elt->kind != SVN_RA_SVN_WORD)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Dirent field not a string");
if (strcmp(SVN_RA_SVN_DIRENT_KIND, elt->u.word) == 0)
dirent_fields |= SVN_DIRENT_KIND;
else if (strcmp(SVN_RA_SVN_DIRENT_SIZE, elt->u.word) == 0)
dirent_fields |= SVN_DIRENT_SIZE;
else if (strcmp(SVN_RA_SVN_DIRENT_HAS_PROPS, elt->u.word) == 0)
dirent_fields |= SVN_DIRENT_HAS_PROPS;
else if (strcmp(SVN_RA_SVN_DIRENT_CREATED_REV, elt->u.word) == 0)
dirent_fields |= SVN_DIRENT_CREATED_REV;
else if (strcmp(SVN_RA_SVN_DIRENT_TIME, elt->u.word) == 0)
dirent_fields |= SVN_DIRENT_TIME;
else if (strcmp(SVN_RA_SVN_DIRENT_LAST_AUTHOR, elt->u.word) == 0)
dirent_fields |= SVN_DIRENT_LAST_AUTHOR;
}
}
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_dir(full_path, rev,
want_contents, want_props,
dirent_fields, pool)));
/* Fetch the root of the appropriate revision. */
SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
/* Fetch the directory's explicit and/or inherited properties if
requested. Although the wants-iprops boolean was added to the
protocol in 1.8 a standard 1.8 client never requests iprops. */
if (want_props || wants_inherited_props)
SVN_CMD_ERR(get_props(want_props ? &props : NULL,
wants_inherited_props ? &inherited_props : NULL,
&ab, root, full_path,
pool));
/* Fetch the directories' entries before starting the response, to allow
proper error handling in cases like when FULL_PATH doesn't exist */
if (want_contents)
SVN_CMD_ERR(svn_fs_dir_entries(&entries, root, full_path, pool));
/* Begin response ... */
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(r(!", "success", rev));
SVN_ERR(svn_ra_svn__write_proplist(conn, pool, props));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)(!"));
/* Fetch the directory entries if requested and send them immediately. */
if (want_contents)
{
/* Use epoch for a placeholder for a missing date. */
const char *missing_date = svn_time_to_cstring(0, pool);
/* Transform the hash table's FS entries into dirents. This probably
* belongs in libsvn_repos. */
subpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
{
const char *name = apr_hash_this_key(hi);
svn_fs_dirent_t *fsent = apr_hash_this_val(hi);
const char *file_path;
/* The fields in the entry tuple. */
svn_node_kind_t entry_kind = svn_node_none;
svn_filesize_t entry_size = 0;
svn_boolean_t has_props = FALSE;
/* If 'created rev' was not requested, send 0. We can't use
* SVN_INVALID_REVNUM as the tuple field is not optional.
* See the email thread on dev@, 2012-03-28, subject
* "buildbot failure in ASF Buildbot on svn-slik-w2k3-x64-ra",
* <http://svn.haxx.se/dev/archive-2012-03/0655.shtml>. */
svn_revnum_t created_rev = 0;
const char *cdate = NULL;
const char *last_author = NULL;
svn_pool_clear(subpool);
file_path = svn_fspath__join(full_path, name, subpool);
if (! lookup_access(subpool, b, svn_authz_read, file_path, FALSE))
continue;
if (dirent_fields & SVN_DIRENT_KIND)
entry_kind = fsent->kind;
if (dirent_fields & SVN_DIRENT_SIZE)
if (entry_kind != svn_node_dir)
SVN_CMD_ERR(svn_fs_file_length(&entry_size, root, file_path,
subpool));
if (dirent_fields & SVN_DIRENT_HAS_PROPS)
{
/* has_props */
SVN_CMD_ERR(svn_fs_node_has_props(&has_props, root, file_path,
subpool));
}
if ((dirent_fields & SVN_DIRENT_LAST_AUTHOR)
|| (dirent_fields & SVN_DIRENT_TIME)
|| (dirent_fields & SVN_DIRENT_CREATED_REV))
{
/* created_rev, last_author, time */
SVN_CMD_ERR(svn_repos_get_committed_info(&created_rev,
&cdate,
&last_author,
root,
file_path,
subpool));
}
/* The client does not properly handle a missing CDATE. For
interoperability purposes, we must fill in some junk.
See libsvn_ra_svn/client.c:ra_svn_get_dir() */
if (cdate == NULL)
cdate = missing_date;
/* Send the entry. */
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "cwnbr(?c)(?c)", name,
svn_node_kind_to_word(entry_kind),
(apr_uint64_t) entry_size,
has_props, created_rev,
cdate, last_author));
}
svn_pool_destroy(subpool);
}
if (wants_inherited_props)
{
apr_pool_t *iterpool = svn_pool_create(pool);
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)(?!"));
for (i = 0; i < inherited_props->nelts; i++)
{
svn_prop_inherited_item_t *iprop =
APR_ARRAY_IDX(inherited_props, i, svn_prop_inherited_item_t *);
svn_pool_clear(iterpool);
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!(c(!",
iprop->path_or_url));
SVN_ERR(svn_ra_svn__write_proplist(conn, iterpool, iprop->prop_hash));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!))!",
iprop->path_or_url));
}
svn_pool_destroy(iterpool);
}
/* Finish response. */
return svn_ra_svn__write_tuple(conn, pool, "!))");
}
static svn_error_t *update(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *target, *full_path, *depth_word;
svn_boolean_t recurse;
svn_tristate_t send_copyfrom_args; /* Optional; default FALSE */
svn_tristate_t ignore_ancestry; /* Optional; default FALSE */
/* Default to unknown. Old clients won't send depth, but we'll
handle that by converting recurse if necessary. */
svn_depth_t depth = svn_depth_unknown;
svn_boolean_t is_checkout;
/* Parse the arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cb?w3?3", &rev, &target,
&recurse, &depth_word,
&send_copyfrom_args, &ignore_ancestry));
target = svn_relpath_canonicalize(target, pool);
if (depth_word)
depth = svn_depth_from_word(depth_word);
else
depth = SVN_DEPTH_INFINITY_OR_FILES(recurse);
full_path = svn_fspath__join(b->repository->fs_path->data, target, pool);
/* Check authorization and authenticate the user if necessary. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read, full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(accept_report(&is_checkout, NULL,
conn, pool, b, rev, target, NULL, TRUE,
depth,
(send_copyfrom_args == svn_tristate_true),
(ignore_ancestry == svn_tristate_true)));
if (is_checkout)
{
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__checkout(full_path, rev,
depth, pool)));
}
else
{
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__update(full_path, rev, depth,
(send_copyfrom_args
== svn_tristate_true),
pool)));
}
return SVN_NO_ERROR;
}
static svn_error_t *switch_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *target, *depth_word;
const char *switch_url, *switch_path;
svn_boolean_t recurse;
/* Default to unknown. Old clients won't send depth, but we'll
handle that by converting recurse if necessary. */
svn_depth_t depth = svn_depth_unknown;
svn_tristate_t send_copyfrom_args; /* Optional; default FALSE */
svn_tristate_t ignore_ancestry; /* Optional; default TRUE */
/* Parse the arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cbc?w?33", &rev, &target,
&recurse, &switch_url, &depth_word,
&send_copyfrom_args, &ignore_ancestry));
target = svn_relpath_canonicalize(target, pool);
switch_url = svn_uri_canonicalize(switch_url, pool);
if (depth_word)
depth = svn_depth_from_word(depth_word);
else
depth = SVN_DEPTH_INFINITY_OR_FILES(recurse);
SVN_ERR(trivial_auth_request(conn, pool, b));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repository->repos_url,
pool),
svn_path_uri_decode(switch_url, pool),
&switch_path));
{
const char *full_path = svn_fspath__join(b->repository->fs_path->data,
target, pool);
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__switch(full_path, switch_path, rev,
depth, pool)));
}
return accept_report(NULL, NULL,
conn, pool, b, rev, target, switch_path, TRUE,
depth,
(send_copyfrom_args == svn_tristate_true),
(ignore_ancestry != svn_tristate_false));
}
static svn_error_t *status(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *target, *depth_word;
svn_boolean_t recurse;
/* Default to unknown. Old clients won't send depth, but we'll
handle that by converting recurse if necessary. */
svn_depth_t depth = svn_depth_unknown;
/* Parse the arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cb?(?r)?w",
&target, &recurse, &rev, &depth_word));
target = svn_relpath_canonicalize(target, pool);
if (depth_word)
depth = svn_depth_from_word(depth_word);
else
depth = SVN_DEPTH_INFINITY_OR_EMPTY(recurse);
SVN_ERR(trivial_auth_request(conn, pool, b));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
{
const char *full_path = svn_fspath__join(b->repository->fs_path->data,
target, pool);
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__status(full_path, rev, depth, pool)));
}
return accept_report(NULL, NULL, conn, pool, b, rev, target, NULL, FALSE,
depth, FALSE, FALSE);
}
static svn_error_t *diff(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *target, *versus_url, *versus_path, *depth_word;
svn_boolean_t recurse, ignore_ancestry;
svn_boolean_t text_deltas;
/* Default to unknown. Old clients won't send depth, but we'll
handle that by converting recurse if necessary. */
svn_depth_t depth = svn_depth_unknown;
/* Parse the arguments. */
if (params->nelts == 5)
{
/* Clients before 1.4 don't send the text_deltas boolean or depth. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cbbc", &rev, &target,
&recurse, &ignore_ancestry, &versus_url));
text_deltas = TRUE;
depth_word = NULL;
}
else
{
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cbbcb?w",
&rev, &target, &recurse,
&ignore_ancestry, &versus_url,
&text_deltas, &depth_word));
}
target = svn_relpath_canonicalize(target, pool);
versus_url = svn_uri_canonicalize(versus_url, pool);
if (depth_word)
depth = svn_depth_from_word(depth_word);
else
depth = SVN_DEPTH_INFINITY_OR_FILES(recurse);
SVN_ERR(trivial_auth_request(conn, pool, b));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repository->repos_url,
pool),
svn_path_uri_decode(versus_url, pool),
&versus_path));
{
const char *full_path = svn_fspath__join(b->repository->fs_path->data,
target, pool);
svn_revnum_t from_rev;
SVN_ERR(accept_report(NULL, &from_rev,
conn, pool, b, rev, target, versus_path,
text_deltas, depth, FALSE, ignore_ancestry));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__diff(full_path, from_rev, versus_path,
rev, depth, ignore_ancestry,
pool)));
}
return SVN_NO_ERROR;
}
/* Regardless of whether a client's capabilities indicate an
understanding of this command (by way of SVN_RA_SVN_CAP_MERGEINFO),
we provide a response.
ASSUMPTION: When performing a 'merge' with two URLs at different
revisions, the client will call this command more than once. */
static svn_error_t *get_mergeinfo(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
apr_array_header_t *paths, *canonical_paths;
svn_mergeinfo_catalog_t mergeinfo;
int i;
apr_hash_index_t *hi;
const char *inherit_word;
svn_mergeinfo_inheritance_t inherit;
svn_boolean_t include_descendants;
apr_pool_t *iterpool;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "l(?r)wb", &paths, &rev,
&inherit_word, &include_descendants));
inherit = svn_inheritance_from_word(inherit_word);
/* Canonicalize the paths which mergeinfo has been requested for. */
canonical_paths = apr_array_make(pool, paths->nelts, sizeof(const char *));
for (i = 0; i < paths->nelts; i++)
{
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(paths, i, svn_ra_svn_item_t);
const char *full_path;
if (item->kind != SVN_RA_SVN_STRING)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Path is not a string"));
full_path = svn_relpath_canonicalize(item->u.string->data, pool);
full_path = svn_fspath__join(b->repository->fs_path->data, full_path, pool);
APR_ARRAY_PUSH(canonical_paths, const char *) = full_path;
}
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_mergeinfo(canonical_paths, inherit,
include_descendants,
pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(svn_repos_fs_get_mergeinfo(&mergeinfo, b->repository->repos,
canonical_paths, rev,
inherit,
include_descendants,
authz_check_access_cb_func(b), &ab,
pool));
SVN_ERR(svn_mergeinfo__remove_prefix_from_catalog(&mergeinfo, mergeinfo,
b->repository->fs_path->data, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
const char *key = apr_hash_this_key(hi);
svn_mergeinfo_t value = apr_hash_this_val(hi);
svn_string_t *mergeinfo_string;
svn_pool_clear(iterpool);
SVN_ERR(svn_mergeinfo_to_string(&mergeinfo_string, value, iterpool));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "cs", key,
mergeinfo_string));
}
svn_pool_destroy(iterpool);
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
return SVN_NO_ERROR;
}
/* Send a log entry to the client. */
static svn_error_t *log_receiver(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
log_baton_t *b = baton;
svn_ra_svn_conn_t *conn = b->conn;
apr_hash_index_t *h;
svn_boolean_t invalid_revnum = FALSE;
const svn_string_t *author, *date, *message;
unsigned revprop_count;
if (log_entry->revision == SVN_INVALID_REVNUM)
{
/* If the stack depth is zero, we've seen the last revision, so don't
send it, just return. */
if (b->stack_depth == 0)
return SVN_NO_ERROR;
/* Because the svn protocol won't let us send an invalid revnum, we have
to fudge here and send an additional flag. */
log_entry->revision = 0;
invalid_revnum = TRUE;
b->stack_depth--;
}
svn_compat_log_revprops_out_string(&author, &date, &message,
log_entry->revprops);
svn_compat_log_revprops_clear(log_entry->revprops);
if (log_entry->revprops)
revprop_count = apr_hash_count(log_entry->revprops);
else
revprop_count = 0;
/* send LOG_ENTRY */
SVN_ERR(svn_ra_svn__start_list(conn, pool));
/* send LOG_ENTRY->CHANGED_PATHS2 */
SVN_ERR(svn_ra_svn__start_list(conn, pool));
if (log_entry->changed_paths2)
{
for (h = apr_hash_first(pool, log_entry->changed_paths2); h;
h = apr_hash_next(h))
{
const char *path = apr_hash_this_key(h);
svn_log_changed_path2_t *change = apr_hash_this_val(h);
SVN_ERR(svn_ra_svn__write_data_log_changed_path(
conn, pool,
path,
change->action,
change->copyfrom_path,
change->copyfrom_rev,
change->node_kind,
/* text_modified and props_modified are never unknown */
change->text_modified == svn_tristate_true,
change->props_modified == svn_tristate_true));
}
}
SVN_ERR(svn_ra_svn__end_list(conn, pool));
/* send LOG_ENTRY main members */
SVN_ERR(svn_ra_svn__write_data_log_entry(conn, pool,
log_entry->revision,
author, date, message,
log_entry->has_children,
invalid_revnum, revprop_count));
/* send LOG_ENTRY->REVPROPS */
SVN_ERR(svn_ra_svn__start_list(conn, pool));
if (revprop_count)
SVN_ERR(svn_ra_svn__write_proplist(conn, pool, log_entry->revprops));
SVN_ERR(svn_ra_svn__end_list(conn, pool));
/* send LOG_ENTRY members that were added in later SVN releases */
SVN_ERR(svn_ra_svn__write_boolean(conn, pool, log_entry->subtractive_merge));
SVN_ERR(svn_ra_svn__end_list(conn, pool));
if (log_entry->has_children)
b->stack_depth++;
return SVN_NO_ERROR;
}
static svn_error_t *log_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
svn_error_t *err, *write_err;
server_baton_t *b = baton;
svn_revnum_t start_rev, end_rev;
const char *full_path;
svn_boolean_t send_changed_paths, strict_node, include_merged_revisions;
apr_array_header_t *paths, *full_paths, *revprop_items, *revprops;
char *revprop_word;
svn_ra_svn_item_t *elt;
int i;
apr_uint64_t limit, include_merged_revs_param;
log_baton_t lb;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "l(?r)(?r)bb?n?Bwl", &paths,
&start_rev, &end_rev, &send_changed_paths,
&strict_node, &limit,
&include_merged_revs_param,
&revprop_word, &revprop_items));
if (include_merged_revs_param == SVN_RA_SVN_UNSPECIFIED_NUMBER)
include_merged_revisions = FALSE;
else
include_merged_revisions = (svn_boolean_t) include_merged_revs_param;
if (revprop_word == NULL)
/* pre-1.5 client */
revprops = svn_compat_log_revprops_in(pool);
else if (strcmp(revprop_word, "all-revprops") == 0)
revprops = NULL;
else if (strcmp(revprop_word, "revprops") == 0)
{
SVN_ERR_ASSERT(revprop_items);
revprops = apr_array_make(pool, revprop_items->nelts,
sizeof(char *));
for (i = 0; i < revprop_items->nelts; i++)
{
elt = &APR_ARRAY_IDX(revprop_items, i, svn_ra_svn_item_t);
if (elt->kind != SVN_RA_SVN_STRING)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Log revprop entry not a string"));
APR_ARRAY_PUSH(revprops, const char *) = elt->u.string->data;
}
}
else
return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Unknown revprop word '%s' in log command"),
revprop_word);
/* If we got an unspecified number then the user didn't send us anything,
so we assume no limit. If it's larger than INT_MAX then someone is
messing with us, since we know the svn client libraries will never send
us anything that big, so play it safe and default to no limit. */
if (limit == SVN_RA_SVN_UNSPECIFIED_NUMBER || limit > INT_MAX)
limit = 0;
full_paths = apr_array_make(pool, paths->nelts, sizeof(const char *));
for (i = 0; i < paths->nelts; i++)
{
elt = &APR_ARRAY_IDX(paths, i, svn_ra_svn_item_t);
if (elt->kind != SVN_RA_SVN_STRING)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Log path entry not a string"));
full_path = svn_relpath_canonicalize(elt->u.string->data, pool),
full_path = svn_fspath__join(b->repository->fs_path->data, full_path,
pool);
APR_ARRAY_PUSH(full_paths, const char *) = full_path;
}
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__log(full_paths, start_rev, end_rev,
(int) limit, send_changed_paths,
strict_node, include_merged_revisions,
revprops, pool)));
/* Get logs. (Can't report errors back to the client at this point.) */
lb.fs_path = b->repository->fs_path->data;
lb.conn = conn;
lb.stack_depth = 0;
err = svn_repos_get_logs4(b->repository->repos, full_paths, start_rev,
end_rev, (int) limit, send_changed_paths,
strict_node, include_merged_revisions,
revprops, authz_check_access_cb_func(b), &ab,
log_receiver, &lb, pool);
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
{
svn_error_clear(err);
return write_err;
}
SVN_CMD_ERR(err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *check_path(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *path, *full_path;
svn_fs_root_t *root;
svn_node_kind_t kind;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)", &path, &rev));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "check-path %s@%d",
svn_path_uri_encode(full_path, pool), rev));
SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
SVN_CMD_ERR(svn_fs_check_path(&kind, root, full_path, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "w",
svn_node_kind_to_word(kind)));
return SVN_NO_ERROR;
}
static svn_error_t *stat_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_revnum_t rev;
const char *path, *full_path, *cdate;
svn_fs_root_t *root;
svn_dirent_t *dirent;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)", &path, &rev));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "stat %s@%d",
svn_path_uri_encode(full_path, pool), rev));
SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
SVN_CMD_ERR(svn_repos_stat(&dirent, root, full_path, pool));
/* Need to return the equivalent of "(?l)", since that's what the
client is reading. */
if (dirent == NULL)
{
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "()"));
return SVN_NO_ERROR;
}
cdate = (dirent->time == (time_t) -1) ? NULL
: svn_time_to_cstring(dirent->time, pool);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "((wnbr(?c)(?c)))",
svn_node_kind_to_word(dirent->kind),
(apr_uint64_t) dirent->size,
dirent->has_props, dirent->created_rev,
cdate, dirent->last_author));
return SVN_NO_ERROR;
}
static svn_error_t *get_locations(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
svn_error_t *err, *write_err;
server_baton_t *b = baton;
svn_revnum_t revision;
apr_array_header_t *location_revisions, *loc_revs_proto;
svn_ra_svn_item_t *elt;
int i;
const char *relative_path;
svn_revnum_t peg_revision;
apr_hash_t *fs_locations;
const char *abs_path;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
/* Parse the arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "crl", &relative_path,
&peg_revision,
&loc_revs_proto));
relative_path = svn_relpath_canonicalize(relative_path, pool);
abs_path = svn_fspath__join(b->repository->fs_path->data, relative_path,
pool);
location_revisions = apr_array_make(pool, loc_revs_proto->nelts,
sizeof(svn_revnum_t));
for (i = 0; i < loc_revs_proto->nelts; i++)
{
elt = &APR_ARRAY_IDX(loc_revs_proto, i, svn_ra_svn_item_t);
if (elt->kind != SVN_RA_SVN_NUMBER)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Get-locations location revisions entry "
"not a revision number");
revision = (svn_revnum_t)(elt->u.number);
APR_ARRAY_PUSH(location_revisions, svn_revnum_t) = revision;
}
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_locations(abs_path, peg_revision,
location_revisions, pool)));
/* All the parameters are fine - let's perform the query against the
* repository. */
/* We store both err and write_err here, so the client will get
* the "done" even if there was an error in fetching the results. */
err = svn_repos_trace_node_locations(b->repository->fs, &fs_locations,
abs_path, peg_revision,
location_revisions,
authz_check_access_cb_func(b), &ab,
pool);
/* Now, write the results to the connection. */
if (!err)
{
if (fs_locations)
{
apr_hash_index_t *iter;
for (iter = apr_hash_first(pool, fs_locations); iter;
iter = apr_hash_next(iter))
{
const svn_revnum_t *iter_key = apr_hash_this_key(iter);
const char *iter_value = apr_hash_this_val(iter);
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "rc",
*iter_key, iter_value));
}
}
}
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
{
svn_error_clear(err);
return write_err;
}
SVN_CMD_ERR(err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *gls_receiver(svn_location_segment_t *segment,
void *baton,
apr_pool_t *pool)
{
svn_ra_svn_conn_t *conn = baton;
return svn_ra_svn__write_tuple(conn, pool, "rr(?c)",
segment->range_start,
segment->range_end,
segment->path);
}
static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
apr_array_header_t *params,
void *baton)
{
svn_error_t *err, *write_err;
server_baton_t *b = baton;
svn_revnum_t peg_revision, start_rev, end_rev;
const char *relative_path;
const char *abs_path;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
/* Parse the arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)(?r)(?r)",
&relative_path, &peg_revision,
&start_rev, &end_rev));
relative_path = svn_relpath_canonicalize(relative_path, pool);
abs_path = svn_fspath__join(b->repository->fs_path->data, relative_path,
pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(log_command(baton, conn, pool, "%s",
svn_log__get_location_segments(abs_path, peg_revision,
start_rev, end_rev,
pool)));
/* No START_REV or PEG_REVISION? We'll use HEAD. */
if (!SVN_IS_VALID_REVNUM(start_rev) || !SVN_IS_VALID_REVNUM(peg_revision))
{
svn_revnum_t youngest;
err = svn_fs_youngest_rev(&youngest, b->repository->fs, pool);
if (err)
{
err = svn_error_compose_create(
svn_ra_svn__write_word(conn, pool, "done"),
err);
return log_fail_and_flush(err, b, conn, pool);
}
if (!SVN_IS_VALID_REVNUM(start_rev))
start_rev = youngest;
if (!SVN_IS_VALID_REVNUM(peg_revision))
peg_revision = youngest;
}
/* No END_REV? We'll use 0. */
if (!SVN_IS_VALID_REVNUM(end_rev))
end_rev = 0;
if (end_rev > start_rev)
{
err = svn_ra_svn__write_word(conn, pool, "done");
err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, err,
"Get-location-segments end revision must not be "
"younger than start revision");
return log_fail_and_flush(err, b, conn, pool);
}
if (start_rev > peg_revision)
{
err = svn_ra_svn__write_word(conn, pool, "done");
err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, err,
"Get-location-segments start revision must not "
"be younger than peg revision");
return log_fail_and_flush(err, b, conn, pool);
}
/* All the parameters are fine - let's perform the query against the
* repository. */
/* We store both err and write_err here, so the client will get
* the "done" even if there was an error in fetching the results. */
err = svn_repos_node_location_segments(b->repository->repos, abs_path,
peg_revision, start_rev, end_rev,
gls_receiver, (void *)conn,
authz_check_access_cb_func(b), &ab,
pool);
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
{
return svn_error_compose_create(write_err, err);
}
SVN_CMD_ERR(err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
/* This implements svn_write_fn_t. Write LEN bytes starting at DATA to the
client as a string. */
static svn_error_t *svndiff_handler(void *baton, const char *data,
apr_size_t *len)
{
file_revs_baton_t *b = baton;
svn_string_t str;
str.data = data;
str.len = *len;
return svn_ra_svn__write_string(b->conn, b->pool, &str);
}
/* This implements svn_close_fn_t. Mark the end of the data by writing an
empty string to the client. */
static svn_error_t *svndiff_close_handler(void *baton)
{
file_revs_baton_t *b = baton;
SVN_ERR(svn_ra_svn__write_cstring(b->conn, b->pool, ""));
return SVN_NO_ERROR;
}
/* This implements the svn_repos_file_rev_handler_t interface. */
static svn_error_t *file_rev_handler(void *baton, const char *path,
svn_revnum_t rev, apr_hash_t *rev_props,
svn_boolean_t merged_revision,
svn_txdelta_window_handler_t *d_handler,
void **d_baton,
apr_array_header_t *prop_diffs,
apr_pool_t *pool)
{
file_revs_baton_t *frb = baton;
svn_stream_t *stream;
SVN_ERR(svn_ra_svn__write_tuple(frb->conn, pool, "cr(!",
path, rev));
SVN_ERR(svn_ra_svn__write_proplist(frb->conn, pool, rev_props));
SVN_ERR(svn_ra_svn__write_tuple(frb->conn, pool, "!)(!"));
SVN_ERR(write_prop_diffs(frb->conn, pool, prop_diffs));
SVN_ERR(svn_ra_svn__write_tuple(frb->conn, pool, "!)b", merged_revision));
/* Store the pool for the delta stream. */
frb->pool = pool;
/* Prepare for the delta or just write an empty string. */
if (d_handler)
{
stream = svn_stream_create(baton, pool);
svn_stream_set_write(stream, svndiff_handler);
svn_stream_set_close(stream, svndiff_close_handler);
/* If the connection does not support SVNDIFF1 or if we don't want to use
* compression, use the non-compressing "version 0" implementation */
if ( svn_ra_svn_compression_level(frb->conn) > 0
&& svn_ra_svn_has_capability(frb->conn, SVN_RA_SVN_CAP_SVNDIFF1))
svn_txdelta_to_svndiff3(d_handler, d_baton, stream, 1,
svn_ra_svn_compression_level(frb->conn), pool);
else
svn_txdelta_to_svndiff3(d_handler, d_baton, stream, 0,
svn_ra_svn_compression_level(frb->conn), pool);
}
else
SVN_ERR(svn_ra_svn__write_cstring(frb->conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *get_file_revs(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_error_t *err, *write_err;
file_revs_baton_t frb;
svn_revnum_t start_rev, end_rev;
const char *path;
const char *full_path;
apr_uint64_t include_merged_revs_param;
svn_boolean_t include_merged_revisions;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
/* Parse arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)(?r)?B",
&path, &start_rev, &end_rev,
&include_merged_revs_param));
path = svn_relpath_canonicalize(path, pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
full_path = svn_fspath__join(b->repository->fs_path->data, path, pool);
if (include_merged_revs_param == SVN_RA_SVN_UNSPECIFIED_NUMBER)
include_merged_revisions = FALSE;
else
include_merged_revisions = (svn_boolean_t) include_merged_revs_param;
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_file_revs(full_path, start_rev, end_rev,
include_merged_revisions,
pool)));
frb.conn = conn;
frb.pool = NULL;
err = svn_repos_get_file_revs2(b->repository->repos, full_path, start_rev,
end_rev, include_merged_revisions,
authz_check_access_cb_func(b), &ab,
file_rev_handler, &frb, pool);
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
{
svn_error_clear(err);
return write_err;
}
SVN_CMD_ERR(err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *path;
const char *comment;
const char *full_path;
svn_boolean_t steal_lock;
svn_revnum_t current_rev;
svn_lock_t *l;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?c)b(?r)", &path, &comment,
&steal_lock, &current_rev));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
full_path, TRUE));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__lock_one_path(full_path, steal_lock, pool)));
SVN_CMD_ERR(svn_repos_fs_lock(&l, b->repository->repos, full_path, NULL,
comment, 0, 0, /* No expiration time. */
current_rev, steal_lock, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(!", "success"));
SVN_ERR(write_lock(conn, pool, l));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)"));
return SVN_NO_ERROR;
}
struct lock_result_t {
const svn_lock_t *lock;
svn_error_t *err;
};
struct lock_many_baton_t {
apr_hash_t *results;
apr_pool_t *pool;
};
/* Implements svn_fs_lock_callback_t. */
static svn_error_t *
lock_many_cb(void *baton,
const char *path,
const svn_lock_t *fs_lock,
svn_error_t *fs_err,
apr_pool_t *pool)
{
struct lock_many_baton_t *b = baton;
struct lock_result_t *result = apr_palloc(b->pool,
sizeof(struct lock_result_t));
result->lock = fs_lock;
result->err = svn_error_dup(fs_err);
svn_hash_sets(b->results, apr_pstrdup(b->pool, path), result);
return SVN_NO_ERROR;
}
static void
clear_lock_result_hash(apr_hash_t *results,
apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
for (hi = apr_hash_first(scratch_pool, results); hi; hi = apr_hash_next(hi))
{
struct lock_result_t *result = apr_hash_this_val(hi);
svn_error_clear(result->err);
}
}
static svn_error_t *lock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
apr_array_header_t *path_revs;
const char *comment;
svn_boolean_t steal_lock;
int i;
apr_pool_t *subpool;
svn_error_t *err, *write_err = SVN_NO_ERROR;
apr_hash_t *targets = apr_hash_make(pool);
apr_hash_t *authz_results = apr_hash_make(pool);
apr_hash_index_t *hi;
struct lock_many_baton_t lmb;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?c)bl", &comment, &steal_lock,
&path_revs));
subpool = svn_pool_create(pool);
/* Because we can only send a single auth reply per request, we send
a reply before parsing the lock commands. This means an authz
access denial will abort the processing of the locks and return
an error. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write, NULL, TRUE));
/* Parse the lock requests from PATH_REVS into TARGETS. */
for (i = 0; i < path_revs->nelts; ++i)
{
const char *path, *full_path;
svn_revnum_t current_rev;
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(path_revs, i,
svn_ra_svn_item_t);
svn_fs_lock_target_t *target;
svn_pool_clear(subpool);
if (item->kind != SVN_RA_SVN_LIST)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Lock requests should be list of lists");
SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?r)", &path,
&current_rev));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
pool);
target = svn_fs_lock_target_create(NULL, current_rev, pool);
/* Any duplicate paths, once canonicalized, get collapsed into a
single path that is processed once. The result is then
returned multiple times. */
svn_hash_sets(targets, full_path, target);
}
SVN_ERR(log_command(b, conn, subpool, "%s",
svn_log__lock(targets, steal_lock, subpool)));
/* Check authz.
Note: From here on we need to make sure any errors in authz_results, or
results, are cleared before returning from this function. */
for (hi = apr_hash_first(pool, targets); hi; hi = apr_hash_next(hi))
{
const char *full_path = apr_hash_this_key(hi);
svn_pool_clear(subpool);
if (! lookup_access(subpool, b, svn_authz_write, full_path, TRUE))
{
struct lock_result_t *result
= apr_palloc(pool, sizeof(struct lock_result_t));
result->lock = NULL;
result->err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
NULL, NULL, b);
svn_hash_sets(authz_results, full_path, result);
svn_hash_sets(targets, full_path, NULL);
}
}
lmb.results = apr_hash_make(pool);
lmb.pool = pool;
err = svn_repos_fs_lock_many(b->repository->repos, targets,
comment, FALSE,
0, /* No expiration time. */
steal_lock, lock_many_cb, &lmb,
pool, subpool);
/* Return results in the same order as the paths were supplied. */
for (i = 0; i < path_revs->nelts; ++i)
{
const char *path, *full_path;
svn_revnum_t current_rev;
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(path_revs, i,
svn_ra_svn_item_t);
struct lock_result_t *result;
svn_pool_clear(subpool);
write_err = svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?r)", &path,
&current_rev);
if (write_err)
break;
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
subpool);
result = svn_hash_gets(lmb.results, full_path);
if (!result)
result = svn_hash_gets(authz_results, full_path);
if (!result)
{
/* No result? Something really odd happened, create a
placeholder error so that any other results can be
reported in the correct order. */
result = apr_palloc(pool, sizeof(struct lock_result_t));
result->err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED, 0,
_("No result for '%s'."), path);
svn_hash_sets(lmb.results, full_path, result);
}
if (result->err)
write_err = svn_ra_svn__write_cmd_failure(conn, subpool,
result->err);
else
{
write_err = svn_ra_svn__write_tuple(conn, subpool,
"w!", "success");
if (!write_err)
write_err = write_lock(conn, subpool, result->lock);
if (!write_err)
write_err = svn_ra_svn__write_tuple(conn, subpool, "!");
}
if (write_err)
break;
}
clear_lock_result_hash(authz_results, subpool);
clear_lock_result_hash(lmb.results, subpool);
svn_pool_destroy(subpool);
if (!write_err)
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (!write_err)
SVN_CMD_ERR(err);
svn_error_clear(err);
SVN_ERR(write_err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *unlock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *path, *token, *full_path;
svn_boolean_t break_lock;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?c)b", &path, &token,
&break_lock));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Username required unless break_lock was specified. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
full_path, ! break_lock));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__unlock_one_path(full_path, break_lock, pool)));
SVN_CMD_ERR(svn_repos_fs_unlock(b->repository->repos, full_path, token,
break_lock, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *unlock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
svn_boolean_t break_lock;
apr_array_header_t *unlock_tokens;
int i;
apr_pool_t *subpool;
svn_error_t *err = SVN_NO_ERROR, *write_err = SVN_NO_ERROR;
apr_hash_t *targets = apr_hash_make(pool);
apr_hash_t *authz_results = apr_hash_make(pool);
apr_hash_index_t *hi;
struct lock_many_baton_t lmb;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "bl", &break_lock,
&unlock_tokens));
/* Username required unless break_lock was specified. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write, NULL, ! break_lock));
subpool = svn_pool_create(pool);
/* Parse the unlock requests from PATH_REVS into TARGETS. */
for (i = 0; i < unlock_tokens->nelts; i++)
{
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(unlock_tokens, i,
svn_ra_svn_item_t);
const char *path, *full_path, *token;
svn_pool_clear(subpool);
if (item->kind != SVN_RA_SVN_LIST)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Unlock request should be a list of lists");
SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?c)", &path,
&token));
if (!token)
token = "";
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
pool);
/* Any duplicate paths, once canonicalized, get collapsed into a
single path that is processed once. The result is then
returned multiple times. */
svn_hash_sets(targets, full_path, token);
}
SVN_ERR(log_command(b, conn, subpool, "%s",
svn_log__unlock(targets, break_lock, subpool)));
/* Check authz.
Note: From here on we need to make sure any errors in authz_results, or
results, are cleared before returning from this function. */
for (hi = apr_hash_first(pool, targets); hi; hi = apr_hash_next(hi))
{
const char *full_path = apr_hash_this_key(hi);
svn_pool_clear(subpool);
if (! lookup_access(subpool, b, svn_authz_write, full_path,
! break_lock))
{
struct lock_result_t *result
= apr_palloc(pool, sizeof(struct lock_result_t));
result->lock = NULL;
result->err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
NULL, NULL, b);
svn_hash_sets(authz_results, full_path, result);
svn_hash_sets(targets, full_path, NULL);
}
}
lmb.results = apr_hash_make(pool);
lmb.pool = pool;
err = svn_repos_fs_unlock_many(b->repository->repos, targets,
break_lock, lock_many_cb, &lmb,
pool, subpool);
/* Return results in the same order as the paths were supplied. */
for (i = 0; i < unlock_tokens->nelts; ++i)
{
const char *path, *token, *full_path;
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(unlock_tokens, i,
svn_ra_svn_item_t);
struct lock_result_t *result;
svn_pool_clear(subpool);
write_err = svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?c)", &path,
&token);
if (write_err)
break;
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
pool);
result = svn_hash_gets(lmb.results, full_path);
if (!result)
result = svn_hash_gets(authz_results, full_path);
if (!result)
{
/* No result? Something really odd happened, create a
placeholder error so that any other results can be
reported in the correct order. */
result = apr_palloc(pool, sizeof(struct lock_result_t));
result->err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED, 0,
_("No result for '%s'."), path);
svn_hash_sets(lmb.results, full_path, result);
}
if (result->err)
write_err = svn_ra_svn__write_cmd_failure(conn, pool, result->err);
else
write_err = svn_ra_svn__write_tuple(conn, subpool, "w(c)", "success",
path);
if (write_err)
break;
}
clear_lock_result_hash(authz_results, subpool);
clear_lock_result_hash(lmb.results, subpool);
svn_pool_destroy(subpool);
if (!write_err)
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (! write_err)
SVN_CMD_ERR(err);
svn_error_clear(err);
SVN_ERR(write_err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *get_lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *path;
const char *full_path;
svn_lock_t *l;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &path));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
full_path, FALSE));
SVN_ERR(log_command(b, conn, pool, "get-lock %s",
svn_path_uri_encode(full_path, pool)));
SVN_CMD_ERR(svn_fs_get_lock(&l, b->repository->fs, full_path, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
if (l)
SVN_ERR(write_lock(conn, pool, l));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
return SVN_NO_ERROR;
}
static svn_error_t *get_locks(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
const char *path;
const char *full_path;
const char *depth_word;
svn_depth_t depth;
apr_hash_t *locks;
apr_hash_index_t *hi;
svn_error_t *err;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c?(?w)", &path, &depth_word));
depth = depth_word ? svn_depth_from_word(depth_word) : svn_depth_infinity;
if ((depth != svn_depth_empty) &&
(depth != svn_depth_files) &&
(depth != svn_depth_immediates) &&
(depth != svn_depth_infinity))
{
err = svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
"Invalid 'depth' specified in get-locks request");
return log_fail_and_flush(err, b, conn, pool);
}
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(log_command(b, conn, pool, "get-locks %s",
svn_path_uri_encode(full_path, pool)));
SVN_CMD_ERR(svn_repos_fs_get_locks2(&locks, b->repository->repos,
full_path, depth,
authz_check_access_cb_func(b), &ab,
pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi))
{
svn_lock_t *l = apr_hash_this_val(hi);
SVN_ERR(write_lock(conn, pool, l));
}
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
return SVN_NO_ERROR;
}
static svn_error_t *replay_one_revision(svn_ra_svn_conn_t *conn,
server_baton_t *b,
svn_revnum_t rev,
svn_revnum_t low_water_mark,
svn_boolean_t send_deltas,
apr_pool_t *pool)
{
const svn_delta_editor_t *editor;
void *edit_baton;
svn_fs_root_t *root;
svn_error_t *err;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(log_command(b, conn, pool,
svn_log__replay(b->repository->fs_path->data, rev,
pool)));
svn_ra_svn_get_editor(&editor, &edit_baton, conn, pool, NULL, NULL);
err = svn_fs_revision_root(&root, b->repository->fs, rev, pool);
if (! err)
err = svn_repos_replay2(root, b->repository->fs_path->data,
low_water_mark, send_deltas, editor, edit_baton,
authz_check_access_cb_func(b), &ab, pool);
if (err)
svn_error_clear(editor->abort_edit(edit_baton, pool));
SVN_CMD_ERR(err);
return svn_ra_svn__write_cmd_finish_replay(conn, pool);
}
static svn_error_t *replay(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
svn_revnum_t rev, low_water_mark;
svn_boolean_t send_deltas;
server_baton_t *b = baton;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "rrb", &rev, &low_water_mark,
&send_deltas));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(replay_one_revision(conn, b, rev, low_water_mark,
send_deltas, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *replay_range(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
svn_revnum_t start_rev, end_rev, rev, low_water_mark;
svn_boolean_t send_deltas;
server_baton_t *b = baton;
apr_pool_t *iterpool;
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "rrrb", &start_rev,
&end_rev, &low_water_mark,
&send_deltas));
SVN_ERR(trivial_auth_request(conn, pool, b));
iterpool = svn_pool_create(pool);
for (rev = start_rev; rev <= end_rev; rev++)
{
apr_hash_t *props;
svn_pool_clear(iterpool);
SVN_CMD_ERR(svn_repos_fs_revision_proplist(&props,
b->repository->repos, rev,
authz_check_access_cb_func(b),
&ab,
iterpool));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "w(!", "revprops"));
SVN_ERR(svn_ra_svn__write_proplist(conn, iterpool, props));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!)"));
SVN_ERR(replay_one_revision(conn, b, rev, low_water_mark,
send_deltas, iterpool));
}
svn_pool_destroy(iterpool);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
static svn_error_t *
get_deleted_rev(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
apr_array_header_t *params,
void *baton)
{
server_baton_t *b = baton;
const char *path, *full_path;
svn_revnum_t peg_revision;
svn_revnum_t end_revision;
svn_revnum_t revision_deleted;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "crr",
&path, &peg_revision, &end_revision));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(log_command(b, conn, pool, "get-deleted-rev"));
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(svn_repos_deleted_rev(b->repository->fs, full_path, peg_revision,
end_revision, &revision_deleted, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "r", revision_deleted));
return SVN_NO_ERROR;
}
static svn_error_t *
get_inherited_props(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
apr_array_header_t *params,
void *baton)
{
server_baton_t *b = baton;
const char *path, *full_path;
svn_revnum_t rev;
svn_fs_root_t *root;
apr_array_header_t *inherited_props;
int i;
apr_pool_t *iterpool = svn_pool_create(pool);
authz_baton_t ab;
ab.server = b;
ab.conn = conn;
/* Parse arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, iterpool, "c(?r)", &path, &rev));
full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, iterpool),
pool);
/* Check authorizations */
SVN_ERR(must_have_access(conn, iterpool, b, svn_authz_read,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_inherited_props(full_path, rev,
iterpool)));
/* Fetch the properties and a stream for the contents. */
SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, iterpool));
SVN_CMD_ERR(get_props(NULL, &inherited_props, &ab, root, full_path, pool));
/* Send successful command response with revision and props. */
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "w(!", "success"));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!(?!"));
for (i = 0; i < inherited_props->nelts; i++)
{
svn_prop_inherited_item_t *iprop =
APR_ARRAY_IDX(inherited_props, i, svn_prop_inherited_item_t *);
svn_pool_clear(iterpool);
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!(c(!",
iprop->path_or_url));
SVN_ERR(svn_ra_svn__write_proplist(conn, iterpool, iprop->prop_hash));
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!))!",
iprop->path_or_url));
}
SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "!))"));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
static const svn_ra_svn_cmd_entry_t main_commands[] = {
{ "reparent", reparent },
{ "get-latest-rev", get_latest_rev },
{ "get-dated-rev", get_dated_rev },
{ "change-rev-prop", change_rev_prop },
{ "change-rev-prop2",change_rev_prop2 },
{ "rev-proplist", rev_proplist },
{ "rev-prop", rev_prop },
{ "commit", commit },
{ "get-file", get_file },
{ "get-dir", get_dir },
{ "update", update },
{ "switch", switch_cmd },
{ "status", status },
{ "diff", diff },
{ "get-mergeinfo", get_mergeinfo },
{ "log", log_cmd },
{ "check-path", check_path },
{ "stat", stat_cmd },
{ "get-locations", get_locations },
{ "get-location-segments", get_location_segments },
{ "get-file-revs", get_file_revs },
{ "lock", lock },
{ "lock-many", lock_many },
{ "unlock", unlock },
{ "unlock-many", unlock_many },
{ "get-lock", get_lock },
{ "get-locks", get_locks },
{ "replay", replay },
{ "replay-range", replay_range },
{ "get-deleted-rev", get_deleted_rev },
{ "get-iprops", get_inherited_props },
{ NULL }
};
/* Skip past the scheme part of a URL, including the tunnel specification
* if present. Return NULL if the scheme part is invalid for ra_svn. */
static const char *skip_scheme_part(const char *url)
{
if (strncmp(url, "svn", 3) != 0)
return NULL;
url += 3;
if (*url == '+')
url += strcspn(url, ":");
if (strncmp(url, "://", 3) != 0)
return NULL;
return url + 3;
}
/* Check that PATH is a valid repository path, meaning it doesn't contain any
'..' path segments.
NOTE: This is similar to svn_path_is_backpath_present, but that function
assumes the path separator is '/'. This function also checks for
segments delimited by the local path separator. */
static svn_boolean_t
repos_path_valid(const char *path)
{
const char *s = path;
while (*s)
{
/* Scan for the end of the segment. */
while (*path && *path != '/' && *path != SVN_PATH_LOCAL_SEPARATOR)
++path;
/* Check for '..'. */
#ifdef WIN32
/* On Windows, don't allow sequences of more than one character
consisting of just dots and spaces. Win32 functions treat
paths such as ".. " and "......." inconsistently. Make sure
no one can escape out of the root. */
if (path - s >= 2 && strspn(s, ". ") == (size_t)(path - s))
return FALSE;
#else /* ! WIN32 */
if (path - s == 2 && s[0] == '.' && s[1] == '.')
return FALSE;
#endif
/* Skip all separators. */
while (*path && (*path == '/' || *path == SVN_PATH_LOCAL_SEPARATOR))
++path;
s = path;
}
return TRUE;
}
/* Look for the repository given by URL, using ROOT as the virtual
* repository root. If we find one, fill in the repos, fs, repos_url,
* and fs_path fields of REPOSITORY. VHOST and READ_ONLY flags are the
* same as in the server baton.
*
* CONFIG_POOL and AUTHZ_POOL shall be used to load any object of the
* respective type.
*
* Use SCRATCH_POOL for temporary allocations.
*
*/
static svn_error_t *
find_repos(const char *url,
const char *root,
svn_boolean_t vhost,
svn_boolean_t read_only,
svn_config_t *cfg,
repository_t *repository,
svn_repos__config_pool_t *config_pool,
svn_repos__authz_pool_t *authz_pool,
apr_hash_t *fs_config,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *path, *full_path, *fs_path, *hooks_env;
svn_stringbuf_t *url_buf;
/* Skip past the scheme and authority part. */
path = skip_scheme_part(url);
if (path == NULL)
return svn_error_createf(SVN_ERR_BAD_URL, NULL,
"Non-svn URL passed to svn server: '%s'", url);
if (! vhost)
{
path = strchr(path, '/');
if (path == NULL)
path = "";
}
path = svn_relpath_canonicalize(path, scratch_pool);
path = svn_path_uri_decode(path, scratch_pool);
/* Ensure that it isn't possible to escape the root by disallowing
'..' segments. */
if (!repos_path_valid(path))
return svn_error_create(SVN_ERR_BAD_FILENAME, NULL,
"Couldn't determine repository path");
/* Join the server-configured root with the client path. */
full_path = svn_dirent_join(svn_dirent_canonicalize(root, scratch_pool),
path, scratch_pool);
/* Search for a repository in the full path. */
repository->repos_root = svn_repos_find_root_path(full_path, result_pool);
if (!repository->repos_root)
return svn_error_createf(SVN_ERR_RA_SVN_REPOS_NOT_FOUND, NULL,
"No repository found in '%s'", url);
/* Open the repository and fill in b with the resulting information. */
SVN_ERR(svn_repos_open3(&repository->repos, repository->repos_root,
fs_config, result_pool, scratch_pool));
SVN_ERR(svn_repos_remember_client_capabilities(repository->repos,
repository->capabilities));
repository->fs = svn_repos_fs(repository->repos);
fs_path = full_path + strlen(repository->repos_root);
repository->fs_path = svn_stringbuf_create(*fs_path ? fs_path : "/",
result_pool);
url_buf = svn_stringbuf_create(url, result_pool);
svn_path_remove_components(url_buf,
svn_path_component_count(repository->fs_path->data));
repository->repos_url = url_buf->data;
repository->authz_repos_name = svn_dirent_is_child(root,
repository->repos_root,
result_pool);
if (repository->authz_repos_name == NULL)
repository->repos_name = svn_dirent_basename(repository->repos_root,
result_pool);
else
repository->repos_name = repository->authz_repos_name;
repository->repos_name = svn_path_uri_encode(repository->repos_name,
result_pool);
/* If the svnserve configuration has not been loaded then load it from the
* repository. */
if (NULL == cfg)
{
repository->base = svn_repos_conf_dir(repository->repos, result_pool);
SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
svn_repos_svnserve_conf
(repository->repos, result_pool),
FALSE, FALSE, repository->repos,
result_pool));
}
SVN_ERR(load_pwdb_config(repository, cfg, config_pool, result_pool));
SVN_ERR(load_authz_config(repository, repository->repos_root, cfg,
authz_pool, result_pool));
#ifdef SVN_HAVE_SASL
{
const char *val;
/* Should we use Cyrus SASL? */
SVN_ERR(svn_config_get_bool(cfg, &repository->use_sasl,
SVN_CONFIG_SECTION_SASL,
SVN_CONFIG_OPTION_USE_SASL, FALSE));
svn_config_get(cfg, &val, SVN_CONFIG_SECTION_SASL,
SVN_CONFIG_OPTION_MIN_SSF, "0");
SVN_ERR(svn_cstring_atoui(&repository->min_ssf, val));
svn_config_get(cfg, &val, SVN_CONFIG_SECTION_SASL,
SVN_CONFIG_OPTION_MAX_SSF, "256");
SVN_ERR(svn_cstring_atoui(&repository->max_ssf, val));
}
#endif
/* Use the repository UUID as the default realm. */
SVN_ERR(svn_fs_get_uuid(repository->fs, &repository->realm, scratch_pool));
svn_config_get(cfg, &repository->realm, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_REALM, repository->realm);
repository->realm = apr_pstrdup(result_pool, repository->realm);
/* Make sure it's possible for the client to authenticate. Note
that this doesn't take into account any authz configuration read
above, because we can't know about access it grants until paths
are given by the client. */
set_access(repository, cfg, read_only);
/* Configure hook script environment variables. */
svn_config_get(cfg, &hooks_env, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_HOOKS_ENV, NULL);
if (hooks_env)
hooks_env = svn_dirent_internal_style(hooks_env, scratch_pool);
+ SVN_ERR(svn_repos_hooks_setenv(repository->repos, hooks_env, scratch_pool));
repository->hooks_env = apr_pstrdup(result_pool, hooks_env);
return SVN_NO_ERROR;
}
/* Compute the authentication name EXTERNAL should be able to get, if any. */
static const char *get_tunnel_user(serve_params_t *params, apr_pool_t *pool)
{
/* Only offer EXTERNAL for connections tunneled over a login agent. */
if (!params->tunnel)
return NULL;
/* If a tunnel user was provided on the command line, use that. */
if (params->tunnel_user)
return params->tunnel_user;
return svn_user_get_name(pool);
}
static void
fs_warning_func(void *baton, svn_error_t *err)
{
fs_warning_baton_t *b = baton;
log_error(err, b->server);
}
/* Return the normalized repository-relative path for the given PATH
* (may be a URL, full path or relative path) and fs contained in the
* server baton BATON. Allocate the result in POOL.
*/
static const char *
get_normalized_repo_rel_path(void *baton,
const char *path,
apr_pool_t *pool)
{
server_baton_t *sb = baton;
if (svn_path_is_url(path))
{
/* This is a copyfrom URL. */
path = svn_uri_skip_ancestor(sb->repository->repos_url, path, pool);
path = svn_fspath__canonicalize(path, pool);
}
else
{
/* This is a base-relative path. */
if ((path)[0] != '/')
/* Get an absolute path for use in the FS. */
path = svn_fspath__join(sb->repository->fs_path->data, path, pool);
}
return path;
}
/* Get the revision root for REVISION in fs given by server baton BATON
* and return it in *FS_ROOT. Use HEAD if REVISION is SVN_INVALID_REVNUM.
* Use POOL for allocations.
*/
static svn_error_t *
get_revision_root(svn_fs_root_t **fs_root,
void *baton,
svn_revnum_t revision,
apr_pool_t *pool)
{
server_baton_t *sb = baton;
if (!SVN_IS_VALID_REVNUM(revision))
SVN_ERR(svn_fs_youngest_rev(&revision, sb->repository->fs, pool));
SVN_ERR(svn_fs_revision_root(fs_root, sb->repository->fs, revision, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
fetch_props_func(apr_hash_t **props,
void *baton,
const char *path,
svn_revnum_t base_revision,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_fs_root_t *fs_root;
svn_error_t *err;
path = get_normalized_repo_rel_path(baton, path, scratch_pool);
SVN_ERR(get_revision_root(&fs_root, baton, base_revision, scratch_pool));
err = svn_fs_node_proplist(props, fs_root, path, result_pool);
if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
{
svn_error_clear(err);
*props = apr_hash_make(result_pool);
return SVN_NO_ERROR;
}
else if (err)
return svn_error_trace(err);
return SVN_NO_ERROR;
}
static svn_error_t *
fetch_kind_func(svn_node_kind_t *kind,
void *baton,
const char *path,
svn_revnum_t base_revision,
apr_pool_t *scratch_pool)
{
svn_fs_root_t *fs_root;
path = get_normalized_repo_rel_path(baton, path, scratch_pool);
SVN_ERR(get_revision_root(&fs_root, baton, base_revision, scratch_pool));
SVN_ERR(svn_fs_check_path(kind, fs_root, path, scratch_pool));
return SVN_NO_ERROR;
}
static svn_error_t *
fetch_base_func(const char **filename,
void *baton,
const char *path,
svn_revnum_t base_revision,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_stream_t *contents;
svn_stream_t *file_stream;
const char *tmp_filename;
svn_fs_root_t *fs_root;
svn_error_t *err;
path = get_normalized_repo_rel_path(baton, path, scratch_pool);
SVN_ERR(get_revision_root(&fs_root, baton, base_revision, scratch_pool));
err = svn_fs_file_contents(&contents, fs_root, path, scratch_pool);
if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
{
svn_error_clear(err);
*filename = NULL;
return SVN_NO_ERROR;
}
else if (err)
return svn_error_trace(err);
SVN_ERR(svn_stream_open_unique(&file_stream, &tmp_filename, NULL,
svn_io_file_del_on_pool_cleanup,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_copy3(contents, file_stream, NULL, NULL, scratch_pool));
*filename = apr_pstrdup(result_pool, tmp_filename);
return SVN_NO_ERROR;
}
client_info_t *
get_client_info(svn_ra_svn_conn_t *conn,
serve_params_t *params,
apr_pool_t *pool)
{
client_info_t *client_info = apr_pcalloc(pool, sizeof(*client_info));
client_info->tunnel = params->tunnel;
client_info->tunnel_user = get_tunnel_user(params, pool);
client_info->user = NULL;
client_info->authz_user = NULL;
client_info->remote_host = svn_ra_svn_conn_remote_host(conn);
return client_info;
}
/* Construct the server baton for CONN using PARAMS and return it in *BATON.
* It's lifetime is the same as that of CONN. SCRATCH_POOL
*/
static svn_error_t *
construct_server_baton(server_baton_t **baton,
svn_ra_svn_conn_t *conn,
serve_params_t *params,
apr_pool_t *scratch_pool)
{
svn_error_t *err, *io_err;
apr_uint64_t ver;
const char *client_url, *ra_client_string, *client_string;
apr_array_header_t *caplist;
apr_pool_t *conn_pool = svn_ra_svn__get_pool(conn);
server_baton_t *b = apr_pcalloc(conn_pool, sizeof(*b));
fs_warning_baton_t *warn_baton;
svn_stringbuf_t *cap_log = svn_stringbuf_create_empty(scratch_pool);
b->repository = apr_pcalloc(conn_pool, sizeof(*b->repository));
b->repository->username_case = params->username_case;
b->repository->base = params->base;
b->repository->pwdb = NULL;
b->repository->authzdb = NULL;
b->repository->realm = NULL;
b->repository->use_sasl = FALSE;
b->read_only = params->read_only;
b->pool = conn_pool;
b->vhost = params->vhost;
b->logger = params->logger;
b->client_info = get_client_info(conn, params, conn_pool);
/* Send greeting. We don't support version 1 any more, so we can
* send an empty mechlist. */
if (params->compression_level > 0)
SVN_ERR(svn_ra_svn__write_cmd_response(conn, scratch_pool,
"nn()(wwwwwwwwwww)",
(apr_uint64_t) 2, (apr_uint64_t) 2,
SVN_RA_SVN_CAP_EDIT_PIPELINE,
SVN_RA_SVN_CAP_SVNDIFF1,
SVN_RA_SVN_CAP_ABSENT_ENTRIES,
SVN_RA_SVN_CAP_COMMIT_REVPROPS,
SVN_RA_SVN_CAP_DEPTH,
SVN_RA_SVN_CAP_LOG_REVPROPS,
SVN_RA_SVN_CAP_ATOMIC_REVPROPS,
SVN_RA_SVN_CAP_PARTIAL_REPLAY,
SVN_RA_SVN_CAP_INHERITED_PROPS,
SVN_RA_SVN_CAP_EPHEMERAL_TXNPROPS,
SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE
));
else
SVN_ERR(svn_ra_svn__write_cmd_response(conn, scratch_pool,
"nn()(wwwwwwwwww)",
(apr_uint64_t) 2, (apr_uint64_t) 2,
SVN_RA_SVN_CAP_EDIT_PIPELINE,
SVN_RA_SVN_CAP_ABSENT_ENTRIES,
SVN_RA_SVN_CAP_COMMIT_REVPROPS,
SVN_RA_SVN_CAP_DEPTH,
SVN_RA_SVN_CAP_LOG_REVPROPS,
SVN_RA_SVN_CAP_ATOMIC_REVPROPS,
SVN_RA_SVN_CAP_PARTIAL_REPLAY,
SVN_RA_SVN_CAP_INHERITED_PROPS,
SVN_RA_SVN_CAP_EPHEMERAL_TXNPROPS,
SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE
));
/* Read client response, which we assume to be in version 2 format:
* version, capability list, and client URL; then we do an auth
* request. */
SVN_ERR(svn_ra_svn__read_tuple(conn, scratch_pool, "nlc?c(?c)",
&ver, &caplist, &client_url,
&ra_client_string,
&client_string));
if (ver != 2)
return SVN_NO_ERROR;
client_url = svn_uri_canonicalize(client_url, conn_pool);
SVN_ERR(svn_ra_svn_set_capabilities(conn, caplist));
/* All released versions of Subversion support edit-pipeline,
* so we do not accept connections from clients that do not. */
if (! svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_EDIT_PIPELINE))
return SVN_NO_ERROR;
/* find_repos needs the capabilities as a list of words (eventually
they get handed to the start-commit hook). While we could add a
new interface to re-retrieve them from conn and convert the
result to a list, it's simpler to just convert caplist by hand
here, since we already have it and turning 'svn_ra_svn_item_t's
into 'const char *'s is pretty easy.
We only record capabilities we care about. The client may report
more (because it doesn't know what the server cares about). */
{
int i;
svn_ra_svn_item_t *item;
b->repository->capabilities = apr_array_make(conn_pool, 1,
sizeof(const char *));
for (i = 0; i < caplist->nelts; i++)
{
item = &APR_ARRAY_IDX(caplist, i, svn_ra_svn_item_t);
/* ra_svn_set_capabilities() already type-checked for us */
if (strcmp(item->u.word, SVN_RA_SVN_CAP_MERGEINFO) == 0)
{
APR_ARRAY_PUSH(b->repository->capabilities, const char *)
= SVN_RA_CAPABILITY_MERGEINFO;
}
/* Save for operational log. */
if (cap_log->len > 0)
svn_stringbuf_appendcstr(cap_log, " ");
svn_stringbuf_appendcstr(cap_log, item->u.word);
}
}
err = handle_config_error(find_repos(client_url, params->root, b->vhost,
b->read_only, params->cfg,
b->repository, params->config_pool,
params->authz_pool, params->fs_config,
conn_pool, scratch_pool),
b);
if (!err)
{
if (b->repository->anon_access == NO_ACCESS
&& (b->repository->auth_access == NO_ACCESS
|| (!b->client_info->tunnel_user && !b->repository->pwdb
&& !b->repository->use_sasl)))
err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
"No access allowed to this repository",
b);
}
if (!err)
{
SVN_ERR(auth_request(conn, scratch_pool, b, READ_ACCESS, FALSE));
if (current_access(b) == NO_ACCESS)
err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
"Not authorized for access", b);
}
if (err)
{
log_error(err, b);
io_err = svn_ra_svn__write_cmd_failure(conn, scratch_pool, err);
svn_error_clear(err);
SVN_ERR(io_err);
return svn_ra_svn__flush(conn, scratch_pool);
}
SVN_ERR(svn_fs_get_uuid(b->repository->fs, &b->repository->uuid,
conn_pool));
/* We can't claim mergeinfo capability until we know whether the
repository supports mergeinfo (i.e., is not a 1.4 repository),
but we don't get the repository url from the client until after
we've already sent the initial list of server capabilities. So
we list repository capabilities here, in our first response after
the client has sent the url. */
{
svn_boolean_t supports_mergeinfo;
SVN_ERR(svn_repos_has_capability(b->repository->repos,
&supports_mergeinfo,
SVN_REPOS_CAPABILITY_MERGEINFO,
scratch_pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, scratch_pool, "w(cc(!",
"success", b->repository->uuid,
b->repository->repos_url));
if (supports_mergeinfo)
SVN_ERR(svn_ra_svn__write_word(conn, scratch_pool,
SVN_RA_SVN_CAP_MERGEINFO));
SVN_ERR(svn_ra_svn__write_tuple(conn, scratch_pool, "!))"));
SVN_ERR(svn_ra_svn__flush(conn, scratch_pool));
}
/* Log the open. */
if (ra_client_string == NULL || ra_client_string[0] == '\0')
ra_client_string = "-";
else
ra_client_string = svn_path_uri_encode(ra_client_string, scratch_pool);
if (client_string == NULL || client_string[0] == '\0')
client_string = "-";
else
client_string = svn_path_uri_encode(client_string, scratch_pool);
SVN_ERR(log_command(b, conn, scratch_pool,
"open %" APR_UINT64_T_FMT " cap=(%s) %s %s %s",
ver, cap_log->data,
svn_path_uri_encode(b->repository->fs_path->data,
scratch_pool),
ra_client_string, client_string));
warn_baton = apr_pcalloc(conn_pool, sizeof(*warn_baton));
warn_baton->server = b;
warn_baton->conn = conn;
svn_fs_set_warning_func(b->repository->fs, fs_warning_func, warn_baton);
/* Set up editor shims. */
{
svn_delta_shim_callbacks_t *callbacks =
svn_delta_shim_callbacks_default(conn_pool);
callbacks->fetch_base_func = fetch_base_func;
callbacks->fetch_props_func = fetch_props_func;
callbacks->fetch_kind_func = fetch_kind_func;
callbacks->fetch_baton = b;
SVN_ERR(svn_ra_svn__set_shim_callbacks(conn, callbacks));
}
*baton = b;
return SVN_NO_ERROR;
}
svn_error_t *
serve_interruptable(svn_boolean_t *terminate_p,
connection_t *connection,
svn_boolean_t (* is_busy)(connection_t *),
apr_pool_t *pool)
{
svn_boolean_t terminate = FALSE;
svn_error_t *err = NULL;
const svn_ra_svn_cmd_entry_t *command;
apr_pool_t *iterpool = svn_pool_create(pool);
/* Prepare command parser. */
apr_hash_t *cmd_hash = apr_hash_make(pool);
for (command = main_commands; command->cmdname; command++)
svn_hash_sets(cmd_hash, command->cmdname, command);
/* Auto-initialize connection */
if (! connection->conn)
{
apr_status_t ar;
/* Enable TCP keep-alives on the socket so we time out when
* the connection breaks due to network-layer problems.
* If the peer has dropped the connection due to a network partition
* or a crash, or if the peer no longer considers the connection
* valid because we are behind a NAT and our public IP has changed,
* it will respond to the keep-alive probe with a RST instead of an
* acknowledgment segment, which will cause svn to abort the session
* even while it is currently blocked waiting for data from the peer. */
ar = apr_socket_opt_set(connection->usock, APR_SO_KEEPALIVE, 1);
if (ar)
{
/* It's not a fatal error if we cannot enable keep-alives. */
}
/* create the connection, configure ports etc. */
connection->conn
= svn_ra_svn_create_conn4(connection->usock, NULL, NULL,
connection->params->compression_level,
connection->params->zero_copy_limit,
connection->params->error_check_interval,
connection->pool);
/* Construct server baton and open the repository for the first time. */
err = construct_server_baton(&connection->baton, connection->conn,
connection->params, pool);
}
/* If we can't access the repo for some reason, end this connection. */
if (err)
terminate = TRUE;
/* Process incoming commands. */
while (!terminate && !err)
{
svn_pool_clear(iterpool);
if (is_busy && is_busy(connection))
{
svn_boolean_t has_command;
/* If the server is busy, execute just one command and only if
* there is one currently waiting in our receive buffers.
*/
err = svn_ra_svn__has_command(&has_command, &terminate,
connection->conn, iterpool);
if (!err && has_command)
err = svn_ra_svn__handle_command(&terminate, cmd_hash,
connection->baton,
connection->conn,
FALSE, iterpool);
break;
}
else
{
/* The server is not busy, thus let's serve whichever command
* comes in next and whenever it comes in. This requires the
* busy() callback test to return TRUE while there are still some
* resources left.
*/
err = svn_ra_svn__handle_command(&terminate, cmd_hash,
connection->baton,
connection->conn,
FALSE, iterpool);
}
}
/* error or normal end of session. Close the connection */
svn_pool_destroy(iterpool);
if (terminate_p)
*terminate_p = terminate;
return svn_error_trace(err);
}
svn_error_t *serve(svn_ra_svn_conn_t *conn,
serve_params_t *params,
apr_pool_t *pool)
{
server_baton_t *baton = NULL;
SVN_ERR(construct_server_baton(&baton, conn, params, pool));
return svn_ra_svn__handle_commands2(conn, pool, main_commands, baton, FALSE);
}
Index: stable/11
===================================================================
--- stable/11 (revision 309510)
+++ stable/11 (revision 309511)
Property changes on: stable/11
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
Merged /head:r309356

File Metadata

Mime Type
application/octet-stream
Expires
Sun, Apr 28, 4:35 AM (2 d)
Storage Engine
chunks
Storage Format
Chunks
Storage Handle
oSpENP_c4Z9.
Default Alt Text
(4 MB)

Event Timeline