Index: stable/11/contrib/subversion/CHANGES =================================================================== --- stable/11/contrib/subversion/CHANGES (revision 322441) +++ stable/11/contrib/subversion/CHANGES (revision 322442) @@ -1,6409 +1,6469 @@ +Version 1.9.7 +(10 Aug 2017, from /branches/1.9.x) +http://svn.apache.org/repos/asf/subversion/tags/1.9.7 + + User-visible changes: + - Client-side bugfixes: + * Fix arbitrary code execution vulnerability CVE-2017-9800 + See + for details. + + - Server-side bugfixes: + (none) + + - Bindings bugfixes: + (none) + + Developer-visible changes: + - General: + (none) + + - API changes: + (none) + + +Version 1.9.6 +(5 Jul 2017, from /branches/1.9.x) +http://svn.apache.org/repos/asf/subversion/tags/1.9.6 + + User-visible changes: + - Client-side bugfixes: + * cp/mv: improve error message when target is an unversioned dir (r1779948) + * merge: reduce memory usage with large amounts of mergeinfo (issue #4667) + + - Server-side bugfixes: + * 'svnadmin freeze': document the purpose more clearly (r1774109) + * dump: fix segfault when a revision has no revprops (r1781507) + * fsfs: improve error message upon failure to open rep-cache (r1781655) + * fsfs: never attempt to share directory representations (r1785053) + * fsfs: make consistency independent of hash algorithms (r1785737 et al) + This change makes Subversion resilient to collision attacks, including + SHA-1 collision attacks such as . See also our + documentation at and + . + + - Client-side and server-side bugfixes: + * work around an APR bug related to file truncation (r1759116) + + - Bindings bugfixes: + * javahl: follow redirects when opening a connection (r1667738, r1796720) + + Developer-visible changes: + - General: + * win_tests.py: make the --bin option work, rather than abort (r1706432) + (regression introduced in 1.9.2) + * windows: support building with 'zlibstat.lib' in install-layout (r1783704) + + - API changes: + (none) + + 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) + * fix source of spurious 'incoming edit' tree conflicts (r1760570) * 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) + * javahl: fix temporarily 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) + * ruby: fix test failures with ruby >= 2.2 (r1766240) + * fix link error with --disable-keychain on OS X (r1761755) * 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) + * raise minimal httpd version from 2.0 to 2.2 (r1754190) 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) * 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) + * svnlook: properly remove tempfiles on diff errors (r1711346) - 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) + * svnlook: properly remove tempfiles on diff errors (r1711346) - Client-side and server-side bugfixes: * fix potential memory access bugs (r1722860 et al) - Bindings bugfixes: - * javahl: fix temporary accepting SSL server certificates (r1764851) + * javahl: fix temporarily 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 #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 @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 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 .@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 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 ' 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/NOTICE =================================================================== --- stable/11/contrib/subversion/NOTICE (revision 322441) +++ stable/11/contrib/subversion/NOTICE (revision 322442) @@ -1,28 +1,28 @@ Apache Subversion -Copyright 2016 The Apache Software Foundation +Copyright 2017 The Apache Software Foundation This product includes software developed by many people, and distributed under Contributor License Agreements to The Apache Software Foundation (http://www.apache.org/). See the accompanying COMMITTERS file and the revision logs for an exact contribution history. Portions of the test suite for Subversion's Python bindings are copyrighted by Edgewall Software, Jonas Borgström and Christopher Lenz. For more information, see LICENSE. This product includes software developed under the X Consortium License see: build/install-sh This product includes software developed by Markus Kuhn under a permissive license, see LICENSE. This software contains code derived from the RSA Data Security Inc. MD5 Message-Digest Algorithm, including various modifications by Spyglass Inc., Carnegie Mellon University, and Bell Communications Research, Inc (Bellcore). This product includes software developed by Public Software Group e. V. under a permissive license, see LICENSE. This software contains code derived from TropicSSL under a BSD 3-Clause license, see LICENSE. Index: stable/11/contrib/subversion/build-outputs.mk =================================================================== --- stable/11/contrib/subversion/build-outputs.mk (revision 322441) +++ stable/11/contrib/subversion/build-outputs.mk (revision 322442) @@ -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/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_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_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/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/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 322441) +++ stable/11/contrib/subversion/configure (revision 322442) @@ -1,28706 +1,28706 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for subversion 1.9.5. +# Generated by GNU Autoconf 2.69 for subversion 1.9.7. # # Report bugs to . # # # 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 &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.5' -PACKAGE_STRING='subversion 1.9.5' +PACKAGE_VERSION='1.9.7' +PACKAGE_STRING='subversion 1.9.7' 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 #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #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.5 to adapt to many kinds of systems. +\`configure' configures subversion 1.9.7 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.5:";; + short | recursive ) echo "Configuration of subversion 1.9.7:";; 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 if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory 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 . _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.5 +subversion configure 1.9.7 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 declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #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.5, which was +It was created by subversion $as_me 1.9.7, 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.5" >&5 -$as_echo "$as_me: Configuring Subversion 1.9.5" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.7" >&5 +$as_echo "$as_me: Configuring Subversion 1.9.7" >&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" <&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 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 #include 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 to if __STDC__ is defined, since # 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 #else # include #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 _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 to if __STDC__ is defined, since # 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 #else # include #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 _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 #include #include #include 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 _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 _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 #include #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 #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 "${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 &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 &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 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 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 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.so # instead of lib.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 #endif #include #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 #endif #include #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 to if __STDC__ is defined, since # 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 #else # include #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 _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 to if __STDC__ is defined, since # 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 #else # include #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 _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 &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 &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 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.so # instead of lib.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 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 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 " svn_db_header="#define APU_WANT_DB #include " fi if test "$cross_compiling" = yes; then : svn_have_berkeley_db=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include $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 #include 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 #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 #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 #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 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 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 #include #include #include 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 _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 _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 #include #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 zlib_skip=no elif test "$withval" = "no"; then zlib_skip=yes else zlib_skip=no zlib_prefix="$withval" fi fi if test "$zlib_skip" = "yes"; then as_fn_error $? "subversion requires zlib" "$LINENO" 5 fi 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 $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" 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" fi done 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 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_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" SVN_ZLIB_LIBS="-lz" fi fi fi fi if test "$zlib_found" = "no"; then as_fn_error $? "subversion requires zlib" "$LINENO" 5 fi 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"; 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" >&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 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 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 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 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"; 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" >&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 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 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 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 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"; 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" >&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 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 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 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 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"; 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" >&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 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 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 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 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.5, which was +This file was extended by subversion $as_me 1.9.7, 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 ." _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.5 +subversion config.status 1.9.7 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` 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 ' >$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 ' >$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 . # 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/subversion/include/svn_version.h =================================================================== --- stable/11/contrib/subversion/subversion/include/svn_version.h (revision 322441) +++ stable/11/contrib/subversion/subversion/include/svn_version.h (revision 322442) @@ -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 #include #include "svn_types.h" #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Symbols that define the version number. */ /* Version numbers: .. * * 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 5 +#define SVN_VER_PATCH 7 /** @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 " (r1770682)" +#define SVN_VER_TAG " (r1800392)" /** 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 1770682 +#define SVN_VER_REVISION 1800392 /* 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_libname_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/copy.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_client/copy.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_client/copy.c (revision 322442) @@ -1,3303 +1,3317 @@ /* * copy.c: copy/move wrappers around wc 'copy' 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. * ==================================================================== */ /* ==================================================================== */ /*** Includes. ***/ #include #include "svn_hash.h" #include "svn_client.h" #include "svn_error.h" #include "svn_error_codes.h" #include "svn_dirent_uri.h" #include "svn_path.h" #include "svn_opt.h" #include "svn_time.h" #include "svn_props.h" #include "svn_mergeinfo.h" #include "svn_pools.h" #include "client.h" #include "mergeinfo.h" #include "svn_private_config.h" #include "private/svn_wc_private.h" #include "private/svn_ra_private.h" #include "private/svn_mergeinfo_private.h" #include "private/svn_client_private.h" /* * OUR BASIC APPROACH TO COPIES * ============================ * * for each source/destination pair * if (not exist src_path) * return ERR_BAD_SRC error * * if (exist dst_path) * return ERR_OBSTRUCTION error * else * copy src_path into parent_of_dst_path as basename (dst_path) * * if (this is a move) * delete src_path */ /*** Code. ***/ /* Extend the mergeinfo for the single WC path TARGET_WCPATH, adding MERGEINFO to any mergeinfo pre-existing in the WC. */ static svn_error_t * extend_wc_mergeinfo(const char *target_abspath, apr_hash_t *mergeinfo, svn_client_ctx_t *ctx, apr_pool_t *pool) { apr_hash_t *wc_mergeinfo; /* Get a fresh copy of the pre-existing state of the WC's mergeinfo updating it. */ SVN_ERR(svn_client__parse_mergeinfo(&wc_mergeinfo, ctx->wc_ctx, target_abspath, pool, pool)); /* Combine the provided mergeinfo with any mergeinfo from the WC. */ if (wc_mergeinfo && mergeinfo) SVN_ERR(svn_mergeinfo_merge2(wc_mergeinfo, mergeinfo, pool, pool)); else if (! wc_mergeinfo) wc_mergeinfo = mergeinfo; return svn_error_trace( svn_client__record_wc_mergeinfo(target_abspath, wc_mergeinfo, FALSE, ctx, pool)); } /* Find the longest common ancestor of paths in COPY_PAIRS. If SRC_ANCESTOR is NULL, ignore source paths in this calculation. If DST_ANCESTOR is NULL, ignore destination paths in this calculation. COMMON_ANCESTOR will be the common ancestor of both the SRC_ANCESTOR and DST_ANCESTOR, and will only be set if it is not NULL. */ static svn_error_t * get_copy_pair_ancestors(const apr_array_header_t *copy_pairs, const char **src_ancestor, const char **dst_ancestor, const char **common_ancestor, apr_pool_t *pool) { apr_pool_t *subpool = svn_pool_create(pool); svn_client__copy_pair_t *first; const char *first_dst; const char *first_src; const char *top_dst; svn_boolean_t src_is_url; svn_boolean_t dst_is_url; char *top_src; int i; first = APR_ARRAY_IDX(copy_pairs, 0, svn_client__copy_pair_t *); /* Because all the destinations are in the same directory, we can easily determine their common ancestor. */ first_dst = first->dst_abspath_or_url; dst_is_url = svn_path_is_url(first_dst); if (copy_pairs->nelts == 1) top_dst = apr_pstrdup(subpool, first_dst); else top_dst = dst_is_url ? svn_uri_dirname(first_dst, subpool) : svn_dirent_dirname(first_dst, subpool); /* Sources can came from anywhere, so we have to actually do some work for them. */ first_src = first->src_abspath_or_url; src_is_url = svn_path_is_url(first_src); top_src = apr_pstrdup(subpool, first_src); for (i = 1; i < copy_pairs->nelts; i++) { /* We don't need to clear the subpool here for several reasons: 1) If we do, we can't use it to allocate the initial versions of top_src and top_dst (above). 2) We don't return any errors in the following loop, so we are guanteed to destroy the subpool at the end of this function. 3) The number of iterations is likely to be few, and the loop will be through quickly, so memory leakage will not be significant, in time or space. */ const svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); top_src = src_is_url ? svn_uri_get_longest_ancestor(top_src, pair->src_abspath_or_url, subpool) : svn_dirent_get_longest_ancestor(top_src, pair->src_abspath_or_url, subpool); } if (src_ancestor) *src_ancestor = apr_pstrdup(pool, top_src); if (dst_ancestor) *dst_ancestor = apr_pstrdup(pool, top_dst); if (common_ancestor) *common_ancestor = src_is_url ? svn_uri_get_longest_ancestor(top_src, top_dst, pool) : svn_dirent_get_longest_ancestor(top_src, top_dst, pool); svn_pool_destroy(subpool); return SVN_NO_ERROR; } /* Quote a string if it would be handled as multiple or different tokens during externals parsing */ static const char * maybe_quote(const char *value, apr_pool_t *result_pool) { apr_status_t status; char **argv; status = apr_tokenize_to_argv(value, &argv, result_pool); if (!status && argv[0] && !argv[1] && strcmp(argv[0], value) == 0) return apr_pstrdup(result_pool, value); { svn_stringbuf_t *sb = svn_stringbuf_create_empty(result_pool); const char *c; svn_stringbuf_appendbyte(sb, '\"'); for (c = value; *c; c++) { if (*c == '\\' || *c == '\"' || *c == '\'') svn_stringbuf_appendbyte(sb, '\\'); svn_stringbuf_appendbyte(sb, *c); } svn_stringbuf_appendbyte(sb, '\"'); #ifdef SVN_DEBUG status = apr_tokenize_to_argv(sb->data, &argv, result_pool); SVN_ERR_ASSERT_NO_RETURN(!status && argv[0] && !argv[1] && !strcmp(argv[0], value)); #endif return sb->data; } } /* In *NEW_EXTERNALS_DESCRIPTION, return a new external description for * use as a line in an svn:externals property, based on the external item * ITEM and the additional parser information in INFO. Pin the external * to EXTERNAL_PEGREV. Use POOL for all allocations. */ static svn_error_t * make_external_description(const char **new_external_description, const char *local_abspath_or_url, svn_wc_external_item2_t *item, svn_wc__externals_parser_info_t *info, svn_opt_revision_t external_pegrev, apr_pool_t *pool) { const char *rev_str; const char *peg_rev_str; switch (info->format) { case svn_wc__external_description_format_1: if (external_pegrev.kind == svn_opt_revision_unspecified) { /* If info->rev_str is NULL, this yields an empty string. */ rev_str = apr_pstrcat(pool, info->rev_str, " ", SVN_VA_NULL); } else if (info->rev_str && item->revision.kind != svn_opt_revision_head) rev_str = apr_psprintf(pool, "%s ", info->rev_str); else { /* ### can't handle svn_opt_revision_date without info->rev_str */ SVN_ERR_ASSERT(external_pegrev.kind == svn_opt_revision_number); rev_str = apr_psprintf(pool, "-r%ld ", external_pegrev.value.number); } *new_external_description = apr_psprintf(pool, "%s %s%s\n", maybe_quote(item->target_dir, pool), rev_str, maybe_quote(item->url, pool)); break; case svn_wc__external_description_format_2: if (external_pegrev.kind == svn_opt_revision_unspecified) { /* If info->rev_str is NULL, this yields an empty string. */ rev_str = apr_pstrcat(pool, info->rev_str, " ", SVN_VA_NULL); } else if (info->rev_str && item->revision.kind != svn_opt_revision_head) rev_str = apr_psprintf(pool, "%s ", info->rev_str); else rev_str = ""; if (external_pegrev.kind == svn_opt_revision_unspecified) peg_rev_str = info->peg_rev_str ? info->peg_rev_str : ""; else if (info->peg_rev_str && item->peg_revision.kind != svn_opt_revision_head) peg_rev_str = info->peg_rev_str; else { /* ### can't handle svn_opt_revision_date without info->rev_str */ SVN_ERR_ASSERT(external_pegrev.kind == svn_opt_revision_number); peg_rev_str = apr_psprintf(pool, "@%ld", external_pegrev.value.number); } *new_external_description = apr_psprintf(pool, "%s%s %s\n", rev_str, maybe_quote(apr_psprintf(pool, "%s%s", item->url, peg_rev_str), pool), maybe_quote(item->target_dir, pool)); break; default: return svn_error_createf( SVN_ERR_CLIENT_INVALID_EXTERNALS_DESCRIPTION, NULL, _("%s property defined at '%s' is using an unsupported " "syntax"), SVN_PROP_EXTERNALS, svn_dirent_local_style(local_abspath_or_url, pool)); } return SVN_NO_ERROR; } /* Pin all externals listed in EXTERNALS_PROP_VAL to their * last-changed revision. Set *PINNED_EXTERNALS to a new property * value allocated in RESULT_POOL, or to NULL if none of the externals * in EXTERNALS_PROP_VAL were changed. LOCAL_ABSPATH_OR_URL is the * path or URL defining the svn:externals property. Use SCRATCH_POOL * for temporary allocations. */ static svn_error_t * pin_externals_prop(svn_string_t **pinned_externals, svn_string_t *externals_prop_val, const apr_hash_t *externals_to_pin, const char *repos_root_url, const char *local_abspath_or_url, svn_client_ctx_t *ctx, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_stringbuf_t *buf; apr_array_header_t *external_items; apr_array_header_t *parser_infos; apr_array_header_t *items_to_pin; int pinned_items; int i; apr_pool_t *iterpool; SVN_ERR(svn_wc__parse_externals_description(&external_items, &parser_infos, local_abspath_or_url, externals_prop_val->data, FALSE /* canonicalize_url */, scratch_pool)); if (externals_to_pin) { items_to_pin = svn_hash_gets((apr_hash_t *)externals_to_pin, local_abspath_or_url); if (!items_to_pin) { /* No pinning at all for this path. */ *pinned_externals = NULL; return SVN_NO_ERROR; } } else items_to_pin = NULL; buf = svn_stringbuf_create_empty(scratch_pool); iterpool = svn_pool_create(scratch_pool); pinned_items = 0; for (i = 0; i < external_items->nelts; i++) { svn_wc_external_item2_t *item; svn_wc__externals_parser_info_t *info; svn_opt_revision_t external_pegrev; const char *pinned_desc; svn_pool_clear(iterpool); item = APR_ARRAY_IDX(external_items, i, svn_wc_external_item2_t *); info = APR_ARRAY_IDX(parser_infos, i, svn_wc__externals_parser_info_t *); if (items_to_pin) { int j; svn_wc_external_item2_t *item_to_pin = NULL; for (j = 0; j < items_to_pin->nelts; j++) { svn_wc_external_item2_t *const current = APR_ARRAY_IDX(items_to_pin, j, svn_wc_external_item2_t *); if (current && 0 == strcmp(item->url, current->url) && 0 == strcmp(item->target_dir, current->target_dir)) { item_to_pin = current; break; } } /* If this item is not in our list of external items to pin then * simply keep the external at its original value. */ if (!item_to_pin) { const char *desc; external_pegrev.kind = svn_opt_revision_unspecified; SVN_ERR(make_external_description(&desc, local_abspath_or_url, item, info, external_pegrev, iterpool)); svn_stringbuf_appendcstr(buf, desc); continue; } } if (item->peg_revision.kind == svn_opt_revision_date) { /* Already pinned ... copy the peg date. */ external_pegrev.kind = svn_opt_revision_date; external_pegrev.value.date = item->peg_revision.value.date; } else if (item->peg_revision.kind == svn_opt_revision_number) { /* Already pinned ... copy the peg revision number. */ external_pegrev.kind = svn_opt_revision_number; external_pegrev.value.number = item->peg_revision.value.number; } else { SVN_ERR_ASSERT( item->peg_revision.kind == svn_opt_revision_head || item->peg_revision.kind == svn_opt_revision_unspecified); /* We're actually going to change the peg revision. */ ++pinned_items; if (svn_path_is_url(local_abspath_or_url)) { const char *resolved_url; svn_ra_session_t *external_ra_session; svn_revnum_t latest_revnum; SVN_ERR(svn_wc__resolve_relative_external_url( &resolved_url, item, repos_root_url, local_abspath_or_url, iterpool, iterpool)); SVN_ERR(svn_client__open_ra_session_internal(&external_ra_session, NULL, resolved_url, NULL, NULL, FALSE, FALSE, ctx, iterpool, iterpool)); SVN_ERR(svn_ra_get_latest_revnum(external_ra_session, &latest_revnum, iterpool)); external_pegrev.kind = svn_opt_revision_number; external_pegrev.value.number = latest_revnum; } else { const char *external_abspath; svn_node_kind_t external_kind; svn_revnum_t external_checked_out_rev; external_abspath = svn_dirent_join(local_abspath_or_url, item->target_dir, iterpool); SVN_ERR(svn_wc__read_external_info(&external_kind, NULL, NULL, NULL, NULL, ctx->wc_ctx, local_abspath_or_url, external_abspath, TRUE, iterpool, iterpool)); if (external_kind == svn_node_none) return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL, _("Cannot pin external '%s' defined " "in %s at '%s' because it is not " "checked out in the working copy " "at '%s'"), item->url, SVN_PROP_EXTERNALS, svn_dirent_local_style( local_abspath_or_url, iterpool), svn_dirent_local_style( external_abspath, iterpool)); else if (external_kind == svn_node_dir) { svn_boolean_t is_switched; svn_boolean_t is_modified; svn_revnum_t min_rev; svn_revnum_t max_rev; /* Perform some sanity checks on the checked-out external. */ SVN_ERR(svn_wc__has_switched_subtrees(&is_switched, ctx->wc_ctx, external_abspath, NULL, iterpool)); if (is_switched) return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL, _("Cannot pin external '%s' defined " "in %s at '%s' because '%s' has " "switched subtrees (switches " "cannot be represented in %s)"), item->url, SVN_PROP_EXTERNALS, svn_dirent_local_style( local_abspath_or_url, iterpool), svn_dirent_local_style( external_abspath, iterpool), SVN_PROP_EXTERNALS); SVN_ERR(svn_wc__has_local_mods(&is_modified, ctx->wc_ctx, external_abspath, TRUE, ctx->cancel_func, ctx->cancel_baton, iterpool)); if (is_modified) return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL, _("Cannot pin external '%s' defined " "in %s at '%s' because '%s' has " "local modifications (local " "modifications cannot be " "represented in %s)"), item->url, SVN_PROP_EXTERNALS, svn_dirent_local_style( local_abspath_or_url, iterpool), svn_dirent_local_style( external_abspath, iterpool), SVN_PROP_EXTERNALS); SVN_ERR(svn_wc__min_max_revisions(&min_rev, &max_rev, ctx->wc_ctx, external_abspath, FALSE, iterpool)); if (min_rev != max_rev) return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL, _("Cannot pin external '%s' defined " "in %s at '%s' because '%s' is a " "mixed-revision working copy " "(mixed-revisions cannot be " "represented in %s)"), item->url, SVN_PROP_EXTERNALS, svn_dirent_local_style( local_abspath_or_url, iterpool), svn_dirent_local_style( external_abspath, iterpool), SVN_PROP_EXTERNALS); external_checked_out_rev = min_rev; } else { SVN_ERR_ASSERT(external_kind == svn_node_file); SVN_ERR(svn_wc__node_get_repos_info(&external_checked_out_rev, NULL, NULL, NULL, ctx->wc_ctx, external_abspath, iterpool, iterpool)); } external_pegrev.kind = svn_opt_revision_number; external_pegrev.value.number = external_checked_out_rev; } } SVN_ERR_ASSERT(external_pegrev.kind == svn_opt_revision_date || external_pegrev.kind == svn_opt_revision_number); SVN_ERR(make_external_description(&pinned_desc, local_abspath_or_url, item, info, external_pegrev, iterpool)); svn_stringbuf_appendcstr(buf, pinned_desc); } svn_pool_destroy(iterpool); if (pinned_items > 0) *pinned_externals = svn_string_create_from_buf(buf, result_pool); else *pinned_externals = NULL; return SVN_NO_ERROR; } /* Return, in *PINNED_EXTERNALS, a new hash mapping URLs or local abspaths * to svn:externals property values (as const char *), where some or all * external references have been pinned. * If EXTERNALS_TO_PIN is NULL, pin all externals, else pin the externals * mentioned in EXTERNALS_TO_PIN. * The pinning operation takes place as part of the copy operation for * the source/destination pair PAIR. Use RA_SESSION and REPOS_ROOT_URL * to contact the repository containing the externals definition, if neccesary. * Use CX to fopen additional RA sessions to external repositories, if * neccessary. Allocate *NEW_EXTERNALS in RESULT_POOL. * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * resolve_pinned_externals(apr_hash_t **pinned_externals, const apr_hash_t *externals_to_pin, svn_client__copy_pair_t *pair, svn_ra_session_t *ra_session, const char *repos_root_url, svn_client_ctx_t *ctx, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *old_url = NULL; apr_hash_t *externals_props; apr_hash_index_t *hi; apr_pool_t *iterpool; *pinned_externals = apr_hash_make(result_pool); if (svn_path_is_url(pair->src_abspath_or_url)) { SVN_ERR(svn_client__ensure_ra_session_url(&old_url, ra_session, pair->src_abspath_or_url, scratch_pool)); externals_props = apr_hash_make(scratch_pool); SVN_ERR(svn_client__remote_propget(externals_props, NULL, SVN_PROP_EXTERNALS, pair->src_abspath_or_url, "", svn_node_dir, pair->src_revnum, ra_session, svn_depth_infinity, scratch_pool, scratch_pool)); } else { SVN_ERR(svn_wc__externals_gather_definitions(&externals_props, NULL, ctx->wc_ctx, pair->src_abspath_or_url, svn_depth_infinity, scratch_pool, scratch_pool)); /* ### gather_definitions returns propvals as const char * */ for (hi = apr_hash_first(scratch_pool, externals_props); hi; hi = apr_hash_next(hi)) { const char *local_abspath_or_url = apr_hash_this_key(hi); const char *propval = apr_hash_this_val(hi); svn_string_t *new_propval = svn_string_create(propval, scratch_pool); svn_hash_sets(externals_props, local_abspath_or_url, new_propval); } } if (apr_hash_count(externals_props) == 0) { if (old_url) SVN_ERR(svn_ra_reparent(ra_session, old_url, scratch_pool)); return SVN_NO_ERROR; } iterpool = svn_pool_create(scratch_pool); for (hi = apr_hash_first(scratch_pool, externals_props); hi; hi = apr_hash_next(hi)) { const char *local_abspath_or_url = apr_hash_this_key(hi); svn_string_t *externals_propval = apr_hash_this_val(hi); const char *relpath; svn_string_t *new_propval; svn_pool_clear(iterpool); SVN_ERR(pin_externals_prop(&new_propval, externals_propval, externals_to_pin, repos_root_url, local_abspath_or_url, ctx, result_pool, iterpool)); if (new_propval) { if (svn_path_is_url(pair->src_abspath_or_url)) relpath = svn_uri_skip_ancestor(pair->src_abspath_or_url, local_abspath_or_url, result_pool); else relpath = svn_dirent_skip_ancestor(pair->src_abspath_or_url, local_abspath_or_url); SVN_ERR_ASSERT(relpath); svn_hash_sets(*pinned_externals, relpath, new_propval); } } svn_pool_destroy(iterpool); if (old_url) SVN_ERR(svn_ra_reparent(ra_session, old_url, scratch_pool)); return SVN_NO_ERROR; } /* The guts of do_wc_to_wc_copies */ static svn_error_t * do_wc_to_wc_copies_with_write_lock(svn_boolean_t *timestamp_sleep, const apr_array_header_t *copy_pairs, const char *dst_parent, svn_boolean_t metadata_only, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, svn_client_ctx_t *ctx, apr_pool_t *scratch_pool) { int i; apr_pool_t *iterpool = svn_pool_create(scratch_pool); svn_error_t *err = SVN_NO_ERROR; for (i = 0; i < copy_pairs->nelts; i++) { const char *dst_abspath; svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); apr_hash_t *pinned_externals = NULL; svn_pool_clear(iterpool); /* Check for cancellation */ if (ctx->cancel_func) SVN_ERR(ctx->cancel_func(ctx->cancel_baton)); if (pin_externals) { const char *repos_root_url; SVN_ERR(svn_wc__node_get_origin(NULL, NULL, NULL, &repos_root_url, NULL, NULL, NULL, ctx->wc_ctx, pair->src_abspath_or_url, FALSE, scratch_pool, iterpool)); SVN_ERR(resolve_pinned_externals(&pinned_externals, externals_to_pin, pair, NULL, repos_root_url, ctx, iterpool, iterpool)); } /* Perform the copy */ dst_abspath = svn_dirent_join(pair->dst_parent_abspath, pair->base_name, iterpool); *timestamp_sleep = TRUE; err = svn_wc_copy3(ctx->wc_ctx, pair->src_abspath_or_url, dst_abspath, metadata_only, ctx->cancel_func, ctx->cancel_baton, ctx->notify_func2, ctx->notify_baton2, iterpool); if (err) break; if (pinned_externals) { apr_hash_index_t *hi; for (hi = apr_hash_first(iterpool, pinned_externals); hi; hi = apr_hash_next(hi)) { const char *dst_relpath = apr_hash_this_key(hi); svn_string_t *externals_propval = apr_hash_this_val(hi); const char *local_abspath; local_abspath = svn_dirent_join(pair->dst_abspath_or_url, dst_relpath, iterpool); /* ### use a work queue? */ SVN_ERR(svn_wc_prop_set4(ctx->wc_ctx, local_abspath, SVN_PROP_EXTERNALS, externals_propval, svn_depth_empty, TRUE /* skip_checks */, NULL /* changelist_filter */, ctx->cancel_func, ctx->cancel_baton, NULL, NULL, /* no extra notification */ iterpool)); } } } svn_pool_destroy(iterpool); SVN_ERR(err); return SVN_NO_ERROR; } /* Copy each COPY_PAIR->SRC into COPY_PAIR->DST. Use POOL for temporary allocations. */ static svn_error_t * do_wc_to_wc_copies(svn_boolean_t *timestamp_sleep, const apr_array_header_t *copy_pairs, svn_boolean_t metadata_only, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, svn_client_ctx_t *ctx, apr_pool_t *pool) { const char *dst_parent, *dst_parent_abspath; SVN_ERR(get_copy_pair_ancestors(copy_pairs, NULL, &dst_parent, NULL, pool)); if (copy_pairs->nelts == 1) dst_parent = svn_dirent_dirname(dst_parent, pool); SVN_ERR(svn_dirent_get_absolute(&dst_parent_abspath, dst_parent, pool)); SVN_WC__CALL_WITH_WRITE_LOCK( do_wc_to_wc_copies_with_write_lock(timestamp_sleep, copy_pairs, dst_parent, metadata_only, pin_externals, externals_to_pin, ctx, pool), ctx->wc_ctx, dst_parent_abspath, FALSE, pool); return SVN_NO_ERROR; } /* The locked bit of do_wc_to_wc_moves. */ static svn_error_t * do_wc_to_wc_moves_with_locks2(svn_client__copy_pair_t *pair, const char *dst_parent_abspath, svn_boolean_t lock_src, svn_boolean_t lock_dst, svn_boolean_t allow_mixed_revisions, svn_boolean_t metadata_only, svn_client_ctx_t *ctx, apr_pool_t *scratch_pool) { const char *dst_abspath; dst_abspath = svn_dirent_join(dst_parent_abspath, pair->base_name, scratch_pool); SVN_ERR(svn_wc__move2(ctx->wc_ctx, pair->src_abspath_or_url, dst_abspath, metadata_only, allow_mixed_revisions, ctx->cancel_func, ctx->cancel_baton, ctx->notify_func2, ctx->notify_baton2, scratch_pool)); return SVN_NO_ERROR; } /* Wrapper to add an optional second lock */ static svn_error_t * do_wc_to_wc_moves_with_locks1(svn_client__copy_pair_t *pair, const char *dst_parent_abspath, svn_boolean_t lock_src, svn_boolean_t lock_dst, svn_boolean_t allow_mixed_revisions, svn_boolean_t metadata_only, svn_client_ctx_t *ctx, apr_pool_t *scratch_pool) { if (lock_dst) SVN_WC__CALL_WITH_WRITE_LOCK( do_wc_to_wc_moves_with_locks2(pair, dst_parent_abspath, lock_src, lock_dst, allow_mixed_revisions, metadata_only, ctx, scratch_pool), ctx->wc_ctx, dst_parent_abspath, FALSE, scratch_pool); else SVN_ERR(do_wc_to_wc_moves_with_locks2(pair, dst_parent_abspath, lock_src, lock_dst, allow_mixed_revisions, metadata_only, ctx, scratch_pool)); return SVN_NO_ERROR; } /* Move each COPY_PAIR->SRC into COPY_PAIR->DST, deleting COPY_PAIR->SRC afterwards. Use POOL for temporary allocations. */ static svn_error_t * do_wc_to_wc_moves(svn_boolean_t *timestamp_sleep, const apr_array_header_t *copy_pairs, const char *dst_path, svn_boolean_t allow_mixed_revisions, svn_boolean_t metadata_only, svn_client_ctx_t *ctx, apr_pool_t *pool) { int i; apr_pool_t *iterpool = svn_pool_create(pool); svn_error_t *err = SVN_NO_ERROR; for (i = 0; i < copy_pairs->nelts; i++) { const char *src_parent_abspath; svn_boolean_t lock_src, lock_dst; const char *src_wcroot_abspath; const char *dst_wcroot_abspath; svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_pool_clear(iterpool); /* Check for cancellation */ if (ctx->cancel_func) SVN_ERR(ctx->cancel_func(ctx->cancel_baton)); src_parent_abspath = svn_dirent_dirname(pair->src_abspath_or_url, iterpool); SVN_ERR(svn_wc__get_wcroot(&src_wcroot_abspath, ctx->wc_ctx, src_parent_abspath, iterpool, iterpool)); SVN_ERR(svn_wc__get_wcroot(&dst_wcroot_abspath, ctx->wc_ctx, pair->dst_parent_abspath, iterpool, iterpool)); /* We now need to lock the right combination of batons. Four cases: 1) src_parent == dst_parent 2) src_parent is parent of dst_parent 3) dst_parent is parent of src_parent 4) src_parent and dst_parent are disjoint We can handle 1) as either 2) or 3) */ if (strcmp(src_parent_abspath, pair->dst_parent_abspath) == 0 || (svn_dirent_is_child(src_parent_abspath, pair->dst_parent_abspath, NULL) && !svn_dirent_is_child(src_parent_abspath, dst_wcroot_abspath, NULL))) { lock_src = TRUE; lock_dst = FALSE; } else if (svn_dirent_is_child(pair->dst_parent_abspath, src_parent_abspath, NULL) && !svn_dirent_is_child(pair->dst_parent_abspath, src_wcroot_abspath, NULL)) { lock_src = FALSE; lock_dst = TRUE; } else { lock_src = TRUE; lock_dst = TRUE; } *timestamp_sleep = TRUE; /* Perform the copy and then the delete. */ if (lock_src) SVN_WC__CALL_WITH_WRITE_LOCK( do_wc_to_wc_moves_with_locks1(pair, pair->dst_parent_abspath, lock_src, lock_dst, allow_mixed_revisions, metadata_only, ctx, iterpool), ctx->wc_ctx, src_parent_abspath, FALSE, iterpool); else SVN_ERR(do_wc_to_wc_moves_with_locks1(pair, pair->dst_parent_abspath, lock_src, lock_dst, allow_mixed_revisions, metadata_only, ctx, iterpool)); } svn_pool_destroy(iterpool); return svn_error_trace(err); } /* Verify that the destinations stored in COPY_PAIRS are valid working copy destinations and set pair->dst_parent_abspath and pair->base_name for each item to the resulting location if they do */ static svn_error_t * verify_wc_dsts(const apr_array_header_t *copy_pairs, svn_boolean_t make_parents, svn_boolean_t is_move, svn_boolean_t metadata_only, 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); /* Check that DST does not exist, but its parent does */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_node_kind_t dst_kind, dst_parent_kind; svn_pool_clear(iterpool); /* If DST_PATH does not exist, then its basename will become a new file or dir added to its parent (possibly an implicit '.'). Else, just error out. */ SVN_ERR(svn_wc_read_kind2(&dst_kind, ctx->wc_ctx, pair->dst_abspath_or_url, FALSE /* show_deleted */, TRUE /* show_hidden */, iterpool)); if (dst_kind != svn_node_none) { svn_boolean_t is_excluded; svn_boolean_t is_server_excluded; SVN_ERR(svn_wc__node_is_not_present(NULL, &is_excluded, &is_server_excluded, ctx->wc_ctx, pair->dst_abspath_or_url, FALSE, iterpool)); if (is_excluded || is_server_excluded) { return svn_error_createf( SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL, _("Path '%s' exists, but is excluded"), svn_dirent_local_style(pair->dst_abspath_or_url, iterpool)); } else return svn_error_createf( SVN_ERR_ENTRY_EXISTS, NULL, _("Path '%s' already exists"), svn_dirent_local_style(pair->dst_abspath_or_url, scratch_pool)); } /* Check that there is no unversioned obstruction */ if (metadata_only) dst_kind = svn_node_none; else SVN_ERR(svn_io_check_path(pair->dst_abspath_or_url, &dst_kind, iterpool)); if (dst_kind != svn_node_none) { if (is_move && copy_pairs->nelts == 1 && strcmp(svn_dirent_dirname(pair->src_abspath_or_url, iterpool), svn_dirent_dirname(pair->dst_abspath_or_url, iterpool)) == 0) { const char *dst; char *dst_apr; apr_status_t apr_err; /* We have a rename inside a directory, which might collide just because the case insensivity of the filesystem makes the source match the destination. */ SVN_ERR(svn_path_cstring_from_utf8(&dst, pair->dst_abspath_or_url, scratch_pool)); apr_err = apr_filepath_merge(&dst_apr, NULL, dst, APR_FILEPATH_TRUENAME, iterpool); if (!apr_err) { /* And now bring it back to our canonical format */ SVN_ERR(svn_path_cstring_to_utf8(&dst, dst_apr, iterpool)); dst = svn_dirent_canonicalize(dst, iterpool); } /* else: Don't report this error; just report the normal error */ if (!apr_err && strcmp(dst, pair->src_abspath_or_url) == 0) { /* Ok, we have a single case only rename. Get out of here */ svn_dirent_split(&pair->dst_parent_abspath, &pair->base_name, pair->dst_abspath_or_url, result_pool); svn_pool_destroy(iterpool); return SVN_NO_ERROR; } } return svn_error_createf( SVN_ERR_ENTRY_EXISTS, NULL, _("Path '%s' already exists as unversioned node"), svn_dirent_local_style(pair->dst_abspath_or_url, scratch_pool)); } svn_dirent_split(&pair->dst_parent_abspath, &pair->base_name, pair->dst_abspath_or_url, result_pool); /* Make sure the destination parent is a directory and produce a clear error message if it is not. */ SVN_ERR(svn_wc_read_kind2(&dst_parent_kind, ctx->wc_ctx, pair->dst_parent_abspath, FALSE, TRUE, iterpool)); - if (make_parents && dst_parent_kind == svn_node_none) + if (dst_parent_kind == svn_node_none) { - SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath, - TRUE, ctx, iterpool)); + if (make_parents) + SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath, + TRUE, ctx, iterpool)); + else + { + SVN_ERR(svn_io_check_path(pair->dst_parent_abspath, + &dst_parent_kind, scratch_pool)); + return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL, + (dst_parent_kind == svn_node_dir) + ? _("Directory '%s' is not under " + "version control") + : _("Path '%s' is not a directory"), + svn_dirent_local_style( + pair->dst_parent_abspath, + scratch_pool)); + } } else if (dst_parent_kind != svn_node_dir) { return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL, _("Path '%s' is not a directory"), svn_dirent_local_style( pair->dst_parent_abspath, scratch_pool)); } SVN_ERR(svn_io_check_path(pair->dst_parent_abspath, &dst_parent_kind, scratch_pool)); if (dst_parent_kind != svn_node_dir) return svn_error_createf(SVN_ERR_WC_MISSING, NULL, _("Path '%s' is not a directory"), svn_dirent_local_style( pair->dst_parent_abspath, scratch_pool)); } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } static svn_error_t * verify_wc_srcs_and_dsts(const apr_array_header_t *copy_pairs, svn_boolean_t make_parents, svn_boolean_t is_move, svn_boolean_t metadata_only, 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); /* Check that all of our SRCs exist. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_boolean_t deleted_ok; svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_pool_clear(iterpool); deleted_ok = (pair->src_peg_revision.kind == svn_opt_revision_base || pair->src_op_revision.kind == svn_opt_revision_base); /* Verify that SRC_PATH exists. */ SVN_ERR(svn_wc_read_kind2(&pair->src_kind, ctx->wc_ctx, pair->src_abspath_or_url, deleted_ok, FALSE, iterpool)); if (pair->src_kind == svn_node_none) return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL, _("Path '%s' does not exist"), svn_dirent_local_style( pair->src_abspath_or_url, scratch_pool)); } SVN_ERR(verify_wc_dsts(copy_pairs, make_parents, is_move, metadata_only, ctx, result_pool, iterpool)); svn_pool_destroy(iterpool); return SVN_NO_ERROR; } /* Path-specific state used as part of path_driver_cb_baton. */ typedef struct path_driver_info_t { const char *src_url; const char *src_path; const char *dst_path; svn_node_kind_t src_kind; svn_revnum_t src_revnum; svn_boolean_t resurrection; svn_boolean_t dir_add; svn_string_t *mergeinfo; /* the new mergeinfo for the target */ svn_string_t *externals; /* new externals definitions for the target */ svn_boolean_t only_pin_externals; } path_driver_info_t; /* The baton used with the path_driver_cb_func() callback for a copy or move operation. */ struct path_driver_cb_baton { /* The editor (and its state) used to perform the operation. */ const svn_delta_editor_t *editor; void *edit_baton; /* A hash of path -> path_driver_info_t *'s. */ apr_hash_t *action_hash; /* Whether the operation is a move or copy. */ svn_boolean_t is_move; }; static svn_error_t * path_driver_cb_func(void **dir_baton, void *parent_baton, void *callback_baton, const char *path, apr_pool_t *pool) { struct path_driver_cb_baton *cb_baton = callback_baton; svn_boolean_t do_delete = FALSE, do_add = FALSE; path_driver_info_t *path_info = svn_hash_gets(cb_baton->action_hash, path); /* Initialize return value. */ *dir_baton = NULL; /* This function should never get an empty PATH. We can neither create nor delete the empty PATH, so if someone is calling us with such, the code is just plain wrong. */ SVN_ERR_ASSERT(! svn_path_is_empty(path)); /* Check to see if we need to add the path as a parent directory. */ if (path_info->dir_add) { return cb_baton->editor->add_directory(path, parent_baton, NULL, SVN_INVALID_REVNUM, pool, dir_baton); } /* If this is a resurrection, we know the source and dest paths are the same, and that our driver will only be calling us once. */ if (path_info->resurrection) { /* If this is a move, we do nothing. Otherwise, we do the copy. */ if (! cb_baton->is_move) do_add = TRUE; } /* Not a resurrection. */ else { /* If this is a move, we check PATH to see if it is the source or the destination of the move. */ if (cb_baton->is_move) { if (strcmp(path_info->src_path, path) == 0) do_delete = TRUE; else do_add = TRUE; } /* Not a move? This must just be the copy addition. */ else { do_add = !path_info->only_pin_externals; } } if (do_delete) { SVN_ERR(cb_baton->editor->delete_entry(path, SVN_INVALID_REVNUM, parent_baton, pool)); } if (do_add) { SVN_ERR(svn_path_check_valid(path, pool)); if (path_info->src_kind == svn_node_file) { void *file_baton; SVN_ERR(cb_baton->editor->add_file(path, parent_baton, path_info->src_url, path_info->src_revnum, pool, &file_baton)); if (path_info->mergeinfo) SVN_ERR(cb_baton->editor->change_file_prop(file_baton, SVN_PROP_MERGEINFO, path_info->mergeinfo, pool)); SVN_ERR(cb_baton->editor->close_file(file_baton, NULL, pool)); } else { SVN_ERR(cb_baton->editor->add_directory(path, parent_baton, path_info->src_url, path_info->src_revnum, pool, dir_baton)); if (path_info->mergeinfo) SVN_ERR(cb_baton->editor->change_dir_prop(*dir_baton, SVN_PROP_MERGEINFO, path_info->mergeinfo, pool)); } } if (path_info->externals) { if (*dir_baton == NULL) SVN_ERR(cb_baton->editor->open_directory(path, parent_baton, SVN_INVALID_REVNUM, pool, dir_baton)); SVN_ERR(cb_baton->editor->change_dir_prop(*dir_baton, SVN_PROP_EXTERNALS, path_info->externals, pool)); } return SVN_NO_ERROR; } /* Starting with the path DIR relative to the RA_SESSION's session URL, work up through DIR's parents until an existing node is found. Push each nonexistent path onto the array NEW_DIRS, allocating in POOL. Raise an error if the existing node is not a directory. ### Multiple requests for HEAD (SVN_INVALID_REVNUM) make this ### implementation susceptible to race conditions. */ static svn_error_t * find_absent_parents1(svn_ra_session_t *ra_session, const char *dir, apr_array_header_t *new_dirs, apr_pool_t *pool) { svn_node_kind_t kind; apr_pool_t *iterpool = svn_pool_create(pool); SVN_ERR(svn_ra_check_path(ra_session, dir, SVN_INVALID_REVNUM, &kind, iterpool)); while (kind == svn_node_none) { svn_pool_clear(iterpool); APR_ARRAY_PUSH(new_dirs, const char *) = dir; dir = svn_dirent_dirname(dir, pool); SVN_ERR(svn_ra_check_path(ra_session, dir, SVN_INVALID_REVNUM, &kind, iterpool)); } if (kind != svn_node_dir) return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, _("Path '%s' already exists, but is not a " "directory"), dir); svn_pool_destroy(iterpool); return SVN_NO_ERROR; } /* Starting with the URL *TOP_DST_URL which is also the root of RA_SESSION, work up through its parents until an existing node is found. Push each nonexistent URL onto the array NEW_DIRS, allocating in POOL. Raise an error if the existing node is not a directory. Set *TOP_DST_URL and the RA session's root to the existing node's URL. ### Multiple requests for HEAD (SVN_INVALID_REVNUM) make this ### implementation susceptible to race conditions. */ static svn_error_t * find_absent_parents2(svn_ra_session_t *ra_session, const char **top_dst_url, apr_array_header_t *new_dirs, apr_pool_t *pool) { const char *root_url = *top_dst_url; svn_node_kind_t kind; SVN_ERR(svn_ra_check_path(ra_session, "", SVN_INVALID_REVNUM, &kind, pool)); while (kind == svn_node_none) { APR_ARRAY_PUSH(new_dirs, const char *) = root_url; root_url = svn_uri_dirname(root_url, pool); SVN_ERR(svn_ra_reparent(ra_session, root_url, pool)); SVN_ERR(svn_ra_check_path(ra_session, "", SVN_INVALID_REVNUM, &kind, pool)); } if (kind != svn_node_dir) return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, _("Path '%s' already exists, but is not a directory"), root_url); *top_dst_url = root_url; return SVN_NO_ERROR; } /* Queue property changes for pinning svn:externals properties set on * descendants of the path corresponding to PARENT_INFO. PINNED_EXTERNALS * is keyed by the relative path of each descendant which should have some * or all of its externals pinned, with the corresponding pinned svn:externals * properties as values. Property changes are queued in a new list of path * infos *NEW_PATH_INFOS, or in an existing item of the PATH_INFOS list if an * existing item is found for the descendant. Allocate results in RESULT_POOL. * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * queue_externals_change_path_infos(apr_array_header_t *new_path_infos, apr_array_header_t *path_infos, apr_hash_t *pinned_externals, path_driver_info_t *parent_info, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { apr_pool_t *iterpool = svn_pool_create(scratch_pool); apr_hash_index_t *hi; for (hi = apr_hash_first(scratch_pool, pinned_externals); hi; hi = apr_hash_next(hi)) { const char *dst_relpath = apr_hash_this_key(hi); svn_string_t *externals_prop = apr_hash_this_val(hi); const char *src_url; path_driver_info_t *info; int i; svn_pool_clear(iterpool); src_url = svn_path_url_add_component2(parent_info->src_url, dst_relpath, iterpool); /* Try to find a path info the external change can be applied to. */ info = NULL; for (i = 0; i < path_infos->nelts; i++) { path_driver_info_t *existing_info; existing_info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *); if (strcmp(src_url, existing_info->src_url) == 0) { info = existing_info; break; } } if (info == NULL) { /* A copied-along child needs its externals pinned. Create a new path info for this property change. */ info = apr_pcalloc(result_pool, sizeof(*info)); info->src_url = svn_path_url_add_component2( parent_info->src_url, dst_relpath, result_pool); info->src_path = NULL; /* Only needed on copied dirs */ info->dst_path = svn_relpath_join(parent_info->dst_path, dst_relpath, result_pool); info->src_kind = svn_node_dir; info->only_pin_externals = TRUE; APR_ARRAY_PUSH(new_path_infos, path_driver_info_t *) = info; } info->externals = externals_prop; } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } static svn_error_t * repos_to_repos_copy(const apr_array_header_t *copy_pairs, svn_boolean_t make_parents, const apr_hash_t *revprop_table, svn_commit_callback2_t commit_callback, void *commit_baton, svn_client_ctx_t *ctx, svn_boolean_t is_move, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, apr_pool_t *pool) { svn_error_t *err; apr_array_header_t *paths = apr_array_make(pool, 2 * copy_pairs->nelts, sizeof(const char *)); apr_hash_t *action_hash = apr_hash_make(pool); apr_array_header_t *path_infos; const char *top_url, *top_url_all, *top_url_dst; const char *message, *repos_root; svn_ra_session_t *ra_session = NULL; const svn_delta_editor_t *editor; void *edit_baton; struct path_driver_cb_baton cb_baton; apr_array_header_t *new_dirs = NULL; apr_hash_t *commit_revprops; apr_array_header_t *pin_externals_only_infos = NULL; int i; svn_client__copy_pair_t *first_pair = APR_ARRAY_IDX(copy_pairs, 0, svn_client__copy_pair_t *); /* Open an RA session to the first copy pair's destination. We'll be verifying that every one of our copy source and destination URLs is or is beneath this sucker's repository root URL as a form of a cheap(ish) sanity check. */ SVN_ERR(svn_client_open_ra_session2(&ra_session, first_pair->src_abspath_or_url, NULL, ctx, pool, pool)); SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, pool)); /* Verify that sources and destinations are all at or under REPOS_ROOT. While here, create a path_info struct for each src/dst pair and initialize portions of it with normalized source location information. */ path_infos = apr_array_make(pool, copy_pairs->nelts, sizeof(path_driver_info_t *)); for (i = 0; i < copy_pairs->nelts; i++) { path_driver_info_t *info = apr_pcalloc(pool, sizeof(*info)); svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); apr_hash_t *mergeinfo; /* Are the source and destination URLs at or under REPOS_ROOT? */ if (! (svn_uri__is_ancestor(repos_root, pair->src_abspath_or_url) && svn_uri__is_ancestor(repos_root, pair->dst_abspath_or_url))) return svn_error_create (SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Source and destination URLs appear not to point to the " "same repository.")); /* Run the history function to get the source's URL and revnum in the operational revision. */ SVN_ERR(svn_ra_reparent(ra_session, pair->src_abspath_or_url, pool)); SVN_ERR(svn_client__repos_locations(&pair->src_abspath_or_url, &pair->src_revnum, NULL, NULL, ra_session, pair->src_abspath_or_url, &pair->src_peg_revision, &pair->src_op_revision, NULL, ctx, pool)); /* Go ahead and grab mergeinfo from the source, too. */ SVN_ERR(svn_ra_reparent(ra_session, pair->src_abspath_or_url, pool)); SVN_ERR(svn_client__get_repos_mergeinfo( &mergeinfo, ra_session, pair->src_abspath_or_url, pair->src_revnum, svn_mergeinfo_inherited, TRUE /*squelch_incapable*/, pool)); if (mergeinfo) SVN_ERR(svn_mergeinfo_to_string(&info->mergeinfo, mergeinfo, pool)); /* Plop an INFO structure onto our array thereof. */ info->src_url = pair->src_abspath_or_url; info->src_revnum = pair->src_revnum; info->resurrection = FALSE; APR_ARRAY_PUSH(path_infos, path_driver_info_t *) = info; } /* If this is a move, we have to open our session to the longest path common to all SRC_URLS and DST_URLS in the repository so we can do existence checks on all paths, and so we can operate on all paths in the case of a move. But if this is *not* a move, then opening our session at the longest path common to sources *and* destinations might be an optimization when the user is authorized to access all that stuff, but could cause the operation to fail altogether otherwise. See issue #3242. */ SVN_ERR(get_copy_pair_ancestors(copy_pairs, NULL, &top_url_dst, &top_url_all, pool)); top_url = is_move ? top_url_all : top_url_dst; /* Check each src/dst pair for resurrection, and verify that TOP_URL is anchored high enough to cover all the editor_t activities required for this operation. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *); /* Source and destination are the same? It's a resurrection. */ if (strcmp(pair->src_abspath_or_url, pair->dst_abspath_or_url) == 0) info->resurrection = TRUE; /* We need to add each dst_URL, and (in a move) we'll need to delete each src_URL. Our selection of TOP_URL so far ensures that all our destination URLs (and source URLs, for moves) are at least as deep as TOP_URL, but we need to make sure that TOP_URL is an *ancestor* of all our to-be-edited paths. Issue #683 is demonstrates this scenario. If you're resurrecting a deleted item like this: 'svn cp -rN src_URL dst_URL', then src_URL == dst_URL == top_url. In this situation, we want to open an RA session to be at least the *parent* of all three. */ if ((strcmp(top_url, pair->dst_abspath_or_url) == 0) && (strcmp(top_url, repos_root) != 0)) { top_url = svn_uri_dirname(top_url, pool); } if (is_move && (strcmp(top_url, pair->src_abspath_or_url) == 0) && (strcmp(top_url, repos_root) != 0)) { top_url = svn_uri_dirname(top_url, pool); } } /* Point the RA session to our current TOP_URL. */ SVN_ERR(svn_ra_reparent(ra_session, top_url, pool)); /* If we're allowed to create nonexistent parent directories of our destinations, then make a list in NEW_DIRS of the parent directories of the destination that don't yet exist. */ if (make_parents) { new_dirs = apr_array_make(pool, 0, sizeof(const char *)); /* If this is a move, TOP_URL is at least the common ancestor of all the paths (sources and destinations) involved. Assuming the sources exist (which is fair, because if they don't, this whole operation will fail anyway), TOP_URL must also exist. So it's the paths between TOP_URL and the destinations which we have to check for existence. But here, we take advantage of the knowledge of our caller. We know that if there are multiple copy/move operations being requested, then the destinations of the copies/moves will all be siblings of one another. Therefore, we need only to check for the nonexistent paths between TOP_URL and *one* of our destinations to find nonexistent parents of all of them. */ if (is_move) { /* Imagine a situation where the user tries to copy an existing source directory to nonexistent directory with --parents options specified: svn copy --parents URL/src URL/dst where src exists and dst does not. If the dirname of the destination path is equal to TOP_URL, do not try to add dst to the NEW_DIRS list since it will be added to the commit items array later in this function. */ const char *dir = svn_uri_skip_ancestor( top_url, svn_uri_dirname(first_pair->dst_abspath_or_url, pool), pool); if (dir && *dir) SVN_ERR(find_absent_parents1(ra_session, dir, new_dirs, pool)); } /* If, however, this is *not* a move, TOP_URL only points to the common ancestor of our destination path(s), or possibly one level higher. We'll need to do an existence crawl toward the root of the repository, starting with one of our destinations (see "... take advantage of the knowledge of our caller ..." above), and possibly adjusting TOP_URL as we go. */ else { apr_array_header_t *new_urls = apr_array_make(pool, 0, sizeof(const char *)); SVN_ERR(find_absent_parents2(ra_session, &top_url, new_urls, pool)); /* Convert absolute URLs into relpaths relative to TOP_URL. */ for (i = 0; i < new_urls->nelts; i++) { const char *new_url = APR_ARRAY_IDX(new_urls, i, const char *); const char *dir = svn_uri_skip_ancestor(top_url, new_url, pool); APR_ARRAY_PUSH(new_dirs, const char *) = dir; } } } /* For each src/dst pair, check to see if that SRC_URL is a child of the DST_URL (excepting the case where DST_URL is the repo root). If it is, and the parent of DST_URL is the current TOP_URL, then we need to reparent the session one directory higher, the parent of the DST_URL. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *); const char *relpath = svn_uri_skip_ancestor(pair->dst_abspath_or_url, pair->src_abspath_or_url, pool); if ((strcmp(pair->dst_abspath_or_url, repos_root) != 0) && (relpath != NULL && *relpath != '\0')) { info->resurrection = TRUE; top_url = svn_uri_get_longest_ancestor( top_url, svn_uri_dirname(pair->dst_abspath_or_url, pool), pool); SVN_ERR(svn_ra_reparent(ra_session, top_url, pool)); } } /* Get the portions of the SRC and DST URLs that are relative to TOP_URL (URI-decoding them while we're at it), verify that the source exists and the proposed destination does not, and toss what we've learned into the INFO array. (For copies -- that is, non-moves -- the relative source URL NULL because it isn't a child of the TOP_URL at all. That's okay, we'll deal with it.) */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *); svn_node_kind_t dst_kind; const char *src_rel, *dst_rel; src_rel = svn_uri_skip_ancestor(top_url, pair->src_abspath_or_url, pool); if (src_rel) { SVN_ERR(svn_ra_check_path(ra_session, src_rel, pair->src_revnum, &info->src_kind, pool)); } else { const char *old_url; src_rel = NULL; SVN_ERR_ASSERT(! is_move); SVN_ERR(svn_client__ensure_ra_session_url(&old_url, ra_session, pair->src_abspath_or_url, pool)); SVN_ERR(svn_ra_check_path(ra_session, "", pair->src_revnum, &info->src_kind, pool)); SVN_ERR(svn_ra_reparent(ra_session, old_url, pool)); } if (info->src_kind == svn_node_none) return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL, _("Path '%s' does not exist in revision %ld"), pair->src_abspath_or_url, pair->src_revnum); /* Figure out the basename that will result from this operation, and ensure that we aren't trying to overwrite existing paths. */ dst_rel = svn_uri_skip_ancestor(top_url, pair->dst_abspath_or_url, pool); SVN_ERR(svn_ra_check_path(ra_session, dst_rel, SVN_INVALID_REVNUM, &dst_kind, pool)); if (dst_kind != svn_node_none) { const char *path = svn_uri_skip_ancestor(repos_root, pair->dst_abspath_or_url, pool); return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, _("Path '/%s' already exists"), path); } /* More info for our INFO structure. */ info->src_path = src_rel; /* May be NULL, if outside RA session scope */ info->dst_path = dst_rel; svn_hash_sets(action_hash, info->dst_path, info); if (is_move && (! info->resurrection)) svn_hash_sets(action_hash, info->src_path, info); if (pin_externals) { apr_hash_t *pinned_externals; SVN_ERR(resolve_pinned_externals(&pinned_externals, externals_to_pin, pair, ra_session, repos_root, ctx, pool, pool)); if (pin_externals_only_infos == NULL) { pin_externals_only_infos = apr_array_make(pool, 0, sizeof(path_driver_info_t *)); } SVN_ERR(queue_externals_change_path_infos(pin_externals_only_infos, path_infos, pinned_externals, info, pool, pool)); } } if (SVN_CLIENT__HAS_LOG_MSG_FUNC(ctx)) { /* Produce a list of new paths to add, and provide it to the mechanism used to acquire a log message. */ svn_client_commit_item3_t *item; const char *tmp_file; apr_array_header_t *commit_items = apr_array_make(pool, 2 * copy_pairs->nelts, sizeof(item)); /* Add any intermediate directories to the message */ if (make_parents) { for (i = 0; i < new_dirs->nelts; i++) { const char *relpath = APR_ARRAY_IDX(new_dirs, i, const char *); item = svn_client_commit_item3_create(pool); item->url = svn_path_url_add_component2(top_url, relpath, pool); item->kind = svn_node_dir; item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD; APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item; } } for (i = 0; i < path_infos->nelts; i++) { path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *); item = svn_client_commit_item3_create(pool); item->url = svn_path_url_add_component2(top_url, info->dst_path, pool); item->kind = info->src_kind; item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD | SVN_CLIENT_COMMIT_ITEM_IS_COPY; item->copyfrom_url = info->src_url; item->copyfrom_rev = info->src_revnum; APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item; if (is_move && (! info->resurrection)) { item = svn_client_commit_item3_create(pool); item->url = svn_path_url_add_component2(top_url, info->src_path, pool); item->kind = info->src_kind; item->state_flags = SVN_CLIENT_COMMIT_ITEM_DELETE; APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item; } } SVN_ERR(svn_client__get_log_msg(&message, &tmp_file, commit_items, ctx, pool)); if (! message) return SVN_NO_ERROR; } else message = ""; /* Setup our PATHS for the path-based editor drive. */ /* First any intermediate directories. */ if (make_parents) { for (i = 0; i < new_dirs->nelts; i++) { const char *relpath = APR_ARRAY_IDX(new_dirs, i, const char *); path_driver_info_t *info = apr_pcalloc(pool, sizeof(*info)); info->dst_path = relpath; info->dir_add = TRUE; APR_ARRAY_PUSH(paths, const char *) = relpath; svn_hash_sets(action_hash, relpath, info); } } /* Then our copy destinations and move sources (if any). */ for (i = 0; i < path_infos->nelts; i++) { path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *); APR_ARRAY_PUSH(paths, const char *) = info->dst_path; if (is_move && (! info->resurrection)) APR_ARRAY_PUSH(paths, const char *) = info->src_path; } /* Add any items which only need their externals pinned. */ if (pin_externals_only_infos) { for (i = 0; i < pin_externals_only_infos->nelts; i++) { path_driver_info_t *info; info = APR_ARRAY_IDX(pin_externals_only_infos, i, path_driver_info_t *); APR_ARRAY_PUSH(paths, const char *) = info->dst_path; svn_hash_sets(action_hash, info->dst_path, info); } } SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table, message, ctx, pool)); /* Fetch RA commit editor. */ SVN_ERR(svn_ra__register_editor_shim_callbacks(ra_session, svn_client__get_shim_callbacks(ctx->wc_ctx, NULL, pool))); SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton, commit_revprops, commit_callback, commit_baton, NULL, TRUE, /* No lock tokens */ pool)); /* Setup the callback baton. */ cb_baton.editor = editor; cb_baton.edit_baton = edit_baton; cb_baton.action_hash = action_hash; cb_baton.is_move = is_move; /* Call the path-based editor driver. */ err = svn_delta_path_driver2(editor, edit_baton, paths, TRUE, path_driver_cb_func, &cb_baton, pool); if (err) { /* At least try to abort the edit (and fs txn) before throwing err. */ return svn_error_compose_create( err, editor->abort_edit(edit_baton, pool)); } if (ctx->notify_func2) { svn_wc_notify_t *notify; notify = svn_wc_create_notify_url(top_url, svn_wc_notify_commit_finalizing, pool); ctx->notify_func2(ctx->notify_baton2, notify, pool); } /* Close the edit. */ return svn_error_trace(editor->close_edit(edit_baton, pool)); } /* Baton for check_url_kind */ struct check_url_kind_baton { svn_ra_session_t *session; const char *repos_root_url; svn_boolean_t should_reparent; }; /* Implements svn_client__check_url_kind_t for wc_to_repos_copy */ static svn_error_t * check_url_kind(void *baton, svn_node_kind_t *kind, const char *url, svn_revnum_t revision, apr_pool_t *scratch_pool) { struct check_url_kind_baton *cukb = baton; /* If we don't have a session or can't use the session, get one */ if (!svn_uri__is_ancestor(cukb->repos_root_url, url)) *kind = svn_node_none; else { cukb->should_reparent = TRUE; SVN_ERR(svn_ra_reparent(cukb->session, url, scratch_pool)); SVN_ERR(svn_ra_check_path(cukb->session, "", revision, kind, scratch_pool)); } return SVN_NO_ERROR; } /* Queue a property change on a copy of LOCAL_ABSPATH to COMMIT_URL * in the COMMIT_ITEMS list. * If the list does not already have a commit item for COMMIT_URL * add a new commit item for the property change. * Allocate results in RESULT_POOL. * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * queue_prop_change_commit_items(const char *local_abspath, const char *commit_url, apr_array_header_t *commit_items, const char *propname, svn_string_t *propval, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_client_commit_item3_t *item = NULL; svn_prop_t *prop; int i; for (i = 0; i < commit_items->nelts; i++) { svn_client_commit_item3_t *existing_item; existing_item = APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *); if (strcmp(existing_item->url, commit_url) == 0) { item = existing_item; break; } } if (item == NULL) { item = svn_client_commit_item3_create(result_pool); item->path = local_abspath; item->url = commit_url; item->kind = svn_node_dir; item->state_flags = SVN_CLIENT_COMMIT_ITEM_PROP_MODS; item->incoming_prop_changes = apr_array_make(result_pool, 1, sizeof(svn_prop_t *)); APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item; } else item->state_flags |= SVN_CLIENT_COMMIT_ITEM_PROP_MODS; if (item->outgoing_prop_changes == NULL) item->outgoing_prop_changes = apr_array_make(result_pool, 1, sizeof(svn_prop_t *)); prop = apr_palloc(result_pool, sizeof(*prop)); prop->name = propname; prop->value = propval; APR_ARRAY_PUSH(item->outgoing_prop_changes, svn_prop_t *) = prop; return SVN_NO_ERROR; } /* ### Copy ... * COMMIT_INFO_P is ... * COPY_PAIRS is ... such that each 'src_abspath_or_url' is a local abspath * and each 'dst_abspath_or_url' is a URL. * MAKE_PARENTS is ... * REVPROP_TABLE is ... * CTX is ... */ static svn_error_t * wc_to_repos_copy(const apr_array_header_t *copy_pairs, svn_boolean_t make_parents, const apr_hash_t *revprop_table, svn_commit_callback2_t commit_callback, void *commit_baton, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, svn_client_ctx_t *ctx, apr_pool_t *scratch_pool) { const char *message; const char *top_src_path, *top_dst_url; struct check_url_kind_baton cukb; const char *top_src_abspath; svn_ra_session_t *ra_session; const svn_delta_editor_t *editor; #ifdef ENABLE_EV2_SHIMS apr_hash_t *relpath_map = NULL; #endif void *edit_baton; svn_client__committables_t *committables; apr_array_header_t *commit_items; apr_pool_t *iterpool; apr_array_header_t *new_dirs = NULL; apr_hash_t *commit_revprops; svn_client__copy_pair_t *first_pair; apr_pool_t *session_pool = svn_pool_create(scratch_pool); apr_array_header_t *commit_items_for_dav; int i; /* Find the common root of all the source paths */ SVN_ERR(get_copy_pair_ancestors(copy_pairs, &top_src_path, NULL, NULL, scratch_pool)); /* Do we need to lock the working copy? 1.6 didn't take a write lock, but what happens if the working copy changes during the copy operation? */ iterpool = svn_pool_create(scratch_pool); /* Determine the longest common ancestor for the destinations, and open an RA session to that location. */ /* ### But why start by getting the _parent_ of the first one? */ /* --- That works because multiple destinations always point to the same * directory. I'm rather wondering why we need to find a common * destination parent here at all, instead of simply getting * top_dst_url from get_copy_pair_ancestors() above? * It looks like the entire block of code hanging off this comment * is redundant. */ first_pair = APR_ARRAY_IDX(copy_pairs, 0, svn_client__copy_pair_t *); top_dst_url = svn_uri_dirname(first_pair->dst_abspath_or_url, scratch_pool); for (i = 1; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); top_dst_url = svn_uri_get_longest_ancestor(top_dst_url, pair->dst_abspath_or_url, scratch_pool); } SVN_ERR(svn_dirent_get_absolute(&top_src_abspath, top_src_path, scratch_pool)); commit_items_for_dav = apr_array_make(session_pool, 0, sizeof(svn_client_commit_item3_t*)); /* Open a session to help while determining the exact targets */ SVN_ERR(svn_client__open_ra_session_internal(&ra_session, NULL, top_dst_url, top_src_abspath, commit_items_for_dav, FALSE /* write_dav_props */, TRUE /* read_dav_props */, ctx, session_pool, session_pool)); /* If requested, determine the nearest existing parent of the destination, and reparent the ra session there. */ if (make_parents) { new_dirs = apr_array_make(scratch_pool, 0, sizeof(const char *)); SVN_ERR(find_absent_parents2(ra_session, &top_dst_url, new_dirs, scratch_pool)); } /* Figure out the basename that will result from each copy and check to make sure it doesn't exist already. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_node_kind_t dst_kind; const char *dst_rel; svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_pool_clear(iterpool); dst_rel = svn_uri_skip_ancestor(top_dst_url, pair->dst_abspath_or_url, iterpool); SVN_ERR(svn_ra_check_path(ra_session, dst_rel, SVN_INVALID_REVNUM, &dst_kind, iterpool)); if (dst_kind != svn_node_none) { return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, _("Path '%s' already exists"), pair->dst_abspath_or_url); } } cukb.session = ra_session; SVN_ERR(svn_ra_get_repos_root2(ra_session, &cukb.repos_root_url, session_pool)); cukb.should_reparent = FALSE; /* Crawl the working copy for commit items. */ /* ### TODO: Pass check_url_func for issue #3314 handling */ SVN_ERR(svn_client__get_copy_committables(&committables, copy_pairs, check_url_kind, &cukb, ctx, scratch_pool, iterpool)); /* The committables are keyed by the repository root */ commit_items = svn_hash_gets(committables->by_repository, cukb.repos_root_url); SVN_ERR_ASSERT(commit_items != NULL); if (cukb.should_reparent) SVN_ERR(svn_ra_reparent(ra_session, top_dst_url, session_pool)); /* If we are creating intermediate directories, tack them onto the list of committables. */ if (make_parents) { for (i = 0; i < new_dirs->nelts; i++) { const char *url = APR_ARRAY_IDX(new_dirs, i, const char *); svn_client_commit_item3_t *item; item = svn_client_commit_item3_create(scratch_pool); item->url = url; item->kind = svn_node_dir; item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD; item->incoming_prop_changes = apr_array_make(scratch_pool, 1, sizeof(svn_prop_t *)); APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item; } } /* ### TODO: This extra loop would be unnecessary if this code lived ### in svn_client__get_copy_committables(), which is incidentally ### only used above (so should really be in this source file). */ for (i = 0; i < copy_pairs->nelts; i++) { apr_hash_t *mergeinfo, *wc_mergeinfo; svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_client_commit_item3_t *item = APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *); svn_client__pathrev_t *src_origin; svn_pool_clear(iterpool); SVN_ERR(svn_client__wc_node_get_origin(&src_origin, pair->src_abspath_or_url, ctx, iterpool, iterpool)); /* Set the mergeinfo for the destination to the combined merge info known to the WC and the repository. */ /* Repository mergeinfo (or NULL if it's locally added)... */ if (src_origin) SVN_ERR(svn_client__get_repos_mergeinfo( &mergeinfo, ra_session, src_origin->url, src_origin->rev, svn_mergeinfo_inherited, TRUE /*sqelch_inc.*/, iterpool)); else mergeinfo = NULL; /* ... and WC mergeinfo. */ SVN_ERR(svn_client__parse_mergeinfo(&wc_mergeinfo, ctx->wc_ctx, pair->src_abspath_or_url, iterpool, iterpool)); if (wc_mergeinfo && mergeinfo) SVN_ERR(svn_mergeinfo_merge2(mergeinfo, wc_mergeinfo, iterpool, iterpool)); else if (! mergeinfo) mergeinfo = wc_mergeinfo; if (mergeinfo) { /* Push a mergeinfo prop representing MERGEINFO onto the * OUTGOING_PROP_CHANGES array. */ svn_prop_t *mergeinfo_prop = apr_palloc(scratch_pool, sizeof(*mergeinfo_prop)); svn_string_t *prop_value; SVN_ERR(svn_mergeinfo_to_string(&prop_value, mergeinfo, scratch_pool)); if (!item->outgoing_prop_changes) { item->outgoing_prop_changes = apr_array_make(scratch_pool, 1, sizeof(svn_prop_t *)); } mergeinfo_prop->name = SVN_PROP_MERGEINFO; mergeinfo_prop->value = prop_value; APR_ARRAY_PUSH(item->outgoing_prop_changes, svn_prop_t *) = mergeinfo_prop; } if (pin_externals) { apr_hash_t *pinned_externals; apr_hash_index_t *hi; SVN_ERR(resolve_pinned_externals(&pinned_externals, externals_to_pin, pair, ra_session, cukb.repos_root_url, ctx, scratch_pool, iterpool)); for (hi = apr_hash_first(scratch_pool, pinned_externals); hi; hi = apr_hash_next(hi)) { const char *dst_relpath = apr_hash_this_key(hi); svn_string_t *externals_propval = apr_hash_this_val(hi); const char *dst_url; const char *commit_url; const char *src_abspath; if (svn_path_is_url(pair->dst_abspath_or_url)) dst_url = pair->dst_abspath_or_url; else SVN_ERR(svn_wc__node_get_url(&dst_url, ctx->wc_ctx, pair->dst_abspath_or_url, scratch_pool, iterpool)); commit_url = svn_path_url_add_component2(dst_url, dst_relpath, scratch_pool); src_abspath = svn_dirent_join(pair->src_abspath_or_url, dst_relpath, iterpool); SVN_ERR(queue_prop_change_commit_items(src_abspath, commit_url, commit_items, SVN_PROP_EXTERNALS, externals_propval, scratch_pool, iterpool)); } } } if (SVN_CLIENT__HAS_LOG_MSG_FUNC(ctx)) { const char *tmp_file; SVN_ERR(svn_client__get_log_msg(&message, &tmp_file, commit_items, ctx, scratch_pool)); if (! message) { svn_pool_destroy(iterpool); svn_pool_destroy(session_pool); return SVN_NO_ERROR; } } else message = ""; /* Sort and condense our COMMIT_ITEMS. */ SVN_ERR(svn_client__condense_commit_items(&top_dst_url, commit_items, scratch_pool)); /* Add the commit items to the DAV commit item list to provide access to dav properties (for pre http-v2 DAV) */ apr_array_cat(commit_items_for_dav, commit_items); #ifdef ENABLE_EV2_SHIMS if (commit_items) { relpath_map = apr_hash_make(scratch_pool); for (i = 0; i < commit_items->nelts; i++) { svn_client_commit_item3_t *item = APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *); const char *relpath; if (!item->path) continue; svn_pool_clear(iterpool); SVN_ERR(svn_wc__node_get_origin(NULL, NULL, &relpath, NULL, NULL, NULL, NULL, ctx->wc_ctx, item->path, FALSE, scratch_pool, iterpool)); if (relpath) svn_hash_sets(relpath_map, relpath, item->path); } } #endif SVN_ERR(svn_ra_reparent(ra_session, top_dst_url, session_pool)); SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table, message, ctx, session_pool)); /* Fetch RA commit editor. */ #ifdef ENABLE_EV2_SHIMS SVN_ERR(svn_ra__register_editor_shim_callbacks(ra_session, svn_client__get_shim_callbacks(ctx->wc_ctx, relpath_map, session_pool))); #endif SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton, commit_revprops, commit_callback, commit_baton, NULL, TRUE, /* No lock tokens */ session_pool)); /* Perform the commit. */ SVN_ERR_W(svn_client__do_commit(top_dst_url, commit_items, editor, edit_baton, NULL /* notify_path_prefix */, NULL, ctx, session_pool, session_pool), _("Commit failed (details follow):")); svn_pool_destroy(iterpool); svn_pool_destroy(session_pool); return SVN_NO_ERROR; } /* A baton for notification_adjust_func(). */ struct notification_adjust_baton { svn_wc_notify_func2_t inner_func; void *inner_baton; const char *checkout_abspath; const char *final_abspath; }; /* A svn_wc_notify_func2_t function that wraps BATON->inner_func (whose * baton is BATON->inner_baton) and adjusts the notification paths that * start with BATON->checkout_abspath to start instead with * BATON->final_abspath. */ static void notification_adjust_func(void *baton, const svn_wc_notify_t *notify, apr_pool_t *pool) { struct notification_adjust_baton *nb = baton; svn_wc_notify_t *inner_notify = svn_wc_dup_notify(notify, pool); const char *relpath; relpath = svn_dirent_skip_ancestor(nb->checkout_abspath, notify->path); inner_notify->path = svn_dirent_join(nb->final_abspath, relpath, pool); if (nb->inner_func) nb->inner_func(nb->inner_baton, inner_notify, pool); } /* Peform each individual copy operation for a repos -> wc copy. A helper for repos_to_wc_copy(). Resolve PAIR->src_revnum to a real revision number if it isn't already. */ static svn_error_t * repos_to_wc_copy_single(svn_boolean_t *timestamp_sleep, svn_client__copy_pair_t *pair, svn_boolean_t same_repositories, svn_boolean_t ignore_externals, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *pool) { apr_hash_t *src_mergeinfo; const char *dst_abspath = pair->dst_abspath_or_url; SVN_ERR_ASSERT(svn_dirent_is_absolute(dst_abspath)); if (!same_repositories && ctx->notify_func2) { svn_wc_notify_t *notify; notify = svn_wc_create_notify_url( pair->src_abspath_or_url, svn_wc_notify_foreign_copy_begin, pool); notify->kind = pair->src_kind; ctx->notify_func2(ctx->notify_baton2, notify, pool); /* Allow a theoretical cancel to get through. */ if (ctx->cancel_func) SVN_ERR(ctx->cancel_func(ctx->cancel_baton)); } if (pair->src_kind == svn_node_dir) { if (same_repositories) { const char *tmpdir_abspath, *tmp_abspath; /* Find a temporary location in which to check out the copy source. */ SVN_ERR(svn_wc__get_tmpdir(&tmpdir_abspath, ctx->wc_ctx, dst_abspath, pool, pool)); SVN_ERR(svn_io_open_unique_file3(NULL, &tmp_abspath, tmpdir_abspath, svn_io_file_del_on_close, pool, pool)); /* Make a new checkout of the requested source. While doing so, * resolve pair->src_revnum to an actual revision number in case it * was until now 'invalid' meaning 'head'. Ask this function not to * sleep for timestamps, by passing a sleep_needed output param. * Send notifications for all nodes except the root node, and adjust * them to refer to the destination rather than this temporary path. */ { svn_wc_notify_func2_t old_notify_func2 = ctx->notify_func2; void *old_notify_baton2 = ctx->notify_baton2; struct notification_adjust_baton nb; svn_error_t *err; nb.inner_func = ctx->notify_func2; nb.inner_baton = ctx->notify_baton2; nb.checkout_abspath = tmp_abspath; nb.final_abspath = dst_abspath; ctx->notify_func2 = notification_adjust_func; ctx->notify_baton2 = &nb; /* Avoid a chicken-and-egg problem: * If pinning externals we'll need to adjust externals * properties before checking out any externals. * But copy needs to happen before pinning because else there * are no svn:externals properties to pin. */ if (pin_externals) ignore_externals = TRUE; err = svn_client__checkout_internal(&pair->src_revnum, timestamp_sleep, pair->src_original, tmp_abspath, &pair->src_peg_revision, &pair->src_op_revision, svn_depth_infinity, ignore_externals, FALSE, ra_session, ctx, pool); ctx->notify_func2 = old_notify_func2; ctx->notify_baton2 = old_notify_baton2; SVN_ERR(err); } *timestamp_sleep = TRUE; /* Schedule dst_path for addition in parent, with copy history. Don't send any notification here. Then remove the temporary checkout's .svn dir in preparation for moving the rest of it into the final destination. */ SVN_ERR(svn_wc_copy3(ctx->wc_ctx, tmp_abspath, dst_abspath, TRUE /* metadata_only */, ctx->cancel_func, ctx->cancel_baton, NULL, NULL, pool)); SVN_ERR(svn_wc__acquire_write_lock(NULL, ctx->wc_ctx, tmp_abspath, FALSE, pool, pool)); SVN_ERR(svn_wc_remove_from_revision_control2(ctx->wc_ctx, tmp_abspath, FALSE, FALSE, ctx->cancel_func, ctx->cancel_baton, pool)); /* Move the temporary disk tree into place. */ SVN_ERR(svn_io_file_rename(tmp_abspath, dst_abspath, pool)); } else { *timestamp_sleep = TRUE; SVN_ERR(svn_client__copy_foreign(pair->src_abspath_or_url, dst_abspath, &pair->src_peg_revision, &pair->src_op_revision, svn_depth_infinity, FALSE /* make_parents */, TRUE /* already_locked */, ctx, pool)); return SVN_NO_ERROR; } if (pin_externals) { apr_hash_t *pinned_externals; apr_hash_index_t *hi; apr_pool_t *iterpool; const char *repos_root_url; apr_hash_t *new_externals; apr_hash_t *new_depths; SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, pool)); SVN_ERR(resolve_pinned_externals(&pinned_externals, externals_to_pin, pair, ra_session, repos_root_url, ctx, pool, pool)); iterpool = svn_pool_create(pool); for (hi = apr_hash_first(pool, pinned_externals); hi; hi = apr_hash_next(hi)) { const char *dst_relpath = apr_hash_this_key(hi); svn_string_t *externals_propval = apr_hash_this_val(hi); const char *local_abspath; svn_pool_clear(iterpool); local_abspath = svn_dirent_join(pair->dst_abspath_or_url, dst_relpath, iterpool); /* ### use a work queue? */ SVN_ERR(svn_wc_prop_set4(ctx->wc_ctx, local_abspath, SVN_PROP_EXTERNALS, externals_propval, svn_depth_empty, TRUE /* skip_checks */, NULL /* changelist_filter */, ctx->cancel_func, ctx->cancel_baton, NULL, NULL, /* no extra notification */ iterpool)); } /* Now update all externals in the newly created copy. */ SVN_ERR(svn_wc__externals_gather_definitions(&new_externals, &new_depths, ctx->wc_ctx, dst_abspath, svn_depth_infinity, iterpool, iterpool)); SVN_ERR(svn_client__handle_externals(new_externals, new_depths, repos_root_url, dst_abspath, svn_depth_infinity, timestamp_sleep, ra_session, ctx, iterpool)); svn_pool_destroy(iterpool); } } /* end directory case */ else if (pair->src_kind == svn_node_file) { apr_hash_t *new_props; const char *src_rel; svn_stream_t *new_base_contents = svn_stream_buffered(pool); SVN_ERR(svn_ra_get_path_relative_to_session(ra_session, &src_rel, pair->src_abspath_or_url, pool)); /* Fetch the file content. While doing so, resolve pair->src_revnum * to an actual revision number if it's 'invalid' meaning 'head'. */ SVN_ERR(svn_ra_get_file(ra_session, src_rel, pair->src_revnum, new_base_contents, &pair->src_revnum, &new_props, pool)); if (new_props && ! same_repositories) svn_hash_sets(new_props, SVN_PROP_MERGEINFO, NULL); *timestamp_sleep = TRUE; SVN_ERR(svn_wc_add_repos_file4( ctx->wc_ctx, dst_abspath, new_base_contents, NULL, new_props, NULL, same_repositories ? pair->src_abspath_or_url : NULL, same_repositories ? pair->src_revnum : SVN_INVALID_REVNUM, ctx->cancel_func, ctx->cancel_baton, pool)); } /* Record the implied mergeinfo (before the notification callback is invoked for the root node). */ SVN_ERR(svn_client__get_repos_mergeinfo( &src_mergeinfo, ra_session, pair->src_abspath_or_url, pair->src_revnum, svn_mergeinfo_inherited, TRUE /*squelch_incapable*/, pool)); SVN_ERR(extend_wc_mergeinfo(dst_abspath, src_mergeinfo, ctx, pool)); /* Do our own notification for the root node, even if we could possibly have delegated it. See also issue #1552. ### Maybe this notification should mention the mergeinfo change. */ if (ctx->notify_func2) { svn_wc_notify_t *notify = svn_wc_create_notify( dst_abspath, svn_wc_notify_add, pool); notify->kind = pair->src_kind; ctx->notify_func2(ctx->notify_baton2, notify, pool); } return SVN_NO_ERROR; } static svn_error_t * repos_to_wc_copy_locked(svn_boolean_t *timestamp_sleep, const apr_array_header_t *copy_pairs, const char *top_dst_path, svn_boolean_t ignore_externals, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, svn_ra_session_t *ra_session, svn_client_ctx_t *ctx, apr_pool_t *scratch_pool) { int i; svn_boolean_t same_repositories; apr_pool_t *iterpool = svn_pool_create(scratch_pool); /* We've already checked for physical obstruction by a working file. But there could also be logical obstruction by an entry whose working file happens to be missing.*/ SVN_ERR(verify_wc_dsts(copy_pairs, FALSE, FALSE, FALSE /* metadata_only */, ctx, scratch_pool, iterpool)); /* Decide whether the two repositories are the same or not. */ { svn_error_t *src_err, *dst_err; const char *parent; const char *parent_abspath; const char *src_uuid, *dst_uuid; /* Get the repository uuid of SRC_URL */ src_err = svn_ra_get_uuid2(ra_session, &src_uuid, iterpool); if (src_err && src_err->apr_err != SVN_ERR_RA_NO_REPOS_UUID) return svn_error_trace(src_err); /* Get repository uuid of dst's parent directory, since dst may not exist. ### TODO: we should probably walk up the wc here, in case the parent dir has an imaginary URL. */ if (copy_pairs->nelts == 1) parent = svn_dirent_dirname(top_dst_path, scratch_pool); else parent = top_dst_path; SVN_ERR(svn_dirent_get_absolute(&parent_abspath, parent, scratch_pool)); dst_err = svn_client_get_repos_root(NULL /* root_url */, &dst_uuid, parent_abspath, ctx, iterpool, iterpool); if (dst_err && dst_err->apr_err != SVN_ERR_RA_NO_REPOS_UUID) return dst_err; /* If either of the UUIDs are nonexistent, then at least one of the repositories must be very old. Rather than punish the user, just assume the repositories are different, so no copy-history is attempted. */ if (src_err || dst_err || (! src_uuid) || (! dst_uuid)) same_repositories = FALSE; else same_repositories = (strcmp(src_uuid, dst_uuid) == 0); } /* Perform the move for each of the copy_pairs. */ for (i = 0; i < copy_pairs->nelts; i++) { /* Check for cancellation */ if (ctx->cancel_func) SVN_ERR(ctx->cancel_func(ctx->cancel_baton)); svn_pool_clear(iterpool); SVN_ERR(repos_to_wc_copy_single(timestamp_sleep, APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *), same_repositories, ignore_externals, pin_externals, externals_to_pin, ra_session, ctx, iterpool)); } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } static svn_error_t * repos_to_wc_copy(svn_boolean_t *timestamp_sleep, const apr_array_header_t *copy_pairs, svn_boolean_t make_parents, svn_boolean_t ignore_externals, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, svn_client_ctx_t *ctx, apr_pool_t *pool) { svn_ra_session_t *ra_session; const char *top_src_url, *top_dst_path; apr_pool_t *iterpool = svn_pool_create(pool); const char *lock_abspath; int i; /* Get the real path for the source, based upon its peg revision. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); const char *src; svn_pool_clear(iterpool); SVN_ERR(svn_client__repos_locations(&src, &pair->src_revnum, NULL, NULL, NULL, pair->src_abspath_or_url, &pair->src_peg_revision, &pair->src_op_revision, NULL, ctx, iterpool)); pair->src_original = pair->src_abspath_or_url; pair->src_abspath_or_url = apr_pstrdup(pool, src); } SVN_ERR(get_copy_pair_ancestors(copy_pairs, &top_src_url, &top_dst_path, NULL, pool)); lock_abspath = top_dst_path; if (copy_pairs->nelts == 1) { top_src_url = svn_uri_dirname(top_src_url, pool); lock_abspath = svn_dirent_dirname(top_dst_path, pool); } /* Open a repository session to the longest common src ancestor. We do not (yet) have a working copy, so we don't have a corresponding path and tempfiles cannot go into the admin area. */ SVN_ERR(svn_client_open_ra_session2(&ra_session, top_src_url, lock_abspath, ctx, pool, pool)); /* Get the correct src path for the peg revision used, and verify that we aren't overwriting an existing path. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_node_kind_t dst_parent_kind, dst_kind; const char *dst_parent; const char *src_rel; svn_pool_clear(iterpool); /* Next, make sure that the path exists in the repository. */ SVN_ERR(svn_ra_get_path_relative_to_session(ra_session, &src_rel, pair->src_abspath_or_url, iterpool)); SVN_ERR(svn_ra_check_path(ra_session, src_rel, pair->src_revnum, &pair->src_kind, pool)); if (pair->src_kind == svn_node_none) { if (SVN_IS_VALID_REVNUM(pair->src_revnum)) return svn_error_createf (SVN_ERR_FS_NOT_FOUND, NULL, _("Path '%s' not found in revision %ld"), pair->src_abspath_or_url, pair->src_revnum); else return svn_error_createf (SVN_ERR_FS_NOT_FOUND, NULL, _("Path '%s' not found in head revision"), pair->src_abspath_or_url); } /* Figure out about dst. */ SVN_ERR(svn_io_check_path(pair->dst_abspath_or_url, &dst_kind, iterpool)); if (dst_kind != svn_node_none) { return svn_error_createf( SVN_ERR_ENTRY_EXISTS, NULL, _("Path '%s' already exists"), svn_dirent_local_style(pair->dst_abspath_or_url, pool)); } /* Make sure the destination parent is a directory and produce a clear error message if it is not. */ dst_parent = svn_dirent_dirname(pair->dst_abspath_or_url, iterpool); SVN_ERR(svn_io_check_path(dst_parent, &dst_parent_kind, iterpool)); if (make_parents && dst_parent_kind == svn_node_none) { SVN_ERR(svn_client__make_local_parents(dst_parent, TRUE, ctx, iterpool)); } else if (dst_parent_kind != svn_node_dir) { return svn_error_createf(SVN_ERR_WC_NOT_WORKING_COPY, NULL, _("Path '%s' is not a directory"), svn_dirent_local_style(dst_parent, pool)); } } svn_pool_destroy(iterpool); SVN_WC__CALL_WITH_WRITE_LOCK( repos_to_wc_copy_locked(timestamp_sleep, copy_pairs, top_dst_path, ignore_externals, pin_externals, externals_to_pin, ra_session, ctx, pool), ctx->wc_ctx, lock_abspath, FALSE, pool); return SVN_NO_ERROR; } #define NEED_REPOS_REVNUM(revision) \ ((revision.kind != svn_opt_revision_unspecified) \ && (revision.kind != svn_opt_revision_working)) /* ... * * Set *TIMESTAMP_SLEEP to TRUE if a sleep is required; otherwise do not * change *TIMESTAMP_SLEEP. This output will be valid even if the * function returns an error. * * Perform all allocations in POOL. */ static svn_error_t * try_copy(svn_boolean_t *timestamp_sleep, const apr_array_header_t *sources, const char *dst_path_in, svn_boolean_t is_move, svn_boolean_t allow_mixed_revisions, svn_boolean_t metadata_only, svn_boolean_t make_parents, svn_boolean_t ignore_externals, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, const apr_hash_t *revprop_table, svn_commit_callback2_t commit_callback, void *commit_baton, svn_client_ctx_t *ctx, apr_pool_t *pool) { apr_array_header_t *copy_pairs = apr_array_make(pool, sources->nelts, sizeof(svn_client__copy_pair_t *)); svn_boolean_t srcs_are_urls, dst_is_url; int i; /* Assert instead of crashing if the sources list is empty. */ SVN_ERR_ASSERT(sources->nelts > 0); /* Are either of our paths URLs? Just check the first src_path. If there are more than one, we'll check for homogeneity among them down below. */ srcs_are_urls = svn_path_is_url(APR_ARRAY_IDX(sources, 0, svn_client_copy_source_t *)->path); dst_is_url = svn_path_is_url(dst_path_in); if (!dst_is_url) SVN_ERR(svn_dirent_get_absolute(&dst_path_in, dst_path_in, pool)); /* If we have multiple source paths, it implies the dst_path is a directory we are moving or copying into. Populate the COPY_PAIRS array to contain a destination path for each of the source paths. */ if (sources->nelts > 1) { apr_pool_t *iterpool = svn_pool_create(pool); for (i = 0; i < sources->nelts; i++) { svn_client_copy_source_t *source = APR_ARRAY_IDX(sources, i, svn_client_copy_source_t *); svn_client__copy_pair_t *pair = apr_pcalloc(pool, sizeof(*pair)); const char *src_basename; svn_boolean_t src_is_url = svn_path_is_url(source->path); svn_pool_clear(iterpool); if (src_is_url) { pair->src_abspath_or_url = apr_pstrdup(pool, source->path); src_basename = svn_uri_basename(pair->src_abspath_or_url, iterpool); } else { SVN_ERR(svn_dirent_get_absolute(&pair->src_abspath_or_url, source->path, pool)); src_basename = svn_dirent_basename(pair->src_abspath_or_url, iterpool); } pair->src_op_revision = *source->revision; pair->src_peg_revision = *source->peg_revision; pair->src_kind = svn_node_unknown; SVN_ERR(svn_opt_resolve_revisions(&pair->src_peg_revision, &pair->src_op_revision, src_is_url, TRUE, iterpool)); /* Check to see if all the sources are urls or all working copy * paths. */ if (src_is_url != srcs_are_urls) return svn_error_create (SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Cannot mix repository and working copy sources")); if (dst_is_url) pair->dst_abspath_or_url = svn_path_url_add_component2(dst_path_in, src_basename, pool); else pair->dst_abspath_or_url = svn_dirent_join(dst_path_in, src_basename, pool); APR_ARRAY_PUSH(copy_pairs, svn_client__copy_pair_t *) = pair; } svn_pool_destroy(iterpool); } else { /* Only one source path. */ svn_client__copy_pair_t *pair = apr_pcalloc(pool, sizeof(*pair)); svn_client_copy_source_t *source = APR_ARRAY_IDX(sources, 0, svn_client_copy_source_t *); svn_boolean_t src_is_url = svn_path_is_url(source->path); if (src_is_url) pair->src_abspath_or_url = apr_pstrdup(pool, source->path); else SVN_ERR(svn_dirent_get_absolute(&pair->src_abspath_or_url, source->path, pool)); pair->src_op_revision = *source->revision; pair->src_peg_revision = *source->peg_revision; pair->src_kind = svn_node_unknown; SVN_ERR(svn_opt_resolve_revisions(&pair->src_peg_revision, &pair->src_op_revision, src_is_url, TRUE, pool)); pair->dst_abspath_or_url = dst_path_in; APR_ARRAY_PUSH(copy_pairs, svn_client__copy_pair_t *) = pair; } if (!srcs_are_urls && !dst_is_url) { apr_pool_t *iterpool = svn_pool_create(pool); for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_pool_clear(iterpool); if (svn_dirent_is_child(pair->src_abspath_or_url, pair->dst_abspath_or_url, iterpool)) return svn_error_createf (SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Cannot copy path '%s' into its own child '%s'"), svn_dirent_local_style(pair->src_abspath_or_url, pool), svn_dirent_local_style(pair->dst_abspath_or_url, pool)); } svn_pool_destroy(iterpool); } /* A file external should not be moved since the file external is implemented as a switched file and it would delete the file the file external is switched to, which is not the behavior the user would probably want. */ if (is_move && !srcs_are_urls) { apr_pool_t *iterpool = svn_pool_create(pool); for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_node_kind_t external_kind; const char *defining_abspath; svn_pool_clear(iterpool); SVN_ERR_ASSERT(svn_dirent_is_absolute(pair->src_abspath_or_url)); SVN_ERR(svn_wc__read_external_info(&external_kind, &defining_abspath, NULL, NULL, NULL, ctx->wc_ctx, pair->src_abspath_or_url, pair->src_abspath_or_url, TRUE, iterpool, iterpool)); if (external_kind != svn_node_none) return svn_error_createf( SVN_ERR_WC_CANNOT_MOVE_FILE_EXTERNAL, NULL, _("Cannot move the external at '%s'; please " "edit the svn:externals property on '%s'."), svn_dirent_local_style(pair->src_abspath_or_url, pool), svn_dirent_local_style(defining_abspath, pool)); } svn_pool_destroy(iterpool); } if (is_move) { /* Disallow moves between the working copy and the repository. */ if (srcs_are_urls != dst_is_url) { return svn_error_create (SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Moves between the working copy and the repository are not " "supported")); } /* Disallow moving any path/URL onto or into itself. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); if (strcmp(pair->src_abspath_or_url, pair->dst_abspath_or_url) == 0) return svn_error_createf( SVN_ERR_UNSUPPORTED_FEATURE, NULL, srcs_are_urls ? _("Cannot move URL '%s' into itself") : _("Cannot move path '%s' into itself"), srcs_are_urls ? pair->src_abspath_or_url : svn_dirent_local_style(pair->src_abspath_or_url, pool)); } } else { if (!srcs_are_urls) { /* If we are doing a wc->* copy, but with an operational revision other than the working copy revision, we are really doing a repo->* copy, because we're going to need to get the rev from the repo. */ svn_boolean_t need_repos_op_rev = FALSE; svn_boolean_t need_repos_peg_rev = FALSE; /* Check to see if any revision is something other than svn_opt_revision_unspecified or svn_opt_revision_working. */ for (i = 0; i < copy_pairs->nelts; i++) { svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); if (NEED_REPOS_REVNUM(pair->src_op_revision)) need_repos_op_rev = TRUE; if (NEED_REPOS_REVNUM(pair->src_peg_revision)) need_repos_peg_rev = TRUE; if (need_repos_op_rev || need_repos_peg_rev) break; } if (need_repos_op_rev || need_repos_peg_rev) { apr_pool_t *iterpool = svn_pool_create(pool); for (i = 0; i < copy_pairs->nelts; i++) { const char *copyfrom_repos_root_url; const char *copyfrom_repos_relpath; const char *url; svn_revnum_t copyfrom_rev; svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *); svn_pool_clear(iterpool); SVN_ERR_ASSERT(svn_dirent_is_absolute(pair->src_abspath_or_url)); SVN_ERR(svn_wc__node_get_origin(NULL, ©from_rev, ©from_repos_relpath, ©from_repos_root_url, NULL, NULL, NULL, ctx->wc_ctx, pair->src_abspath_or_url, TRUE, iterpool, iterpool)); if (copyfrom_repos_relpath) url = svn_path_url_add_component2(copyfrom_repos_root_url, copyfrom_repos_relpath, pool); else return svn_error_createf (SVN_ERR_ENTRY_MISSING_URL, NULL, _("'%s' does not have a URL associated with it"), svn_dirent_local_style(pair->src_abspath_or_url, pool)); pair->src_abspath_or_url = url; if (!need_repos_peg_rev || pair->src_peg_revision.kind == svn_opt_revision_base) { /* Default the peg revision to that of the WC entry. */ pair->src_peg_revision.kind = svn_opt_revision_number; pair->src_peg_revision.value.number = copyfrom_rev; } if (pair->src_op_revision.kind == svn_opt_revision_base) { /* Use the entry's revision as the operational rev. */ pair->src_op_revision.kind = svn_opt_revision_number; pair->src_op_revision.value.number = copyfrom_rev; } } svn_pool_destroy(iterpool); srcs_are_urls = TRUE; } } } /* Now, call the right handler for the operation. */ if ((! srcs_are_urls) && (! dst_is_url)) { SVN_ERR(verify_wc_srcs_and_dsts(copy_pairs, make_parents, is_move, metadata_only, ctx, pool, pool)); /* Copy or move all targets. */ if (is_move) return svn_error_trace(do_wc_to_wc_moves(timestamp_sleep, copy_pairs, dst_path_in, allow_mixed_revisions, metadata_only, ctx, pool)); else { /* We ignore these values, so assert the default value */ SVN_ERR_ASSERT(allow_mixed_revisions); return svn_error_trace(do_wc_to_wc_copies(timestamp_sleep, copy_pairs, metadata_only, pin_externals, externals_to_pin, ctx, pool)); } } else if ((! srcs_are_urls) && (dst_is_url)) { return svn_error_trace( wc_to_repos_copy(copy_pairs, make_parents, revprop_table, commit_callback, commit_baton, pin_externals, externals_to_pin, ctx, pool)); } else if ((srcs_are_urls) && (! dst_is_url)) { return svn_error_trace( repos_to_wc_copy(timestamp_sleep, copy_pairs, make_parents, ignore_externals, pin_externals, externals_to_pin, ctx, pool)); } else { return svn_error_trace( repos_to_repos_copy(copy_pairs, make_parents, revprop_table, commit_callback, commit_baton, ctx, is_move, pin_externals, externals_to_pin, pool)); } } /* Public Interfaces */ svn_error_t * svn_client_copy7(const apr_array_header_t *sources, const char *dst_path, svn_boolean_t copy_as_child, svn_boolean_t make_parents, svn_boolean_t ignore_externals, svn_boolean_t metadata_only, svn_boolean_t pin_externals, const apr_hash_t *externals_to_pin, const apr_hash_t *revprop_table, svn_commit_callback2_t commit_callback, void *commit_baton, svn_client_ctx_t *ctx, apr_pool_t *pool) { svn_error_t *err; svn_boolean_t timestamp_sleep = FALSE; apr_pool_t *subpool = svn_pool_create(pool); if (sources->nelts > 1 && !copy_as_child) return svn_error_create(SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED, NULL, NULL); err = try_copy(×tamp_sleep, sources, dst_path, FALSE /* is_move */, TRUE /* allow_mixed_revisions */, metadata_only, make_parents, ignore_externals, pin_externals, externals_to_pin, revprop_table, commit_callback, commit_baton, ctx, subpool); /* If the destination exists, try to copy the sources as children of the destination. */ if (copy_as_child && err && (sources->nelts == 1) && (err->apr_err == SVN_ERR_ENTRY_EXISTS || err->apr_err == SVN_ERR_FS_ALREADY_EXISTS)) { const char *src_path = APR_ARRAY_IDX(sources, 0, svn_client_copy_source_t *)->path; const char *src_basename; svn_boolean_t src_is_url = svn_path_is_url(src_path); svn_boolean_t dst_is_url = svn_path_is_url(dst_path); svn_error_clear(err); svn_pool_clear(subpool); src_basename = src_is_url ? svn_uri_basename(src_path, subpool) : svn_dirent_basename(src_path, subpool); dst_path = dst_is_url ? svn_path_url_add_component2(dst_path, src_basename, subpool) : svn_dirent_join(dst_path, src_basename, subpool); err = try_copy(×tamp_sleep, sources, dst_path, FALSE /* is_move */, TRUE /* allow_mixed_revisions */, metadata_only, make_parents, ignore_externals, pin_externals, externals_to_pin, revprop_table, commit_callback, commit_baton, ctx, subpool); } /* Sleep if required. DST_PATH is not a URL in these cases. */ if (timestamp_sleep) svn_io_sleep_for_timestamps(dst_path, subpool); svn_pool_destroy(subpool); return svn_error_trace(err); } svn_error_t * svn_client_move7(const apr_array_header_t *src_paths, const char *dst_path, svn_boolean_t move_as_child, svn_boolean_t make_parents, svn_boolean_t allow_mixed_revisions, svn_boolean_t metadata_only, const apr_hash_t *revprop_table, svn_commit_callback2_t commit_callback, void *commit_baton, svn_client_ctx_t *ctx, apr_pool_t *pool) { const svn_opt_revision_t head_revision = { svn_opt_revision_head, { 0 } }; svn_error_t *err; svn_boolean_t timestamp_sleep = FALSE; int i; apr_pool_t *subpool = svn_pool_create(pool); apr_array_header_t *sources = apr_array_make(pool, src_paths->nelts, sizeof(const svn_client_copy_source_t *)); if (src_paths->nelts > 1 && !move_as_child) return svn_error_create(SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED, NULL, NULL); for (i = 0; i < src_paths->nelts; i++) { const char *src_path = APR_ARRAY_IDX(src_paths, i, const char *); svn_client_copy_source_t *copy_source = apr_palloc(pool, sizeof(*copy_source)); copy_source->path = src_path; copy_source->revision = &head_revision; copy_source->peg_revision = &head_revision; APR_ARRAY_PUSH(sources, svn_client_copy_source_t *) = copy_source; } err = try_copy(×tamp_sleep, sources, dst_path, TRUE /* is_move */, allow_mixed_revisions, metadata_only, make_parents, FALSE /* ignore_externals */, FALSE /* pin_externals */, NULL /* externals_to_pin */, revprop_table, commit_callback, commit_baton, ctx, subpool); /* If the destination exists, try to move the sources as children of the destination. */ if (move_as_child && err && (src_paths->nelts == 1) && (err->apr_err == SVN_ERR_ENTRY_EXISTS || err->apr_err == SVN_ERR_FS_ALREADY_EXISTS)) { const char *src_path = APR_ARRAY_IDX(src_paths, 0, const char *); const char *src_basename; svn_boolean_t src_is_url = svn_path_is_url(src_path); svn_boolean_t dst_is_url = svn_path_is_url(dst_path); svn_error_clear(err); svn_pool_clear(subpool); src_basename = src_is_url ? svn_uri_basename(src_path, pool) : svn_dirent_basename(src_path, pool); dst_path = dst_is_url ? svn_path_url_add_component2(dst_path, src_basename, subpool) : svn_dirent_join(dst_path, src_basename, subpool); err = try_copy(×tamp_sleep, sources, dst_path, TRUE /* is_move */, allow_mixed_revisions, metadata_only, make_parents, FALSE /* ignore_externals */, FALSE /* pin_externals */, NULL /* externals_to_pin */, revprop_table, commit_callback, commit_baton, ctx, subpool); } /* Sleep if required. DST_PATH is not a URL in these cases. */ if (timestamp_sleep) svn_io_sleep_for_timestamps(dst_path, subpool); svn_pool_destroy(subpool); return svn_error_trace(err); } Index: stable/11/contrib/subversion/subversion/libsvn_client/merge.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_client/merge.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_client/merge.c (revision 322442) @@ -1,12916 +1,12926 @@ /* * 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 #include #include #include #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; } 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, ®ular_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, ®ular_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_pool_t *swmi_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. */ + /* Use a subpool for subtrees_with_mergeinfo, as it can be very large + and is temporary. */ + swmi_pool = svn_pool_create(scratch_pool); SVN_ERR(get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo, target->abspath, depth, ctx, - result_pool, scratch_pool)); + swmi_pool, swmi_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); } + svn_pool_destroy(swmi_pool); /* 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 *) = ⦥ } 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 = 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; /* 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); 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; + /* Using a local subpool for 'target_mergeinfo_cat' can make a big + reduction in overall memory usage. */ + apr_pool_t *tmic_pool = svn_pool_create(scratch_pool); + 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)); + tmic_pool, tmic_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)); + tmic_pool, tmic_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)); } + svn_pool_destroy(tmic_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 322441) +++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/cached_data.c (revision 322442) @@ -1,3407 +1,3502 @@ /* 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 #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[] = {"", "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) { /* 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)); + /* Get the next block of data. + * Keep in mind that the representation might be empty and leave us + * already positioned at the end of the rep. */ + if (rb->off == rb->len) + *len = 0; + else + 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; +} + +svn_error_t * +svn_fs_fs__get_contents_from_file(svn_stream_t **contents_p, + svn_fs_t *fs, + representation_t *rep, + apr_file_t *file, + apr_off_t offset, + apr_pool_t *pool) +{ + struct rep_read_baton *rb; + pair_cache_key_t fulltext_cache_key = { SVN_INVALID_REVNUM, 0 }; + rep_state_t *rs = apr_pcalloc(pool, sizeof(*rs)); + svn_fs_fs__rep_header_t *rh; + + /* 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)); + + /* Continue constructing RS. Leave caches as NULL. */ + rs->size = rep->size; + rs->revision = SVN_INVALID_REVNUM; + rs->item_index = 0; + rs->ver = -1; + rs->start = -1; + + /* Provide just enough file access info to allow for a basic read from + * FILE but leave all index / footer info with empty values b/c FILE + * probably is not a complete revision file. */ + rs->sfile = apr_pcalloc(pool, sizeof(*rs->sfile)); + rs->sfile->revision = rep->revision; + rs->sfile->pool = pool; + rs->sfile->fs = fs; + rs->sfile->rfile = apr_pcalloc(pool, sizeof(*rs->sfile->rfile)); + rs->sfile->rfile->start_revision = SVN_INVALID_REVNUM; + rs->sfile->rfile->file = file; + rs->sfile->rfile->stream = svn_stream_from_aprfile2(file, TRUE, pool); + + /* Read the rep header. */ + SVN_ERR(aligned_seek(fs, file, NULL, offset, pool)); + SVN_ERR(svn_fs_fs__read_rep_header(&rh, rs->sfile->rfile->stream, + pool, pool)); + SVN_ERR(get_file_offset(&rs->start, rs, pool)); + rs->header_size = rh->header_size; + + /* Log the access. */ + SVN_ERR(dbg_log_access(fs, SVN_INVALID_REVNUM, 0, rh, + SVN_FS_FS__ITEM_TYPE_ANY_REP, pool)); + + /* Build the representation list (delta chain). */ + if (rh->type == svn_fs_fs__rep_plain) + { + rb->rs_list = apr_array_make(pool, 0, sizeof(rep_state_t *)); + rb->src_state = rs; + } + else if (rh->type == svn_fs_fs__rep_self_delta) + { + rb->rs_list = apr_array_make(pool, 1, sizeof(rep_state_t *)); + APR_ARRAY_PUSH(rb->rs_list, rep_state_t *) = rs; + rb->src_state = NULL; + } + else + { + representation_t next_rep = { 0 }; + + /* skip "SVNx" diff marker */ + rs->current = 4; + + /* REP's base rep is inside a proper revision. + * It can be reconstructed in the usual way. */ + next_rep.revision = rh->base_revision; + next_rep.item_index = rh->base_item_index; + next_rep.size = rh->base_length; + svn_fs_fs__id_txn_reset(&next_rep.txn_id); + + SVN_ERR(build_rep_list(&rb->rs_list, &rb->base_window, + &rb->src_state, &rb->len, rb->fs, &next_rep, + rb->filehandle_pool)); + + /* Insert the access to REP as the first element of the delta chain. */ + svn_sort__array_insert(rb->rs_list, &rs, 0); + } + + /* Now, the baton is complete and we can assemble the stream around it. */ + *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/cached_data.h =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_fs_fs/cached_data.h (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/cached_data.h (revision 322442) @@ -1,166 +1,178 @@ /* cached_data.h --- 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. * ==================================================================== */ #ifndef SVN_LIBSVN_FS__CACHED_DATA_H #define SVN_LIBSVN_FS__CACHED_DATA_H #include "svn_pools.h" #include "svn_fs.h" #include "fs.h" /* Set *NODEREV_P to the node-revision for the node ID in FS. Do any allocations in POOL. */ 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); /* Set *ROOT_ID to the node-id for the root of revision REV in filesystem FS. Do any allocations in POOL. */ svn_error_t * svn_fs_fs__rev_get_root(svn_fs_id_t **root_id, svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /* Verify that representation REP in FS can be accessed. Successive calls to this function should pass a non-NULL value to HINT. In that case, many file open / close operations can be eliminated. Do any allocations in SCRATCH_POOL. */ svn_error_t * svn_fs_fs__check_rep(representation_t *rep, svn_fs_t *fs, void **hint, apr_pool_t *scratch_pool); /* Follow the representation delta chain in FS starting with REP. The number of reps (including REP) in the chain will be returned in *CHAIN_LENGTH. *SHARD_COUNT will be set to the number of shards accessed. Do any allocations in SCRATCH_POOL. */ 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); /* Set *CONTENTS to be a readable svn_stream_t that receives the text representation REP as seen in filesystem FS. If CACHE_FULLTEXT is not set, bypass fulltext cache lookup for this rep and don't put the reconstructed fulltext into cache. Use POOL for allocations. */ 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); +/* Set *CONTENTS_P to be a readable svn_stream_t that receives the text + representation REP as seen in filesystem FS. Read the latest element + of the delta chain from FILE at offset OFFSET. + Use POOL for allocations. */ +svn_error_t * +svn_fs_fs__get_contents_from_file(svn_stream_t **contents_p, + svn_fs_t *fs, + representation_t *rep, + apr_file_t *file, + apr_off_t offset, + apr_pool_t *pool); + /* Attempt to fetch the text representation of node-revision NODEREV as seen in filesystem FS and pass it along with the BATON to the PROCESSOR. Set *SUCCESS only of the data could be provided and the processing had been called. Use POOL for all allocations. */ 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); /* Set *STREAM_P to a delta stream turning the contents of the file SOURCE into the contents of the file TARGET, allocated in POOL. If SOURCE is null, the empty string will be used. */ 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); /* Set *ENTRIES to an apr_array_header_t of dirent structs that contain the directory entries of node-revision NODEREV in filesystem FS. The returned table is allocated in RESULT_POOL and entries are sorted lexicographically. SCRATCH_POOL is used for temporary allocations. */ 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); /* Return the directory entry from ENTRIES that matches NAME. If no such entry exists, return NULL. If HINT is not NULL, set *HINT to the array index of the entry returned. Successive calls in a linear scan scenario will be faster called with the same HINT variable. */ svn_fs_dirent_t * svn_fs_fs__find_dir_entry(apr_array_header_t *entries, const char *name, int *hint); /* Set *DIRENT to the entry identified by NAME in the directory given by NODEREV in filesystem FS. If no such entry exits, *DIRENT will be NULL. The returned object is allocated in RESULT_POOL; SCRATCH_POOL used for temporary allocations. */ 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); /* Set *PROPLIST to be an apr_hash_t containing the property list of node-revision NODEREV as seen in filesystem FS. Use POOL for temporary allocations. */ svn_error_t * svn_fs_fs__get_proplist(apr_hash_t **proplist, svn_fs_t *fs, node_revision_t *noderev, apr_pool_t *pool); /* Set *HAS_PROPS to TRUE if NODEREV has properties in FS, otherwise to FALSE. Use SCRATCH_POOL for temporary allocations. */ svn_error_t * svn_fs_fs__has_props(svn_boolean_t *has_props, svn_fs_t *fs, node_revision_t *noderev, apr_pool_t *scratch_pool); /* Fetch the list of change in revision REV in FS and return it in *CHANGES. * Allocate the result in POOL. */ svn_error_t * svn_fs_fs__get_changes(apr_array_header_t **changes, svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *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 322441) +++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache-db.h (revision 322442) @@ -1,91 +1,91 @@ -/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_fs_fs/token-map.h. +/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.7/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 322441) +++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/rep-cache.c (revision 322442) @@ -1,440 +1,443 @@ /* 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_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_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")); + return svn_error_quick_wrapf(err, + _("Couldn't open rep-cache database '%s'"), + svn_dirent_local_style( + path_rep_cache_db(fs->path, pool), pool)); } 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/transaction.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_fs_fs/transaction.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_fs_fs/transaction.c (revision 322442) @@ -1,3877 +1,3964 @@ /* 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 #include #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 "/-.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, ©_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, ©_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. + + The content of both representations will be compared, taking REP's content + from FILE at OFFSET. Only if they actually match, will *OLD_REP not be + NULL. + 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_file_t *file, + apr_off_t offset, 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; + svn_checksum_t checksum; + checksum.digest = rep->sha1_digest; + checksum.kind = svn_checksum_sha1; + /* 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; } + /* If we (very likely) found a matching representation, compare the actual + * contents such that we can be sure that no rep-cache.db corruption or + * hash collision produced a false positive. */ + if (*old_rep) + { + apr_off_t old_position; + svn_stream_t *contents; + svn_stream_t *old_contents; + svn_boolean_t same; + + /* The existing representation may itself be part of the current + * transaction. In that case, it may be in different stages of + * the commit finalization process. + * + * OLD_REP_NORM is the same as that OLD_REP but it is assigned + * explicitly to REP's transaction if OLD_REP does not point + * to an already committed revision. This then prevents the + * revision lookup and the txn data will be accessed. + */ + representation_t old_rep_norm = **old_rep; + if ( !SVN_IS_VALID_REVNUM(old_rep_norm.revision) + || old_rep_norm.revision > ffd->youngest_rev_cache) + old_rep_norm.txn_id = rep->txn_id; + + /* Make sure we can later restore FILE's current position. */ + SVN_ERR(svn_fs_fs__get_file_offset(&old_position, file, scratch_pool)); + + /* Compare the two representations. + * Note that the stream comparison might also produce MD5 checksum + * errors or other failures in case of SHA1 collisions. */ + SVN_ERR(svn_fs_fs__get_contents_from_file(&contents, fs, rep, file, + offset, scratch_pool)); + SVN_ERR(svn_fs_fs__get_contents(&old_contents, fs, &old_rep_norm, + FALSE, scratch_pool)); + err = svn_stream_contents_same2(&same, contents, old_contents, + scratch_pool); + + /* A mismatch should be extremely rare. + * If it does happen, reject the commit. */ + if (!same || err) + { + /* SHA1 collision or worse. */ + svn_stringbuf_t *old_rep_str + = svn_fs_fs__unparse_representation(*old_rep, + ffd->format, FALSE, + scratch_pool, + scratch_pool); + svn_stringbuf_t *rep_str + = svn_fs_fs__unparse_representation(rep, + ffd->format, FALSE, + scratch_pool, + scratch_pool); + const char *checksum__str + = svn_checksum_to_cstring_display(&checksum, scratch_pool); + + return svn_error_createf(SVN_ERR_FS_GENERAL, + err, "SHA1 of reps '%s' and '%s' " + "matches (%s) but contents differ", + old_rep_str->data, rep_str->data, + checksum__str); + } + + /* Restore FILE's read / write position. */ + SVN_ERR(svn_io_file_seek(file, APR_SET, &old_position, scratch_pool)); + } + 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)); + SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, b->file, b->rep_offset, 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_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. */ + the indexes if necessary. + + If ALLOW_REP_SHARING is FALSE, rep-sharing will not be used, regardless + of any other option and rep-sharing settings. 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. If 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, + svn_boolean_t allow_rep_sharing, 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_fs_fs__p2l_entry_t entry; 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)); + /* Update size info. */ + rep->expanded_size = whb->size; + rep->size = whb->size; + /* 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) + if (allow_rep_sharing) { - /* We need to erase from the protorev the data we just wrote. */ - SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool)); + representation_t *old_rep; + SVN_ERR(get_shared_rep(&old_rep, fs, rep, file, offset, reps_hash, + scratch_pool, scratch_pool)); - /* Use the old rep for this content. */ - memcpy(rep, old_rep, sizeof (*rep)); + 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)); + return SVN_NO_ERROR; + } } - else - { - svn_fs_fs__p2l_entry_t entry; - /* Write out our cosmetic end marker. */ - SVN_ERR(svn_stream_puts(whb->stream, "ENDREP\n")); + /* 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)); + 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)); + 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)); + 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. + ITEM_TYPE to the indexes if necessary. + If ALLOW_REP_SHARING is FALSE, rep-sharing will not be used, regardless + of any other option and rep-sharing settings. 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. If 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, + svn_boolean_t allow_rep_sharing, 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 }; + svn_fs_fs__p2l_entry_t entry; 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)); + /* Update size info. */ + SVN_ERR(svn_fs_fs__get_file_offset(&rep_end, file, scratch_pool)); + rep->size = rep_end - delta_start; + rep->expanded_size = whb->size; + /* 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) + if (allow_rep_sharing) { - /* We need to erase from the protorev the data we just wrote. */ - SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool)); + representation_t *old_rep; + SVN_ERR(get_shared_rep(&old_rep, fs, rep, file, offset, reps_hash, + scratch_pool, scratch_pool)); - /* Use the old rep for this content. */ - memcpy(rep, old_rep, sizeof (*rep)); + 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)); + return SVN_NO_ERROR; + } } - 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")); + /* Write out our cosmetic end marker. */ + SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n")); - SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id, - offset, scratch_pool)); + 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)); + 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)); + 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, + fs, noderev, NULL, FALSE, 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)); + FALSE, 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)); + reps_hash, TRUE, item_type, pool)); else SVN_ERR(write_container_rep(noderev->prop_rep, file, proplist, write_hash_to_stream, fs, reps_hash, - item_type, pool)); + TRUE, 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(©_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, ©_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 . */ /* ### 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_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_x/rep-cache-db.h =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_fs_x/rep-cache-db.h (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_fs_x/rep-cache-db.h (revision 322442) @@ -1,92 +1,92 @@ -/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_fs_x/token-map.h. +/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.7/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_svn/client.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_ra_svn/client.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_ra_svn/client.c (revision 322442) @@ -1,2940 +1,2977 @@ /* * client.c : Functions for repository access via 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 "svn_private_config.h" #define APR_WANT_STRFUNC #include #include #include #include #include #include "svn_hash.h" #include "svn_types.h" #include "svn_string.h" #include "svn_dirent_uri.h" #include "svn_error.h" #include "svn_time.h" #include "svn_path.h" #include "svn_pools.h" #include "svn_config.h" #include "svn_ra.h" #include "svn_ra_svn.h" #include "svn_props.h" #include "svn_mergeinfo.h" #include "svn_version.h" +#include "svn_ctype.h" #include "svn_private_config.h" #include "private/svn_fspath.h" #include "private/svn_subr_private.h" #include "../libsvn_ra/ra_loader.h" #include "ra_svn.h" #ifdef SVN_HAVE_SASL #define DO_AUTH svn_ra_svn__do_cyrus_auth #else #define DO_AUTH svn_ra_svn__do_internal_auth #endif /* We aren't using SVN_DEPTH_IS_RECURSIVE here because that macro (for whatever reason) deems svn_depth_immediates as non-recursive, which is ... kinda true, but not true enough for our purposes. We need our requested recursion level to be *at least* as recursive as the real depth we're looking for. */ #define DEPTH_TO_RECURSE(d) \ ((d) == svn_depth_unknown || (d) > svn_depth_files) typedef struct ra_svn_commit_callback_baton_t { svn_ra_svn__session_baton_t *sess_baton; apr_pool_t *pool; svn_revnum_t *new_rev; svn_commit_callback2_t callback; void *callback_baton; } ra_svn_commit_callback_baton_t; typedef struct ra_svn_reporter_baton_t { svn_ra_svn__session_baton_t *sess_baton; svn_ra_svn_conn_t *conn; apr_pool_t *pool; const svn_delta_editor_t *editor; void *edit_baton; } ra_svn_reporter_baton_t; /* Parse an svn URL's tunnel portion into tunnel, if there is a tunnel portion. */ static void parse_tunnel(const char *url, const char **tunnel, apr_pool_t *pool) { *tunnel = NULL; if (strncasecmp(url, "svn", 3) != 0) return; url += 3; /* Get the tunnel specification, if any. */ if (*url == '+') { const char *p; url++; p = strchr(url, ':'); if (!p) return; *tunnel = apr_pstrmemdup(pool, url, p - url); } } static svn_error_t *make_connection(const char *hostname, unsigned short port, apr_socket_t **sock, apr_pool_t *pool) { apr_sockaddr_t *sa; apr_status_t status; int family = APR_INET; /* Make sure we have IPV6 support first before giving apr_sockaddr_info_get APR_UNSPEC, because it may give us back an IPV6 address even if we can't create IPV6 sockets. */ #if APR_HAVE_IPV6 #ifdef MAX_SECS_TO_LINGER status = apr_socket_create(sock, APR_INET6, SOCK_STREAM, pool); #else status = apr_socket_create(sock, APR_INET6, SOCK_STREAM, APR_PROTO_TCP, pool); #endif if (status == 0) { apr_socket_close(*sock); family = APR_UNSPEC; } #endif /* Resolve the hostname. */ status = apr_sockaddr_info_get(&sa, hostname, family, port, 0, pool); if (status) return svn_error_createf(status, NULL, _("Unknown hostname '%s'"), hostname); /* Iterate through the returned list of addresses attempting to * connect to each in turn. */ do { /* Create the socket. */ #ifdef MAX_SECS_TO_LINGER /* ### old APR interface */ status = apr_socket_create(sock, sa->family, SOCK_STREAM, pool); #else status = apr_socket_create(sock, sa->family, SOCK_STREAM, APR_PROTO_TCP, pool); #endif if (status == APR_SUCCESS) { status = apr_socket_connect(*sock, sa); if (status != APR_SUCCESS) apr_socket_close(*sock); } sa = sa->next; } while (status != APR_SUCCESS && sa); if (status) return svn_error_wrap_apr(status, _("Can't connect to host '%s'"), hostname); /* 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. * See issue #3347. */ status = apr_socket_opt_set(*sock, APR_SO_KEEPALIVE, 1); if (status) { /* It's not a fatal error if we cannot enable keep-alives. */ } return SVN_NO_ERROR; } /* Set *DIFFS to an array of svn_prop_t, allocated in POOL, based on the property diffs in LIST, received from the server. */ static svn_error_t *parse_prop_diffs(const apr_array_header_t *list, apr_pool_t *pool, apr_array_header_t **diffs) { int i; *diffs = apr_array_make(pool, list->nelts, sizeof(svn_prop_t)); for (i = 0; i < list->nelts; i++) { svn_prop_t *prop; svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(list, i, svn_ra_svn_item_t); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Prop diffs element not a list")); prop = apr_array_push(*diffs); SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "c(?s)", &prop->name, &prop->value)); } return SVN_NO_ERROR; } /* Parse a lockdesc, provided in LIST as specified by the protocol into LOCK, allocated in POOL. */ static svn_error_t *parse_lock(const apr_array_header_t *list, apr_pool_t *pool, svn_lock_t **lock) { const char *cdate, *edate; *lock = svn_lock_create(pool); SVN_ERR(svn_ra_svn__parse_tuple(list, pool, "ccc(?c)c(?c)", &(*lock)->path, &(*lock)->token, &(*lock)->owner, &(*lock)->comment, &cdate, &edate)); (*lock)->path = svn_fspath__canonicalize((*lock)->path, pool); SVN_ERR(svn_time_from_cstring(&(*lock)->creation_date, cdate, pool)); if (edate) SVN_ERR(svn_time_from_cstring(&(*lock)->expiration_date, edate, pool)); return SVN_NO_ERROR; } /* --- AUTHENTICATION ROUTINES --- */ svn_error_t *svn_ra_svn__auth_response(svn_ra_svn_conn_t *conn, apr_pool_t *pool, const char *mech, const char *mech_arg) { return svn_error_trace(svn_ra_svn__write_tuple(conn, pool, "w(?c)", mech, mech_arg)); } static svn_error_t *handle_auth_request(svn_ra_svn__session_baton_t *sess, apr_pool_t *pool) { svn_ra_svn_conn_t *conn = sess->conn; apr_array_header_t *mechlist; const char *realm; SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "lc", &mechlist, &realm)); if (mechlist->nelts == 0) return SVN_NO_ERROR; return DO_AUTH(sess, mechlist, realm, pool); } /* --- REPORTER IMPLEMENTATION --- */ static svn_error_t *ra_svn_set_path(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) { ra_svn_reporter_baton_t *b = baton; SVN_ERR(svn_ra_svn__write_cmd_set_path(b->conn, pool, path, rev, start_empty, lock_token, depth)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_delete_path(void *baton, const char *path, apr_pool_t *pool) { ra_svn_reporter_baton_t *b = baton; SVN_ERR(svn_ra_svn__write_cmd_delete_path(b->conn, pool, path)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_link_path(void *baton, const char *path, const char *url, svn_revnum_t rev, svn_depth_t depth, svn_boolean_t start_empty, const char *lock_token, apr_pool_t *pool) { ra_svn_reporter_baton_t *b = baton; SVN_ERR(svn_ra_svn__write_cmd_link_path(b->conn, pool, path, url, rev, start_empty, lock_token, depth)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_finish_report(void *baton, apr_pool_t *pool) { ra_svn_reporter_baton_t *b = baton; SVN_ERR(svn_ra_svn__write_cmd_finish_report(b->conn, b->pool)); SVN_ERR(handle_auth_request(b->sess_baton, b->pool)); SVN_ERR(svn_ra_svn_drive_editor2(b->conn, b->pool, b->editor, b->edit_baton, NULL, FALSE)); SVN_ERR(svn_ra_svn__read_cmd_response(b->conn, b->pool, "")); return SVN_NO_ERROR; } static svn_error_t *ra_svn_abort_report(void *baton, apr_pool_t *pool) { ra_svn_reporter_baton_t *b = baton; SVN_ERR(svn_ra_svn__write_cmd_abort_report(b->conn, b->pool)); return SVN_NO_ERROR; } static svn_ra_reporter3_t ra_svn_reporter = { ra_svn_set_path, ra_svn_delete_path, ra_svn_link_path, ra_svn_finish_report, ra_svn_abort_report }; /* Set *REPORTER and *REPORT_BATON to a new reporter which will drive * EDITOR/EDIT_BATON when it gets the finish_report() call. * * Allocate the new reporter in POOL. */ static svn_error_t * ra_svn_get_reporter(svn_ra_svn__session_baton_t *sess_baton, apr_pool_t *pool, const svn_delta_editor_t *editor, void *edit_baton, const char *target, svn_depth_t depth, const svn_ra_reporter3_t **reporter, void **report_baton) { ra_svn_reporter_baton_t *b; const svn_delta_editor_t *filter_editor; void *filter_baton; /* We can skip the depth filtering when the user requested depth_files or depth_infinity because the server will transmit the right stuff anyway. */ if ((depth != svn_depth_files) && (depth != svn_depth_infinity) && ! svn_ra_svn_has_capability(sess_baton->conn, SVN_RA_SVN_CAP_DEPTH)) { SVN_ERR(svn_delta_depth_filter_editor(&filter_editor, &filter_baton, editor, edit_baton, depth, *target != '\0', pool)); editor = filter_editor; edit_baton = filter_baton; } b = apr_palloc(pool, sizeof(*b)); b->sess_baton = sess_baton; b->conn = sess_baton->conn; b->pool = pool; b->editor = editor; b->edit_baton = edit_baton; *reporter = &ra_svn_reporter; *report_baton = b; return SVN_NO_ERROR; } /* --- RA LAYER IMPLEMENTATION --- */ /* (Note: *ARGV_P is an output parameter.) */ static svn_error_t *find_tunnel_agent(const char *tunnel, const char *hostinfo, const char ***argv_p, apr_hash_t *config, apr_pool_t *pool) { svn_config_t *cfg; const char *val, *var, *cmd; char **cmd_argv; const char **argv; apr_size_t len; apr_status_t status; int n; /* Look up the tunnel specification in config. */ cfg = config ? svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG) : NULL; svn_config_get(cfg, &val, SVN_CONFIG_SECTION_TUNNELS, tunnel, NULL); /* We have one predefined tunnel scheme, if it isn't overridden by config. */ if (!val && strcmp(tunnel, "ssh") == 0) { /* Killing the tunnel agent with SIGTERM leads to unsightly * stderr output from ssh, unless we pass -q. * The "-q" option to ssh is widely supported: all versions of * OpenSSH have it, the old ssh-1.x and the 2.x, 3.x ssh.com * versions have it too. If the user is using some other ssh * implementation that doesn't accept it, they can override it * in the [tunnels] section of the config. */ - val = "$SVN_SSH ssh -q"; + val = "$SVN_SSH ssh -q --"; } if (!val || !*val) return svn_error_createf(SVN_ERR_BAD_URL, NULL, _("Undefined tunnel scheme '%s'"), tunnel); /* If the scheme definition begins with "$varname", it means there * is an environment variable which can override the command. */ if (*val == '$') { val++; len = strcspn(val, " "); var = apr_pstrmemdup(pool, val, len); cmd = getenv(var); if (!cmd) { cmd = val + len; while (*cmd == ' ') cmd++; if (!*cmd) return svn_error_createf(SVN_ERR_BAD_URL, NULL, _("Tunnel scheme %s requires environment " "variable %s to be defined"), tunnel, var); } } else cmd = val; /* Tokenize the command into a list of arguments. */ status = apr_tokenize_to_argv(cmd, &cmd_argv, pool); if (status != APR_SUCCESS) return svn_error_wrap_apr(status, _("Can't tokenize command '%s'"), cmd); /* Calc number of the fixed arguments. */ for (n = 0; cmd_argv[n] != NULL; n++) ; argv = apr_palloc(pool, (n + 4) * sizeof(char *)); /* Append the fixed arguments to the result. */ for (n = 0; cmd_argv[n] != NULL; n++) argv[n] = cmd_argv[n]; - argv[n++] = svn_path_uri_decode(hostinfo, pool); + argv[n++] = hostinfo; argv[n++] = "svnserve"; argv[n++] = "-t"; argv[n] = NULL; *argv_p = argv; return SVN_NO_ERROR; } /* This function handles any errors which occur in the child process * created for a tunnel agent. We write the error out as a command * failure; the code in ra_svn_open() to read the server's greeting * will see the error and return it to the caller. */ static void handle_child_process_error(apr_pool_t *pool, apr_status_t status, const char *desc) { svn_ra_svn_conn_t *conn; apr_file_t *in_file, *out_file; svn_stream_t *in_stream, *out_stream; svn_error_t *err; if (apr_file_open_stdin(&in_file, pool) || apr_file_open_stdout(&out_file, pool)) return; in_stream = svn_stream_from_aprfile2(in_file, FALSE, pool); out_stream = svn_stream_from_aprfile2(out_file, FALSE, pool); conn = svn_ra_svn_create_conn4(NULL, in_stream, out_stream, SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0, 0, pool); err = svn_error_wrap_apr(status, _("Error in child process: %s"), desc); svn_error_clear(svn_ra_svn__write_cmd_failure(conn, pool, err)); svn_error_clear(err); svn_error_clear(svn_ra_svn__flush(conn, pool)); } /* (Note: *CONN is an output parameter.) */ static svn_error_t *make_tunnel(const char **args, svn_ra_svn_conn_t **conn, apr_pool_t *pool) { apr_status_t status; apr_proc_t *proc; apr_procattr_t *attr; svn_error_t *err; status = apr_procattr_create(&attr, pool); if (status == APR_SUCCESS) status = apr_procattr_io_set(attr, 1, 1, 0); if (status == APR_SUCCESS) status = apr_procattr_cmdtype_set(attr, APR_PROGRAM_PATH); if (status == APR_SUCCESS) status = apr_procattr_child_errfn_set(attr, handle_child_process_error); proc = apr_palloc(pool, sizeof(*proc)); if (status == APR_SUCCESS) status = apr_proc_create(proc, *args, args, NULL, attr, pool); if (status != APR_SUCCESS) return svn_error_create(SVN_ERR_RA_CANNOT_CREATE_TUNNEL, svn_error_wrap_apr(status, _("Can't create tunnel")), NULL); /* Arrange for the tunnel agent to get a SIGTERM on pool * cleanup. This is a little extreme, but the alternatives * weren't working out. * * Closing the pipes and waiting for the process to die * was prone to mysterious hangs which are difficult to * diagnose (e.g. svnserve dumps core due to unrelated bug; * sshd goes into zombie state; ssh connection is never * closed; ssh never terminates). * See also the long dicussion in issue #2580 if you really * want to know various reasons for these problems and * the different opinions on this issue. * * On Win32, APR does not support KILL_ONLY_ONCE. It only has * KILL_ALWAYS and KILL_NEVER. Other modes are converted to * KILL_ALWAYS, which immediately calls TerminateProcess(). * This instantly kills the tunnel, leaving sshd and svnserve * on a remote machine running indefinitely. These processes * accumulate. The problem is most often seen with a fast client * machine and a modest internet connection, as the tunnel * is killed before being able to gracefully complete the * session. In that case, svn is unusable 100% of the time on * the windows machine. Thus, on Win32, we use KILL_NEVER and * take the lesser of two evils. */ #ifdef WIN32 apr_pool_note_subprocess(pool, proc, APR_KILL_NEVER); #else apr_pool_note_subprocess(pool, proc, APR_KILL_ONLY_ONCE); #endif /* APR pipe objects inherit by default. But we don't want the * tunnel agent's pipes held open by future child processes * (such as other ra_svn sessions), so turn that off. */ apr_file_inherit_unset(proc->in); apr_file_inherit_unset(proc->out); /* Guard against dotfile output to stdout on the server. */ *conn = svn_ra_svn_create_conn4(NULL, svn_stream_from_aprfile2(proc->out, FALSE, pool), svn_stream_from_aprfile2(proc->in, FALSE, pool), SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0, 0, pool); err = svn_ra_svn__skip_leading_garbage(*conn, pool); if (err) return svn_error_quick_wrap( err, _("To better debug SSH connection problems, remove the -q " "option from 'ssh' in the [tunnels] section of your " "Subversion configuration file.")); return SVN_NO_ERROR; } /* Parse URL inot URI, validating it and setting the default port if none was given. Allocate the URI fileds out of POOL. */ static svn_error_t *parse_url(const char *url, apr_uri_t *uri, apr_pool_t *pool) { apr_status_t apr_err; apr_err = apr_uri_parse(pool, url, uri); if (apr_err != 0) return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL, _("Illegal svn repository URL '%s'"), url); return SVN_NO_ERROR; } /* This structure is used as a baton for the pool cleanup function to store tunnel parameters used by the close-tunnel callback. */ struct tunnel_data_t { void *tunnel_context; void *tunnel_baton; svn_ra_close_tunnel_func_t close_tunnel; svn_stream_t *request; svn_stream_t *response; }; /* Pool cleanup function that invokes the close-tunnel callback. */ static apr_status_t close_tunnel_cleanup(void *baton) { const struct tunnel_data_t *const td = baton; if (td->close_tunnel) td->close_tunnel(td->tunnel_context, td->tunnel_baton); svn_error_clear(svn_stream_close(td->request)); /* We might have one stream to use for both request and response! */ if (td->request != td->response) svn_error_clear(svn_stream_close(td->response)); return APR_SUCCESS; /* ignored */ } /* Open a session to URL, returning it in *SESS_P, allocating it in POOL. URI is a parsed version of URL. CALLBACKS and CALLBACKS_BATON are provided by the caller of ra_svn_open. If TUNNEL_NAME is not NULL, it is the name of the tunnel type parsed from the URL scheme. If TUNNEL_ARGV is not NULL, it points to a program argument list to use when invoking the tunnel agent. */ static svn_error_t *open_session(svn_ra_svn__session_baton_t **sess_p, const char *url, const apr_uri_t *uri, const char *tunnel_name, const char **tunnel_argv, apr_hash_t *config, const svn_ra_callbacks2_t *callbacks, void *callbacks_baton, svn_auth_baton_t *auth_baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_ra_svn__session_baton_t *sess; svn_ra_svn_conn_t *conn; apr_socket_t *sock; apr_uint64_t minver, maxver; apr_array_header_t *mechlist, *server_caplist, *repos_caplist; const char *client_string = NULL; apr_pool_t *pool = result_pool; sess = apr_palloc(pool, sizeof(*sess)); sess->pool = pool; sess->is_tunneled = (tunnel_name != NULL); sess->url = apr_pstrdup(pool, url); sess->user = uri->user; sess->hostname = uri->hostname; sess->tunnel_name = tunnel_name; sess->tunnel_argv = tunnel_argv; sess->callbacks = callbacks; sess->callbacks_baton = callbacks_baton; sess->bytes_read = sess->bytes_written = 0; sess->auth_baton = auth_baton; if (config) SVN_ERR(svn_config_copy_config(&sess->config, config, pool)); else sess->config = NULL; if (tunnel_name) { sess->realm_prefix = apr_psprintf(pool, "", tunnel_name, uri->hostname, uri->port); if (tunnel_argv) SVN_ERR(make_tunnel(tunnel_argv, &conn, pool)); else { struct tunnel_data_t *const td = apr_palloc(pool, sizeof(*td)); td->tunnel_baton = callbacks->tunnel_baton; td->close_tunnel = NULL; SVN_ERR(callbacks->open_tunnel_func( &td->request, &td->response, &td->close_tunnel, &td->tunnel_context, callbacks->tunnel_baton, tunnel_name, uri->user, uri->hostname, uri->port, callbacks->cancel_func, callbacks_baton, pool)); apr_pool_cleanup_register(pool, td, close_tunnel_cleanup, apr_pool_cleanup_null); conn = svn_ra_svn_create_conn4(NULL, td->response, td->request, SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0, 0, pool); SVN_ERR(svn_ra_svn__skip_leading_garbage(conn, pool)); } } else { sess->realm_prefix = apr_psprintf(pool, "", uri->hostname, uri->port ? uri->port : SVN_RA_SVN_PORT); SVN_ERR(make_connection(uri->hostname, uri->port ? uri->port : SVN_RA_SVN_PORT, &sock, pool)); conn = svn_ra_svn_create_conn4(sock, NULL, NULL, SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0, 0, pool); } /* Build the useragent string, querying the client for any customizations it wishes to note. For historical reasons, we still deliver the hard-coded client version info (SVN_RA_SVN__DEFAULT_USERAGENT) and the customized client string separately in the protocol/capabilities handshake below. But the commit logic wants the combined form for use with the SVN_PROP_TXN_USER_AGENT ephemeral property because that's consistent with our DAV approach. */ if (sess->callbacks->get_client_string != NULL) SVN_ERR(sess->callbacks->get_client_string(sess->callbacks_baton, &client_string, pool)); if (client_string) sess->useragent = apr_pstrcat(pool, SVN_RA_SVN__DEFAULT_USERAGENT " ", client_string, SVN_VA_NULL); else sess->useragent = SVN_RA_SVN__DEFAULT_USERAGENT; /* Make sure we set conn->session before reading from it, * because the reader and writer functions expect a non-NULL value. */ sess->conn = conn; conn->session = sess; /* Read server's greeting. */ SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "nnll", &minver, &maxver, &mechlist, &server_caplist)); /* We support protocol version 2. */ if (minver > 2) return svn_error_createf(SVN_ERR_RA_SVN_BAD_VERSION, NULL, _("Server requires minimum version %d"), (int) minver); if (maxver < 2) return svn_error_createf(SVN_ERR_RA_SVN_BAD_VERSION, NULL, _("Server only supports versions up to %d"), (int) maxver); SVN_ERR(svn_ra_svn_set_capabilities(conn, server_caplist)); /* All released versions of Subversion support edit-pipeline, * so we do not support servers that do not. */ if (! svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_EDIT_PIPELINE)) return svn_error_create(SVN_ERR_RA_SVN_BAD_VERSION, NULL, _("Server does not support edit pipelining")); /* In protocol version 2, we send back our protocol version, our * capability list, and the URL, and subsequently there is an auth * request. */ /* Client-side capabilities list: */ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "n(wwwwww)cc(?c)", (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_DEPTH, SVN_RA_SVN_CAP_MERGEINFO, SVN_RA_SVN_CAP_LOG_REVPROPS, url, SVN_RA_SVN__DEFAULT_USERAGENT, client_string)); SVN_ERR(handle_auth_request(sess, pool)); /* This is where the security layer would go into effect if we * supported security layers, which is a ways off. */ /* Read the repository's uuid and root URL, and perhaps learn more capabilities that weren't available before now. */ SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "c?c?l", &conn->uuid, &conn->repos_root, &repos_caplist)); if (repos_caplist) SVN_ERR(svn_ra_svn_set_capabilities(conn, repos_caplist)); if (conn->repos_root) { conn->repos_root = svn_uri_canonicalize(conn->repos_root, pool); /* We should check that the returned string is a prefix of url, since that's the API guarantee, but this isn't true for 1.0 servers. Checking the length prevents client crashes. */ if (strlen(conn->repos_root) > strlen(url)) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Impossibly long repository root from " "server")); } *sess_p = sess; return SVN_NO_ERROR; } #ifdef SVN_HAVE_SASL #define RA_SVN_DESCRIPTION \ N_("Module for accessing a repository using the svn network protocol.\n" \ " - with Cyrus SASL authentication") #else #define RA_SVN_DESCRIPTION \ N_("Module for accessing a repository using the svn network protocol.") #endif static const char *ra_svn_get_description(apr_pool_t *pool) { return _(RA_SVN_DESCRIPTION); } static const char * const * ra_svn_get_schemes(apr_pool_t *pool) { static const char *schemes[] = { "svn", NULL }; return schemes; } +/* A simple whitelist to ensure the following are valid: + * user@server + * [::1]:22 + * server-name + * server_name + * 127.0.0.1 + * with an extra restriction that a leading '-' is invalid. + */ +static svn_boolean_t +is_valid_hostinfo(const char *hostinfo) +{ + const char *p = hostinfo; + if (p[0] == '-') + return FALSE; + + while (*p) + { + if (!svn_ctype_isalnum(*p) && !strchr(":.-_[]@", *p)) + return FALSE; + + ++p; + } + + return TRUE; +} + static svn_error_t *ra_svn_open(svn_ra_session_t *session, const char **corrected_url, const char *url, const svn_ra_callbacks2_t *callbacks, void *callback_baton, svn_auth_baton_t *auth_baton, apr_hash_t *config, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { apr_pool_t *sess_pool = svn_pool_create(result_pool); svn_ra_svn__session_baton_t *sess; const char *tunnel, **tunnel_argv; apr_uri_t uri; svn_config_t *cfg, *cfg_client; /* We don't support server-prescribed redirections in ra-svn. */ if (corrected_url) *corrected_url = NULL; SVN_ERR(parse_url(url, &uri, sess_pool)); parse_tunnel(url, &tunnel, result_pool); /* Use the default tunnel implementation if we got a tunnel name, but either do not have tunnel handler callbacks installed, or the handlers don't like the tunnel name. */ if (tunnel && (!callbacks->open_tunnel_func || (callbacks->check_tunnel_func && callbacks->open_tunnel_func && !callbacks->check_tunnel_func(callbacks->tunnel_baton, tunnel)))) - SVN_ERR(find_tunnel_agent(tunnel, uri.hostinfo, &tunnel_argv, config, - result_pool)); + { + const char *decoded_hostinfo; + + decoded_hostinfo = svn_path_uri_decode(uri.hostinfo, result_pool); + + if (!is_valid_hostinfo(decoded_hostinfo)) + return svn_error_createf(SVN_ERR_BAD_URL, NULL, _("Invalid host '%s'"), + uri.hostinfo); + + SVN_ERR(find_tunnel_agent(tunnel, decoded_hostinfo, &tunnel_argv, + config, result_pool)); + } else tunnel_argv = NULL; cfg_client = config ? svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG) : NULL; cfg = config ? svn_hash_gets(config, SVN_CONFIG_CATEGORY_SERVERS) : NULL; svn_auth_set_parameter(auth_baton, SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG, cfg_client); svn_auth_set_parameter(auth_baton, SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS, cfg); /* We open the session in a subpool so we can get rid of it if we reparent with a server that doesn't support reparenting. */ SVN_ERR(open_session(&sess, url, &uri, tunnel, tunnel_argv, config, callbacks, callback_baton, auth_baton, sess_pool, scratch_pool)); session->priv = sess; return SVN_NO_ERROR; } static svn_error_t *ra_svn_dup_session(svn_ra_session_t *new_session, svn_ra_session_t *old_session, const char *new_session_url, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_ra_svn__session_baton_t *old_sess = old_session->priv; SVN_ERR(ra_svn_open(new_session, NULL, new_session_url, old_sess->callbacks, old_sess->callbacks_baton, old_sess->auth_baton, old_sess->config, result_pool, scratch_pool)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_reparent(svn_ra_session_t *ra_session, const char *url, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = ra_session->priv; svn_ra_svn_conn_t *conn = sess->conn; svn_error_t *err; apr_pool_t *sess_pool; svn_ra_svn__session_baton_t *new_sess; apr_uri_t uri; SVN_ERR(svn_ra_svn__write_cmd_reparent(conn, pool, url)); err = handle_auth_request(sess, pool); if (! err) { SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); sess->url = apr_pstrdup(sess->pool, url); return SVN_NO_ERROR; } else if (err->apr_err != SVN_ERR_RA_SVN_UNKNOWN_CMD) return err; /* Servers before 1.4 doesn't support this command; try to reconnect instead. */ svn_error_clear(err); /* Create a new subpool of the RA session pool. */ sess_pool = svn_pool_create(ra_session->pool); err = parse_url(url, &uri, sess_pool); if (! err) err = open_session(&new_sess, url, &uri, sess->tunnel_name, sess->tunnel_argv, sess->config, sess->callbacks, sess->callbacks_baton, sess->auth_baton, sess_pool, sess_pool); /* We destroy the new session pool on error, since it is allocated in the main session pool. */ if (err) { svn_pool_destroy(sess_pool); return err; } /* We have a new connection, assign it and destroy the old. */ ra_session->priv = new_sess; svn_pool_destroy(sess->pool); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_session_url(svn_ra_session_t *session, const char **url, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; *url = apr_pstrdup(pool, sess->url); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_latest_rev(svn_ra_session_t *session, svn_revnum_t *rev, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; SVN_ERR(svn_ra_svn__write_cmd_get_latest_rev(conn, pool)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "r", rev)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_dated_rev(svn_ra_session_t *session, svn_revnum_t *rev, apr_time_t tm, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; SVN_ERR(svn_ra_svn__write_cmd_get_dated_rev(conn, pool, tm)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "r", rev)); return SVN_NO_ERROR; } /* Forward declaration. */ static svn_error_t *ra_svn_has_capability(svn_ra_session_t *session, svn_boolean_t *has, const char *capability, apr_pool_t *pool); static svn_error_t *ra_svn_change_rev_prop(svn_ra_session_t *session, svn_revnum_t rev, const char *name, const svn_string_t *const *old_value_p, const svn_string_t *value, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_boolean_t dont_care; const svn_string_t *old_value; svn_boolean_t has_atomic_revprops; SVN_ERR(ra_svn_has_capability(session, &has_atomic_revprops, SVN_RA_SVN_CAP_ATOMIC_REVPROPS, pool)); if (old_value_p) { /* How did you get past the same check in svn_ra_change_rev_prop2()? */ SVN_ERR_ASSERT(has_atomic_revprops); dont_care = FALSE; old_value = *old_value_p; } else { dont_care = TRUE; old_value = NULL; } if (has_atomic_revprops) SVN_ERR(svn_ra_svn__write_cmd_change_rev_prop2(conn, pool, rev, name, value, dont_care, old_value)); else SVN_ERR(svn_ra_svn__write_cmd_change_rev_prop(conn, pool, rev, name, value)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_uuid(svn_ra_session_t *session, const char **uuid, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; *uuid = conn->uuid; return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_repos_root(svn_ra_session_t *session, const char **url, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; if (!conn->repos_root) return svn_error_create(SVN_ERR_RA_SVN_BAD_VERSION, NULL, _("Server did not send repository root")); *url = conn->repos_root; return SVN_NO_ERROR; } static svn_error_t *ra_svn_rev_proplist(svn_ra_session_t *session, svn_revnum_t rev, apr_hash_t **props, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_array_header_t *proplist; SVN_ERR(svn_ra_svn__write_cmd_rev_proplist(conn, pool, rev)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "l", &proplist)); SVN_ERR(svn_ra_svn__parse_proplist(proplist, pool, props)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_rev_prop(svn_ra_session_t *session, svn_revnum_t rev, const char *name, svn_string_t **value, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; SVN_ERR(svn_ra_svn__write_cmd_rev_prop(conn, pool, rev, name)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "(?s)", value)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_end_commit(void *baton) { ra_svn_commit_callback_baton_t *ccb = baton; svn_commit_info_t *commit_info = svn_create_commit_info(ccb->pool); SVN_ERR(handle_auth_request(ccb->sess_baton, ccb->pool)); SVN_ERR(svn_ra_svn__read_tuple(ccb->sess_baton->conn, ccb->pool, "r(?c)(?c)?(?c)", &(commit_info->revision), &(commit_info->date), &(commit_info->author), &(commit_info->post_commit_err))); commit_info->repos_root = apr_pstrdup(ccb->pool, ccb->sess_baton->conn->repos_root); if (ccb->callback) SVN_ERR(ccb->callback(commit_info, ccb->callback_baton, ccb->pool)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_commit(svn_ra_session_t *session, const svn_delta_editor_t **editor, void **edit_baton, apr_hash_t *revprop_table, svn_commit_callback2_t callback, void *callback_baton, apr_hash_t *lock_tokens, svn_boolean_t keep_locks, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; ra_svn_commit_callback_baton_t *ccb; apr_hash_index_t *hi; apr_pool_t *iterpool; const svn_string_t *log_msg = svn_hash_gets(revprop_table, SVN_PROP_REVISION_LOG); if (log_msg == NULL && ! svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_COMMIT_REVPROPS)) { return svn_error_createf(SVN_ERR_BAD_PROPERTY_VALUE, NULL, _("ra_svn does not support not specifying " "a log message with pre-1.5 servers; " "consider passing an empty one, or upgrading " "the server")); } else if (log_msg == NULL) /* 1.5+ server. Set LOG_MSG to something, since the 'logmsg' argument to the 'commit' protocol command is non-optional; on the server side, only REVPROP_TABLE will be used, and LOG_MSG will be ignored. The "svn:log" member of REVPROP_TABLE table is NULL, therefore the commit will have a NULL log message (not just "", really NULL). svnserve 1.5.x+ has always ignored LOG_MSG when REVPROP_TABLE was present; this was elevated to a protocol promise in r1498550 (and later documented in this comment) in order to fix the segmentation fault bug described in the log message of r1498550.*/ log_msg = svn_string_create("", pool); /* If we're sending revprops other than svn:log, make sure the server won't silently ignore them. */ if (apr_hash_count(revprop_table) > 1 && ! svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_COMMIT_REVPROPS)) return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, NULL, _("Server doesn't support setting arbitrary " "revision properties during commit")); /* If the server supports ephemeral txnprops, add the one that reports the client's version level string. */ if (svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_COMMIT_REVPROPS) && svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_EPHEMERAL_TXNPROPS)) { svn_hash_sets(revprop_table, SVN_PROP_TXN_CLIENT_COMPAT_VERSION, svn_string_create(SVN_VER_NUMBER, pool)); svn_hash_sets(revprop_table, SVN_PROP_TXN_USER_AGENT, svn_string_create(sess_baton->useragent, pool)); } /* Tell the server we're starting the commit. Send log message here for backwards compatibility with servers before 1.5. */ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(c(!", "commit", log_msg->data)); if (lock_tokens) { iterpool = svn_pool_create(pool); for (hi = apr_hash_first(pool, lock_tokens); hi; hi = apr_hash_next(hi)) { const void *key; void *val; const char *path, *token; svn_pool_clear(iterpool); apr_hash_this(hi, &key, NULL, &val); path = key; token = val; SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "cc", path, token)); } svn_pool_destroy(iterpool); } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)b(!", keep_locks)); SVN_ERR(svn_ra_svn__write_proplist(conn, pool, revprop_table)); SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))")); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); /* Remember a few arguments for when the commit is over. */ ccb = apr_palloc(pool, sizeof(*ccb)); ccb->sess_baton = sess_baton; ccb->pool = pool; ccb->new_rev = NULL; ccb->callback = callback; ccb->callback_baton = callback_baton; /* Fetch an editor for the caller to drive. The editor will call * ra_svn_end_commit() upon close_edit(), at which point we'll fill * in the new_rev, committed_date, and committed_author values. */ svn_ra_svn_get_editor(editor, edit_baton, conn, pool, ra_svn_end_commit, ccb); return SVN_NO_ERROR; } /* Parse IPROPLIST, an array of svn_ra_svn_item_t structures, as a list of const char * repos relative paths and properties for those paths, storing the result as an array of svn_prop_inherited_item_t *items. */ static svn_error_t * parse_iproplist(apr_array_header_t **inherited_props, const apr_array_header_t *iproplist, svn_ra_session_t *session, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { int i; apr_pool_t *iterpool; if (iproplist == NULL) { /* If the server doesn't have the SVN_RA_CAPABILITY_INHERITED_PROPS capability we shouldn't be asking for inherited props, but if we did and the server sent back nothing then we'll want to handle that. */ *inherited_props = NULL; return SVN_NO_ERROR; } *inherited_props = apr_array_make( result_pool, iproplist->nelts, sizeof(svn_prop_inherited_item_t *)); iterpool = svn_pool_create(scratch_pool); for (i = 0; i < iproplist->nelts; i++) { apr_array_header_t *iprop_list; char *parent_rel_path; apr_hash_t *iprops; apr_hash_index_t *hi; svn_prop_inherited_item_t *new_iprop = apr_palloc(result_pool, sizeof(*new_iprop)); svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(iproplist, i, svn_ra_svn_item_t); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create( SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Inherited proplist element not a list")); svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "cl", &parent_rel_path, &iprop_list)); SVN_ERR(svn_ra_svn__parse_proplist(iprop_list, iterpool, &iprops)); new_iprop->path_or_url = apr_pstrdup(result_pool, parent_rel_path); new_iprop->prop_hash = svn_hash__make(result_pool); for (hi = apr_hash_first(iterpool, iprops); hi; hi = apr_hash_next(hi)) { const char *name = apr_hash_this_key(hi); svn_string_t *value = apr_hash_this_val(hi); svn_hash_sets(new_iprop->prop_hash, apr_pstrdup(result_pool, name), svn_string_dup(value, result_pool)); } APR_ARRAY_PUSH(*inherited_props, svn_prop_inherited_item_t *) = new_iprop; } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_file(svn_ra_session_t *session, const char *path, svn_revnum_t rev, svn_stream_t *stream, svn_revnum_t *fetched_rev, apr_hash_t **props, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_array_header_t *proplist; const char *expected_digest; svn_checksum_t *expected_checksum = NULL; svn_checksum_ctx_t *checksum_ctx; apr_pool_t *iterpool; SVN_ERR(svn_ra_svn__write_cmd_get_file(conn, pool, path, rev, (props != NULL), (stream != NULL))); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "(?c)rl", &expected_digest, &rev, &proplist)); if (fetched_rev) *fetched_rev = rev; if (props) SVN_ERR(svn_ra_svn__parse_proplist(proplist, pool, props)); /* We're done if the contents weren't wanted. */ if (!stream) return SVN_NO_ERROR; if (expected_digest) { SVN_ERR(svn_checksum_parse_hex(&expected_checksum, svn_checksum_md5, expected_digest, pool)); checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool); } /* Read the file's contents. */ iterpool = svn_pool_create(pool); while (1) { svn_ra_svn_item_t *item; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &item)); if (item->kind != SVN_RA_SVN_STRING) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Non-string as part of file contents")); if (item->u.string->len == 0) break; if (expected_checksum) SVN_ERR(svn_checksum_update(checksum_ctx, item->u.string->data, item->u.string->len)); SVN_ERR(svn_stream_write(stream, item->u.string->data, &item->u.string->len)); } svn_pool_destroy(iterpool); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); if (expected_checksum) { svn_checksum_t *checksum; SVN_ERR(svn_checksum_final(&checksum, checksum_ctx, pool)); if (!svn_checksum_match(checksum, expected_checksum)) return svn_checksum_mismatch_err(expected_checksum, checksum, pool, _("Checksum mismatch for '%s'"), path); } return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_dir(svn_ra_session_t *session, apr_hash_t **dirents, svn_revnum_t *fetched_rev, apr_hash_t **props, const char *path, svn_revnum_t rev, apr_uint32_t dirent_fields, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_array_header_t *proplist, *dirlist; int i; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(c(?r)bb(!", "get-dir", path, rev, (props != NULL), (dirents != NULL))); if (dirent_fields & SVN_DIRENT_KIND) SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_KIND)); if (dirent_fields & SVN_DIRENT_SIZE) SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_SIZE)); if (dirent_fields & SVN_DIRENT_HAS_PROPS) SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_HAS_PROPS)); if (dirent_fields & SVN_DIRENT_CREATED_REV) SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_CREATED_REV)); if (dirent_fields & SVN_DIRENT_TIME) SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_TIME)); if (dirent_fields & SVN_DIRENT_LAST_AUTHOR) SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_LAST_AUTHOR)); /* Always send the, nominally optional, want-iprops as "false" to workaround a bug in svnserve 1.8.0-1.8.8 that causes the server to see "true" if it is omitted. */ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)b)", FALSE)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "rll", &rev, &proplist, &dirlist)); if (fetched_rev) *fetched_rev = rev; if (props) SVN_ERR(svn_ra_svn__parse_proplist(proplist, pool, props)); /* We're done if dirents aren't wanted. */ if (!dirents) return SVN_NO_ERROR; /* Interpret the directory list. */ *dirents = svn_hash__make(pool); for (i = 0; i < dirlist->nelts; i++) { const char *name, *kind, *cdate, *cauthor; svn_boolean_t has_props; svn_dirent_t *dirent; apr_uint64_t size; svn_revnum_t crev; svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(dirlist, i, svn_ra_svn_item_t); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Dirlist element not a list")); SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cwnbr(?c)(?c)", &name, &kind, &size, &has_props, &crev, &cdate, &cauthor)); /* Nothing to sanitize here. Any multi-segment path is simply illegal in the hash returned by svn_ra_get_dir2. */ if (strchr(name, '/')) return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Invalid directory entry name '%s'"), name); dirent = svn_dirent_create(pool); dirent->kind = svn_node_kind_from_word(kind); dirent->size = size;/* FIXME: svn_filesize_t */ dirent->has_props = has_props; dirent->created_rev = crev; /* NOTE: the tuple's format string says CDATE may be NULL. But this function does not allow that. The server has always sent us some random date, however, so this just happens to work. But let's be wary of servers that are (improperly) fixed to send NULL. Note: they should NOT be "fixed" to send NULL, as that would break any older clients which received that NULL. But we may as well be defensive against a malicous server. */ if (cdate == NULL) dirent->time = 0; else SVN_ERR(svn_time_from_cstring(&dirent->time, cdate, pool)); dirent->last_author = cauthor; svn_hash_sets(*dirents, name, dirent); } return SVN_NO_ERROR; } /* Converts a apr_uint64_t with values TRUE, FALSE or SVN_RA_SVN_UNSPECIFIED_NUMBER as provided by svn_ra_svn__parse_tuple to a svn_tristate_t */ static svn_tristate_t optbool_to_tristate(apr_uint64_t v) { if (v == TRUE) /* not just non-zero but exactly equal to 'TRUE' */ return svn_tristate_true; if (v == FALSE) return svn_tristate_false; return svn_tristate_unknown; /* Contains SVN_RA_SVN_UNSPECIFIED_NUMBER */ } /* If REVISION is SVN_INVALID_REVNUM, no value is sent to the server, which defaults to youngest. */ static svn_error_t *ra_svn_get_mergeinfo(svn_ra_session_t *session, svn_mergeinfo_catalog_t *catalog, const apr_array_header_t *paths, svn_revnum_t revision, svn_mergeinfo_inheritance_t inherit, svn_boolean_t include_descendants, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; int i; apr_array_header_t *mergeinfo_tuple; svn_ra_svn_item_t *elt; const char *path; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "get-mergeinfo")); for (i = 0; i < paths->nelts; i++) { path = APR_ARRAY_IDX(paths, i, const char *); SVN_ERR(svn_ra_svn__write_cstring(conn, pool, path)); } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)(?r)wb)", revision, svn_inheritance_to_word(inherit), include_descendants)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "l", &mergeinfo_tuple)); *catalog = NULL; if (mergeinfo_tuple->nelts > 0) { *catalog = svn_hash__make(pool); for (i = 0; i < mergeinfo_tuple->nelts; i++) { svn_mergeinfo_t for_path; const char *to_parse; elt = &((svn_ra_svn_item_t *) mergeinfo_tuple->elts)[i]; if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Mergeinfo element is not a list")); SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cc", &path, &to_parse)); SVN_ERR(svn_mergeinfo_parse(&for_path, to_parse, pool)); /* Correct for naughty servers that send "relative" paths with leading slashes! */ svn_hash_sets(*catalog, path[0] == '/' ? path + 1 :path, for_path); } } return SVN_NO_ERROR; } static svn_error_t *ra_svn_update(svn_ra_session_t *session, const svn_ra_reporter3_t **reporter, void **report_baton, svn_revnum_t rev, const char *target, svn_depth_t depth, svn_boolean_t send_copyfrom_args, svn_boolean_t ignore_ancestry, const svn_delta_editor_t *update_editor, void *update_baton, apr_pool_t *pool, apr_pool_t *scratch_pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_boolean_t recurse = DEPTH_TO_RECURSE(depth); /* Tell the server we want to start an update. */ SVN_ERR(svn_ra_svn__write_cmd_update(conn, pool, rev, target, recurse, depth, send_copyfrom_args, ignore_ancestry)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * update_editor upon finish_report(). */ SVN_ERR(ra_svn_get_reporter(sess_baton, pool, update_editor, update_baton, target, depth, reporter, report_baton)); return SVN_NO_ERROR; } static svn_error_t * ra_svn_switch(svn_ra_session_t *session, const svn_ra_reporter3_t **reporter, void **report_baton, svn_revnum_t rev, const char *target, svn_depth_t depth, const char *switch_url, svn_boolean_t send_copyfrom_args, svn_boolean_t ignore_ancestry, const svn_delta_editor_t *update_editor, void *update_baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { apr_pool_t *pool = result_pool; svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_boolean_t recurse = DEPTH_TO_RECURSE(depth); /* Tell the server we want to start a switch. */ SVN_ERR(svn_ra_svn__write_cmd_switch(conn, pool, rev, target, recurse, switch_url, depth, send_copyfrom_args, ignore_ancestry)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * update_editor upon finish_report(). */ SVN_ERR(ra_svn_get_reporter(sess_baton, pool, update_editor, update_baton, target, depth, reporter, report_baton)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_status(svn_ra_session_t *session, const svn_ra_reporter3_t **reporter, void **report_baton, const char *target, svn_revnum_t rev, svn_depth_t depth, const svn_delta_editor_t *status_editor, void *status_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_boolean_t recurse = DEPTH_TO_RECURSE(depth); /* Tell the server we want to start a status operation. */ SVN_ERR(svn_ra_svn__write_cmd_status(conn, pool, target, recurse, rev, depth)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * status_editor upon finish_report(). */ SVN_ERR(ra_svn_get_reporter(sess_baton, pool, status_editor, status_baton, target, depth, reporter, report_baton)); return SVN_NO_ERROR; } static svn_error_t *ra_svn_diff(svn_ra_session_t *session, const svn_ra_reporter3_t **reporter, void **report_baton, svn_revnum_t rev, const char *target, svn_depth_t depth, svn_boolean_t ignore_ancestry, svn_boolean_t text_deltas, const char *versus_url, const svn_delta_editor_t *diff_editor, void *diff_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_boolean_t recurse = DEPTH_TO_RECURSE(depth); /* Tell the server we want to start a diff. */ SVN_ERR(svn_ra_svn__write_cmd_diff(conn, pool, rev, target, recurse, ignore_ancestry, versus_url, text_deltas, depth)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * diff_editor upon finish_report(). */ SVN_ERR(ra_svn_get_reporter(sess_baton, pool, diff_editor, diff_baton, target, depth, reporter, report_baton)); return SVN_NO_ERROR; } static svn_error_t * perform_ra_svn_log(svn_error_t **outer_error, svn_ra_session_t *session, const apr_array_header_t *paths, svn_revnum_t start, svn_revnum_t end, int limit, svn_boolean_t discover_changed_paths, svn_boolean_t strict_node_history, svn_boolean_t include_merged_revisions, const apr_array_header_t *revprops, svn_log_entry_receiver_t receiver, void *receiver_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_pool_t *iterpool; int i; int nest_level = 0; const char *path; char *name; svn_boolean_t want_custom_revprops; svn_boolean_t want_author = FALSE; svn_boolean_t want_message = FALSE; svn_boolean_t want_date = FALSE; int nreceived = 0; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "log")); if (paths) { for (i = 0; i < paths->nelts; i++) { path = APR_ARRAY_IDX(paths, i, const char *); SVN_ERR(svn_ra_svn__write_cstring(conn, pool, path)); } } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)(?r)(?r)bbnb!", start, end, discover_changed_paths, strict_node_history, (apr_uint64_t) limit, include_merged_revisions)); if (revprops) { want_custom_revprops = FALSE; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!w(!", "revprops")); for (i = 0; i < revprops->nelts; i++) { name = APR_ARRAY_IDX(revprops, i, char *); SVN_ERR(svn_ra_svn__write_cstring(conn, pool, name)); if (strcmp(name, SVN_PROP_REVISION_AUTHOR) == 0) want_author = TRUE; else if (strcmp(name, SVN_PROP_REVISION_DATE) == 0) want_date = TRUE; else if (strcmp(name, SVN_PROP_REVISION_LOG) == 0) want_message = TRUE; else want_custom_revprops = TRUE; } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))")); } else { SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!w())", "all-revprops")); want_author = TRUE; want_date = TRUE; want_message = TRUE; want_custom_revprops = TRUE; } SVN_ERR(handle_auth_request(sess_baton, pool)); /* Read the log messages. */ iterpool = svn_pool_create(pool); while (1) { apr_uint64_t has_children_param, invalid_revnum_param; apr_uint64_t has_subtractive_merge_param; svn_string_t *author, *date, *message; apr_array_header_t *cplist, *rplist; svn_log_entry_t *log_entry; svn_boolean_t has_children; svn_boolean_t subtractive_merge = FALSE; apr_uint64_t revprop_count; svn_ra_svn_item_t *item; apr_hash_t *cphash; svn_revnum_t rev; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &item)); if (item->kind == SVN_RA_SVN_WORD && strcmp(item->u.word, "done") == 0) break; if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Log entry not a list")); SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, iterpool, "lr(?s)(?s)(?s)?BBnl?B", &cplist, &rev, &author, &date, &message, &has_children_param, &invalid_revnum_param, &revprop_count, &rplist, &has_subtractive_merge_param)); if (want_custom_revprops && rplist == NULL) { /* Caller asked for custom revprops, but server is too old. */ return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, NULL, _("Server does not support custom revprops" " via log")); } if (has_children_param == SVN_RA_SVN_UNSPECIFIED_NUMBER) has_children = FALSE; else has_children = (svn_boolean_t) has_children_param; if (has_subtractive_merge_param == SVN_RA_SVN_UNSPECIFIED_NUMBER) subtractive_merge = FALSE; else subtractive_merge = (svn_boolean_t) has_subtractive_merge_param; /* Because the svn protocol won't let us send an invalid revnum, we have to recover that fact using the extra parameter. */ if (invalid_revnum_param != SVN_RA_SVN_UNSPECIFIED_NUMBER && invalid_revnum_param) rev = SVN_INVALID_REVNUM; if (cplist->nelts > 0) { /* Interpret the changed-paths list. */ cphash = svn_hash__make(iterpool); for (i = 0; i < cplist->nelts; i++) { svn_log_changed_path2_t *change; svn_string_t *cpath; const char *copy_path, *action, *kind_str; apr_uint64_t text_mods, prop_mods; svn_revnum_t copy_rev; svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(cplist, i, svn_ra_svn_item_t); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Changed-path entry not a list")); SVN_ERR(svn_ra_svn__read_data_log_changed_entry(elt->u.list, &cpath, &action, ©_path, ©_rev, &kind_str, &text_mods, &prop_mods)); if (!svn_fspath__is_canonical(cpath->data)) { cpath->data = svn_fspath__canonicalize(cpath->data, iterpool); cpath->len = strlen(cpath->data); } if (copy_path && !svn_fspath__is_canonical(copy_path)) copy_path = svn_fspath__canonicalize(copy_path, iterpool); change = svn_log_changed_path2_create(iterpool); change->action = *action; change->copyfrom_path = copy_path; change->copyfrom_rev = copy_rev; change->node_kind = svn_node_kind_from_word(kind_str); change->text_modified = optbool_to_tristate(text_mods); change->props_modified = optbool_to_tristate(prop_mods); apr_hash_set(cphash, cpath->data, cpath->len, change); } } else cphash = NULL; /* Invoke RECEIVER - Except if the server sends more than a >= 1 limit top level items - Or when the callback reported a SVN_ERR_CEASE_INVOCATION in an earlier invocation. */ if (! (limit && (nest_level == 0) && (++nreceived > limit)) && ! *outer_error) { svn_error_t *err; log_entry = svn_log_entry_create(iterpool); log_entry->changed_paths = cphash; log_entry->changed_paths2 = cphash; log_entry->revision = rev; log_entry->has_children = has_children; log_entry->subtractive_merge = subtractive_merge; if (rplist) SVN_ERR(svn_ra_svn__parse_proplist(rplist, iterpool, &log_entry->revprops)); if (log_entry->revprops == NULL) log_entry->revprops = svn_hash__make(iterpool); if (author && want_author) svn_hash_sets(log_entry->revprops, SVN_PROP_REVISION_AUTHOR, author); if (date && want_date) svn_hash_sets(log_entry->revprops, SVN_PROP_REVISION_DATE, date); if (message && want_message) svn_hash_sets(log_entry->revprops, SVN_PROP_REVISION_LOG, message); err = receiver(receiver_baton, log_entry, iterpool); if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION) { *outer_error = svn_error_trace( svn_error_compose_create(*outer_error, err)); } else SVN_ERR(err); if (log_entry->has_children) { nest_level++; } if (! SVN_IS_VALID_REVNUM(log_entry->revision)) { SVN_ERR_ASSERT(nest_level); nest_level--; } } } svn_pool_destroy(iterpool); /* Read the response. */ return svn_error_trace(svn_ra_svn__read_cmd_response(conn, pool, "")); } static svn_error_t * ra_svn_log(svn_ra_session_t *session, const apr_array_header_t *paths, svn_revnum_t start, svn_revnum_t end, int limit, svn_boolean_t discover_changed_paths, svn_boolean_t strict_node_history, svn_boolean_t include_merged_revisions, const apr_array_header_t *revprops, svn_log_entry_receiver_t receiver, void *receiver_baton, apr_pool_t *pool) { svn_error_t *outer_error = NULL; svn_error_t *err; err = svn_error_trace(perform_ra_svn_log(&outer_error, session, paths, start, end, limit, discover_changed_paths, strict_node_history, include_merged_revisions, revprops, receiver, receiver_baton, pool)); return svn_error_trace( svn_error_compose_create(outer_error, err)); } static svn_error_t *ra_svn_check_path(svn_ra_session_t *session, const char *path, svn_revnum_t rev, svn_node_kind_t *kind, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; const char *kind_word; SVN_ERR(svn_ra_svn__write_cmd_check_path(conn, pool, path, rev)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "w", &kind_word)); *kind = svn_node_kind_from_word(kind_word); return SVN_NO_ERROR; } /* If ERR is a command not supported error, wrap it in a SVN_ERR_RA_NOT_IMPLEMENTED with error message MSG. Else, return err. */ static svn_error_t *handle_unsupported_cmd(svn_error_t *err, const char *msg) { if (err && err->apr_err == SVN_ERR_RA_SVN_UNKNOWN_CMD) return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, _(msg)); return err; } static svn_error_t *ra_svn_stat(svn_ra_session_t *session, const char *path, svn_revnum_t rev, svn_dirent_t **dirent, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_array_header_t *list = NULL; svn_dirent_t *the_dirent; SVN_ERR(svn_ra_svn__write_cmd_stat(conn, pool, path, rev)); SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), N_("'stat' not implemented"))); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "(?l)", &list)); if (! list) { *dirent = NULL; } else { const char *kind, *cdate, *cauthor; svn_boolean_t has_props; svn_revnum_t crev; apr_uint64_t size; SVN_ERR(svn_ra_svn__parse_tuple(list, pool, "wnbr(?c)(?c)", &kind, &size, &has_props, &crev, &cdate, &cauthor)); the_dirent = svn_dirent_create(pool); the_dirent->kind = svn_node_kind_from_word(kind); the_dirent->size = size;/* FIXME: svn_filesize_t */ the_dirent->has_props = has_props; the_dirent->created_rev = crev; SVN_ERR(svn_time_from_cstring(&the_dirent->time, cdate, pool)); the_dirent->last_author = cauthor; *dirent = the_dirent; } return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_locations(svn_ra_session_t *session, apr_hash_t **locations, const char *path, svn_revnum_t peg_revision, const apr_array_header_t *location_revisions, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_revnum_t revision; svn_boolean_t is_done; int i; /* Transmit the parameters. */ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(cr(!", "get-locations", path, peg_revision)); for (i = 0; i < location_revisions->nelts; i++) { revision = APR_ARRAY_IDX(location_revisions, i, svn_revnum_t); SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!r!", revision)); } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))")); /* Servers before 1.1 don't support this command. Check for this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), N_("'get-locations' not implemented"))); /* Read the hash items. */ is_done = FALSE; *locations = apr_hash_make(pool); while (!is_done) { svn_ra_svn_item_t *item; const char *ret_path; SVN_ERR(svn_ra_svn__read_item(conn, pool, &item)); if (item->kind == SVN_RA_SVN_WORD && strcmp(item->u.word, "done") == 0) is_done = 1; else if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Location entry not a list")); else { SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, pool, "rc", &revision, &ret_path)); ret_path = svn_fspath__canonicalize(ret_path, pool); apr_hash_set(*locations, apr_pmemdup(pool, &revision, sizeof(revision)), sizeof(revision), ret_path); } } /* Read the response. This is so the server would have a chance to * report an error. */ return svn_error_trace(svn_ra_svn__read_cmd_response(conn, pool, "")); } static svn_error_t * ra_svn_get_location_segments(svn_ra_session_t *session, const char *path, svn_revnum_t peg_revision, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_location_segment_receiver_t receiver, void *receiver_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_boolean_t is_done; apr_pool_t *iterpool = svn_pool_create(pool); /* Transmit the parameters. */ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(c(?r)(?r)(?r))", "get-location-segments", path, peg_revision, start_rev, end_rev)); /* Servers before 1.5 don't support this command. Check for this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), N_("'get-location-segments'" " not implemented"))); /* Parse the response. */ is_done = FALSE; while (!is_done) { svn_revnum_t range_start, range_end; svn_ra_svn_item_t *item; const char *ret_path; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &item)); if (item->kind == SVN_RA_SVN_WORD && strcmp(item->u.word, "done") == 0) is_done = 1; else if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Location segment entry not a list")); else { svn_location_segment_t *segment = apr_pcalloc(iterpool, sizeof(*segment)); SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, iterpool, "rr(?c)", &range_start, &range_end, &ret_path)); if (! (SVN_IS_VALID_REVNUM(range_start) && SVN_IS_VALID_REVNUM(range_end))) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Expected valid revision range")); if (ret_path) ret_path = svn_relpath_canonicalize(ret_path, iterpool); segment->path = ret_path; segment->range_start = range_start; segment->range_end = range_end; SVN_ERR(receiver(segment, receiver_baton, iterpool)); } } svn_pool_destroy(iterpool); /* Read the response. This is so the server would have a chance to * report an error. */ SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_file_revs(svn_ra_session_t *session, const char *path, svn_revnum_t start, svn_revnum_t end, svn_boolean_t include_merged_revisions, svn_file_rev_handler_t handler, void *handler_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; apr_pool_t *rev_pool, *chunk_pool; svn_boolean_t has_txdelta; svn_boolean_t had_revision = FALSE; /* One sub-pool for each revision and one for each txdelta chunk. Note that the rev_pool must live during the following txdelta. */ rev_pool = svn_pool_create(pool); chunk_pool = svn_pool_create(pool); SVN_ERR(svn_ra_svn__write_cmd_get_file_revs(sess_baton->conn, pool, path, start, end, include_merged_revisions)); /* Servers before 1.1 don't support this command. Check for this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), N_("'get-file-revs' not implemented"))); while (1) { apr_array_header_t *rev_proplist, *proplist; apr_uint64_t merged_rev_param; apr_array_header_t *props; svn_ra_svn_item_t *item; apr_hash_t *rev_props; svn_revnum_t rev; const char *p; svn_boolean_t merged_rev; svn_txdelta_window_handler_t d_handler; void *d_baton; svn_pool_clear(rev_pool); svn_pool_clear(chunk_pool); SVN_ERR(svn_ra_svn__read_item(sess_baton->conn, rev_pool, &item)); if (item->kind == SVN_RA_SVN_WORD && strcmp(item->u.word, "done") == 0) break; /* Either we've got a correct revision or we will error out below. */ had_revision = TRUE; if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Revision entry not a list")); SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, rev_pool, "crll?B", &p, &rev, &rev_proplist, &proplist, &merged_rev_param)); p = svn_fspath__canonicalize(p, rev_pool); SVN_ERR(svn_ra_svn__parse_proplist(rev_proplist, rev_pool, &rev_props)); SVN_ERR(parse_prop_diffs(proplist, rev_pool, &props)); if (merged_rev_param == SVN_RA_SVN_UNSPECIFIED_NUMBER) merged_rev = FALSE; else merged_rev = (svn_boolean_t) merged_rev_param; /* Get the first delta chunk so we know if there is a delta. */ SVN_ERR(svn_ra_svn__read_item(sess_baton->conn, chunk_pool, &item)); if (item->kind != SVN_RA_SVN_STRING) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Text delta chunk not a string")); has_txdelta = item->u.string->len > 0; SVN_ERR(handler(handler_baton, p, rev, rev_props, merged_rev, has_txdelta ? &d_handler : NULL, &d_baton, props, rev_pool)); /* Process the text delta if any. */ if (has_txdelta) { svn_stream_t *stream; if (d_handler && d_handler != svn_delta_noop_window_handler) stream = svn_txdelta_parse_svndiff(d_handler, d_baton, TRUE, rev_pool); else stream = NULL; while (item->u.string->len > 0) { apr_size_t size; size = item->u.string->len; if (stream) SVN_ERR(svn_stream_write(stream, item->u.string->data, &size)); svn_pool_clear(chunk_pool); SVN_ERR(svn_ra_svn__read_item(sess_baton->conn, chunk_pool, &item)); if (item->kind != SVN_RA_SVN_STRING) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Text delta chunk not a string")); } if (stream) SVN_ERR(svn_stream_close(stream)); } } SVN_ERR(svn_ra_svn__read_cmd_response(sess_baton->conn, pool, "")); /* Return error if we didn't get any revisions. */ if (!had_revision) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("The get-file-revs command didn't return " "any revisions")); svn_pool_destroy(chunk_pool); svn_pool_destroy(rev_pool); return SVN_NO_ERROR; } /* For each path in PATH_REVS, send a 'lock' command to the server. Used with 1.2.x series servers which support locking, but of only one path at a time. ra_svn_lock(), which supports 'lock-many' is now the default. See svn_ra_lock() docstring for interface details. */ static svn_error_t *ra_svn_lock_compat(svn_ra_session_t *session, apr_hash_t *path_revs, const char *comment, svn_boolean_t steal_lock, svn_ra_lock_callback_t lock_func, void *lock_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; apr_array_header_t *list; apr_hash_index_t *hi; apr_pool_t *iterpool = svn_pool_create(pool); for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi)) { svn_lock_t *lock; const void *key; const char *path; void *val; svn_revnum_t *revnum; svn_error_t *err, *callback_err = NULL; svn_pool_clear(iterpool); apr_hash_this(hi, &key, NULL, &val); path = key; revnum = val; SVN_ERR(svn_ra_svn__write_cmd_lock(conn, iterpool, path, comment, steal_lock, *revnum)); /* Servers before 1.2 doesn't support locking. Check this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool), N_("Server doesn't support " "the lock command"))); err = svn_ra_svn__read_cmd_response(conn, iterpool, "l", &list); if (!err) SVN_ERR(parse_lock(list, iterpool, &lock)); if (err && !SVN_ERR_IS_LOCK_ERROR(err)) return err; if (lock_func) callback_err = lock_func(lock_baton, path, TRUE, err ? NULL : lock, err, iterpool); svn_error_clear(err); if (callback_err) return callback_err; } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } /* For each path in PATH_TOKENS, send an 'unlock' command to the server. Used with 1.2.x series servers which support unlocking, but of only one path at a time. ra_svn_unlock(), which supports 'unlock-many' is now the default. See svn_ra_unlock() docstring for interface details. */ static svn_error_t *ra_svn_unlock_compat(svn_ra_session_t *session, apr_hash_t *path_tokens, svn_boolean_t break_lock, svn_ra_lock_callback_t lock_func, void *lock_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; apr_hash_index_t *hi; apr_pool_t *iterpool = svn_pool_create(pool); for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi)) { const void *key; const char *path; void *val; const char *token; svn_error_t *err, *callback_err = NULL; svn_pool_clear(iterpool); apr_hash_this(hi, &key, NULL, &val); path = key; if (strcmp(val, "") != 0) token = val; else token = NULL; SVN_ERR(svn_ra_svn__write_cmd_unlock(conn, iterpool, path, token, break_lock)); /* Servers before 1.2 don't support locking. Check this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, iterpool), N_("Server doesn't support the unlock " "command"))); err = svn_ra_svn__read_cmd_response(conn, iterpool, ""); if (err && !SVN_ERR_IS_UNLOCK_ERROR(err)) return err; if (lock_func) callback_err = lock_func(lock_baton, path, FALSE, NULL, err, pool); svn_error_clear(err); if (callback_err) return callback_err; } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } /* Tell the server to lock all paths in PATH_REVS. See svn_ra_lock() for interface details. */ static svn_error_t *ra_svn_lock(svn_ra_session_t *session, apr_hash_t *path_revs, const char *comment, svn_boolean_t steal_lock, svn_ra_lock_callback_t lock_func, void *lock_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t *conn = sess->conn; apr_hash_index_t *hi; svn_error_t *err; apr_pool_t *iterpool = svn_pool_create(pool); SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((?c)b(!", "lock-many", comment, steal_lock)); for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi)) { const void *key; const char *path; void *val; svn_revnum_t *revnum; svn_pool_clear(iterpool); apr_hash_this(hi, &key, NULL, &val); path = key; revnum = val; SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "c(?r)", path, *revnum)); } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))")); err = handle_auth_request(sess, pool); /* Pre-1.3 servers don't support 'lock-many'. If that fails, fall back * to 'lock'. */ if (err && err->apr_err == SVN_ERR_RA_SVN_UNKNOWN_CMD) { svn_error_clear(err); return ra_svn_lock_compat(session, path_revs, comment, steal_lock, lock_func, lock_baton, pool); } if (err) return err; /* Loop over responses to get lock information. */ for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi)) { svn_ra_svn_item_t *elt; const void *key; const char *path; svn_error_t *callback_err; const char *status; svn_lock_t *lock; apr_array_header_t *list; apr_hash_this(hi, &key, NULL, NULL); path = key; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &elt)); /* The server might have encountered some sort of fatal error in the middle of the request list. If this happens, it will transmit "done" to end the lock-info early, and then the overall command response will talk about the fatal error. */ if (elt->kind == SVN_RA_SVN_WORD && strcmp(elt->u.word, "done") == 0) break; if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Lock response not a list")); SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "wl", &status, &list)); if (strcmp(status, "failure") == 0) err = svn_ra_svn__handle_failure_status(list, iterpool); else if (strcmp(status, "success") == 0) { SVN_ERR(parse_lock(list, iterpool, &lock)); err = NULL; } else return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Unknown status for lock command")); if (lock_func) callback_err = lock_func(lock_baton, path, TRUE, err ? NULL : lock, err, iterpool); else callback_err = SVN_NO_ERROR; svn_error_clear(err); if (callback_err) return callback_err; } /* If we didn't break early above, and the whole hash was traversed, read the final "done" from the server. */ if (!hi) { svn_ra_svn_item_t *elt; SVN_ERR(svn_ra_svn__read_item(conn, pool, &elt)); if (elt->kind != SVN_RA_SVN_WORD || strcmp(elt->u.word, "done") != 0) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Didn't receive end marker for lock " "responses")); } SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); svn_pool_destroy(iterpool); return SVN_NO_ERROR; } /* Tell the server to unlock all paths in PATH_TOKENS. See svn_ra_unlock() for interface details. */ static svn_error_t *ra_svn_unlock(svn_ra_session_t *session, apr_hash_t *path_tokens, svn_boolean_t break_lock, svn_ra_lock_callback_t lock_func, void *lock_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t *conn = sess->conn; apr_hash_index_t *hi; apr_pool_t *iterpool = svn_pool_create(pool); svn_error_t *err; const char *path; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(b(!", "unlock-many", break_lock)); for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi)) { void *val; const void *key; const char *token; svn_pool_clear(iterpool); apr_hash_this(hi, &key, NULL, &val); path = key; if (strcmp(val, "") != 0) token = val; else token = NULL; SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "c(?c)", path, token)); } SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))")); err = handle_auth_request(sess, pool); /* Pre-1.3 servers don't support 'unlock-many'. If unknown, fall back * to 'unlock'. */ if (err && err->apr_err == SVN_ERR_RA_SVN_UNKNOWN_CMD) { svn_error_clear(err); return ra_svn_unlock_compat(session, path_tokens, break_lock, lock_func, lock_baton, pool); } if (err) return err; /* Loop over responses to unlock files. */ for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi)) { svn_ra_svn_item_t *elt; const void *key; svn_error_t *callback_err; const char *status; apr_array_header_t *list; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &elt)); /* The server might have encountered some sort of fatal error in the middle of the request list. If this happens, it will transmit "done" to end the lock-info early, and then the overall command response will talk about the fatal error. */ if (elt->kind == SVN_RA_SVN_WORD && (strcmp(elt->u.word, "done") == 0)) break; apr_hash_this(hi, &key, NULL, NULL); path = key; if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Unlock response not a list")); SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "wl", &status, &list)); if (strcmp(status, "failure") == 0) err = svn_ra_svn__handle_failure_status(list, iterpool); else if (strcmp(status, "success") == 0) { SVN_ERR(svn_ra_svn__parse_tuple(list, iterpool, "c", &path)); err = SVN_NO_ERROR; } else return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Unknown status for unlock command")); if (lock_func) callback_err = lock_func(lock_baton, path, FALSE, NULL, err, iterpool); else callback_err = SVN_NO_ERROR; svn_error_clear(err); if (callback_err) return callback_err; } /* If we didn't break early above, and the whole hash was traversed, read the final "done" from the server. */ if (!hi) { svn_ra_svn_item_t *elt; SVN_ERR(svn_ra_svn__read_item(conn, pool, &elt)); if (elt->kind != SVN_RA_SVN_WORD || strcmp(elt->u.word, "done") != 0) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Didn't receive end marker for unlock " "responses")); } SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "")); svn_pool_destroy(iterpool); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_lock(svn_ra_session_t *session, svn_lock_t **lock, const char *path, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; apr_array_header_t *list; SVN_ERR(svn_ra_svn__write_cmd_get_lock(conn, pool, path)); /* Servers before 1.2 doesn't support locking. Check this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool), N_("Server doesn't support the get-lock " "command"))); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "(?l)", &list)); if (list) SVN_ERR(parse_lock(list, pool, lock)); else *lock = NULL; return SVN_NO_ERROR; } /* Copied from svn_ra_get_path_relative_to_root() and de-vtable-ized to prevent a dependency cycle. */ static svn_error_t *path_relative_to_root(svn_ra_session_t *session, const char **rel_path, const char *url, apr_pool_t *pool) { const char *root_url; SVN_ERR(ra_svn_get_repos_root(session, &root_url, pool)); *rel_path = svn_uri_skip_ancestor(root_url, url, pool); if (! *rel_path) return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL, _("'%s' isn't a child of repository root " "URL '%s'"), url, root_url); return SVN_NO_ERROR; } static svn_error_t *ra_svn_get_locks(svn_ra_session_t *session, apr_hash_t **locks, const char *path, svn_depth_t depth, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; apr_array_header_t *list; const char *full_url, *abs_path; int i; /* Figure out the repository abspath from PATH. */ full_url = svn_path_url_add_component2(sess->url, path, pool); SVN_ERR(path_relative_to_root(session, &abs_path, full_url, pool)); abs_path = svn_fspath__canonicalize(abs_path, pool); SVN_ERR(svn_ra_svn__write_cmd_get_locks(conn, pool, path, depth)); /* Servers before 1.2 doesn't support locking. Check this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool), N_("Server doesn't support the get-lock " "command"))); SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "l", &list)); *locks = apr_hash_make(pool); for (i = 0; i < list->nelts; ++i) { svn_lock_t *lock; svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(list, i, svn_ra_svn_item_t); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Lock element not a list")); SVN_ERR(parse_lock(elt->u.list, pool, &lock)); /* Filter out unwanted paths. Since Subversion only allows locks on files, we can treat depth=immediates the same as depth=files for filtering purposes. Meaning, we'll keep this lock if: a) its path is the very path we queried, or b) we've asked for a fully recursive answer, or c) we've asked for depth=files or depth=immediates, and this lock is on an immediate child of our query path. */ if ((strcmp(abs_path, lock->path) == 0) || (depth == svn_depth_infinity)) { svn_hash_sets(*locks, lock->path, lock); } else if ((depth == svn_depth_files) || (depth == svn_depth_immediates)) { const char *relpath = svn_fspath__skip_ancestor(abs_path, lock->path); if (relpath && (svn_path_component_count(relpath) == 1)) svn_hash_sets(*locks, lock->path, lock); } } return SVN_NO_ERROR; } static svn_error_t *ra_svn_replay(svn_ra_session_t *session, svn_revnum_t revision, svn_revnum_t low_water_mark, svn_boolean_t send_deltas, const svn_delta_editor_t *editor, void *edit_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; SVN_ERR(svn_ra_svn__write_cmd_replay(sess->conn, pool, revision, low_water_mark, send_deltas)); SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool), N_("Server doesn't support the replay " "command"))); SVN_ERR(svn_ra_svn_drive_editor2(sess->conn, pool, editor, edit_baton, NULL, TRUE)); return svn_error_trace(svn_ra_svn__read_cmd_response(sess->conn, pool, "")); } static svn_error_t * ra_svn_replay_range(svn_ra_session_t *session, svn_revnum_t start_revision, svn_revnum_t end_revision, svn_revnum_t low_water_mark, svn_boolean_t send_deltas, svn_ra_replay_revstart_callback_t revstart_func, svn_ra_replay_revfinish_callback_t revfinish_func, void *replay_baton, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; apr_pool_t *iterpool; svn_revnum_t rev; svn_boolean_t drive_aborted = FALSE; SVN_ERR(svn_ra_svn__write_cmd_replay_range(sess->conn, pool, start_revision, end_revision, low_water_mark, send_deltas)); SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool), N_("Server doesn't support the " "replay-range command"))); iterpool = svn_pool_create(pool); for (rev = start_revision; rev <= end_revision; rev++) { const svn_delta_editor_t *editor; void *edit_baton; apr_hash_t *rev_props; const char *word; apr_array_header_t *list; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_tuple(sess->conn, iterpool, "wl", &word, &list)); if (strcmp(word, "revprops") != 0) return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Expected 'revprops', found '%s'"), word); SVN_ERR(svn_ra_svn__parse_proplist(list, iterpool, &rev_props)); SVN_ERR(revstart_func(rev, replay_baton, &editor, &edit_baton, rev_props, iterpool)); SVN_ERR(svn_ra_svn_drive_editor2(sess->conn, iterpool, editor, edit_baton, &drive_aborted, TRUE)); /* If drive_editor2() aborted the commit, do NOT try to call revfinish_func and commit the transaction! */ if (drive_aborted) { svn_pool_destroy(iterpool); return svn_error_create(SVN_ERR_RA_SVN_EDIT_ABORTED, NULL, _("Error while replaying commit")); } SVN_ERR(revfinish_func(rev, replay_baton, editor, edit_baton, rev_props, iterpool)); } svn_pool_destroy(iterpool); return svn_error_trace(svn_ra_svn__read_cmd_response(sess->conn, pool, "")); } static svn_error_t * ra_svn_has_capability(svn_ra_session_t *session, svn_boolean_t *has, const char *capability, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess = session->priv; static const char* capabilities[][2] = { /* { ra capability string, svn:// wire capability string} */ {SVN_RA_CAPABILITY_DEPTH, SVN_RA_SVN_CAP_DEPTH}, {SVN_RA_CAPABILITY_MERGEINFO, SVN_RA_SVN_CAP_MERGEINFO}, {SVN_RA_CAPABILITY_LOG_REVPROPS, SVN_RA_SVN_CAP_LOG_REVPROPS}, {SVN_RA_CAPABILITY_PARTIAL_REPLAY, SVN_RA_SVN_CAP_PARTIAL_REPLAY}, {SVN_RA_CAPABILITY_COMMIT_REVPROPS, SVN_RA_SVN_CAP_COMMIT_REVPROPS}, {SVN_RA_CAPABILITY_ATOMIC_REVPROPS, SVN_RA_SVN_CAP_ATOMIC_REVPROPS}, {SVN_RA_CAPABILITY_INHERITED_PROPS, SVN_RA_SVN_CAP_INHERITED_PROPS}, {SVN_RA_CAPABILITY_EPHEMERAL_TXNPROPS, SVN_RA_SVN_CAP_EPHEMERAL_TXNPROPS}, {SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE, SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE}, {NULL, NULL} /* End of list marker */ }; int i; *has = FALSE; for (i = 0; capabilities[i][0]; i++) { if (strcmp(capability, capabilities[i][0]) == 0) { *has = svn_ra_svn_has_capability(sess->conn, capabilities[i][1]); return SVN_NO_ERROR; } } return svn_error_createf(SVN_ERR_UNKNOWN_CAPABILITY, NULL, _("Don't know anything about capability '%s'"), capability); } static svn_error_t * ra_svn_get_deleted_rev(svn_ra_session_t *session, const char *path, svn_revnum_t peg_revision, svn_revnum_t end_revision, svn_revnum_t *revision_deleted, apr_pool_t *pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; /* Transmit the parameters. */ SVN_ERR(svn_ra_svn__write_cmd_get_deleted_rev(conn, pool, path, peg_revision, end_revision)); /* Servers before 1.6 don't support this command. Check for this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), N_("'get-deleted-rev' not implemented"))); return svn_error_trace(svn_ra_svn__read_cmd_response(conn, pool, "r", revision_deleted)); } static svn_error_t * ra_svn_register_editor_shim_callbacks(svn_ra_session_t *session, svn_delta_shim_callbacks_t *callbacks) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; conn->shim_callbacks = callbacks; return SVN_NO_ERROR; } static svn_error_t * ra_svn_get_inherited_props(svn_ra_session_t *session, apr_array_header_t **iprops, const char *path, svn_revnum_t revision, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_array_header_t *iproplist; svn_boolean_t iprop_capable; SVN_ERR(ra_svn_has_capability(session, &iprop_capable, SVN_RA_CAPABILITY_INHERITED_PROPS, scratch_pool)); /* If we don't support native iprop handling, use the implementation in libsvn_ra */ if (!iprop_capable) return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, NULL, NULL); SVN_ERR(svn_ra_svn__write_cmd_get_iprops(conn, scratch_pool, path, revision)); SVN_ERR(handle_auth_request(sess_baton, scratch_pool)); SVN_ERR(svn_ra_svn__read_cmd_response(conn, scratch_pool, "l", &iproplist)); SVN_ERR(parse_iproplist(iprops, iproplist, session, result_pool, scratch_pool)); return SVN_NO_ERROR; } static const svn_ra__vtable_t ra_svn_vtable = { svn_ra_svn_version, ra_svn_get_description, ra_svn_get_schemes, ra_svn_open, ra_svn_dup_session, ra_svn_reparent, ra_svn_get_session_url, ra_svn_get_latest_rev, ra_svn_get_dated_rev, ra_svn_change_rev_prop, ra_svn_rev_proplist, ra_svn_rev_prop, ra_svn_commit, ra_svn_get_file, ra_svn_get_dir, ra_svn_get_mergeinfo, ra_svn_update, ra_svn_switch, ra_svn_status, ra_svn_diff, ra_svn_log, ra_svn_check_path, ra_svn_stat, ra_svn_get_uuid, ra_svn_get_repos_root, ra_svn_get_locations, ra_svn_get_location_segments, ra_svn_get_file_revs, ra_svn_lock, ra_svn_unlock, ra_svn_get_lock, ra_svn_get_locks, ra_svn_replay, ra_svn_has_capability, ra_svn_replay_range, ra_svn_get_deleted_rev, ra_svn_register_editor_shim_callbacks, ra_svn_get_inherited_props }; svn_error_t * svn_ra_svn__init(const svn_version_t *loader_version, const svn_ra__vtable_t **vtable, apr_pool_t *pool) { static const svn_version_checklist_t checklist[] = { { "svn_subr", svn_subr_version }, { "svn_delta", svn_delta_version }, { NULL, NULL } }; SVN_ERR(svn_ver_check_list2(svn_ra_svn_version(), checklist, svn_ver_equal)); /* Simplified version check to make sure we can safely use the VTABLE parameter. The RA loader does a more exhaustive check. */ if (loader_version->major != SVN_VER_MAJOR) { return svn_error_createf (SVN_ERR_VERSION_MISMATCH, NULL, _("Unsupported RA loader version (%d) for ra_svn"), loader_version->major); } *vtable = &ra_svn_vtable; #ifdef SVN_HAVE_SASL SVN_ERR(svn_ra_svn__sasl_init()); #endif return SVN_NO_ERROR; } /* Compatibility wrapper for the 1.1 and before API. */ #define NAME "ra_svn" #define DESCRIPTION RA_SVN_DESCRIPTION #define VTBL ra_svn_vtable #define INITFUNC svn_ra_svn__init #define COMPAT_INITFUNC svn_ra_svn_init #include "../libsvn_ra/wrapper_template.h" Index: stable/11/contrib/subversion/subversion/libsvn_repos/dump.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_repos/dump.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_repos/dump.c (revision 322442) @@ -1,2482 +1,2486 @@ /* dump.c --- writing filesystem contents into a portable 'dumpfile' format. * * ==================================================================== * 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 #include "svn_private_config.h" #include "svn_pools.h" #include "svn_error.h" #include "svn_fs.h" #include "svn_hash.h" #include "svn_iter.h" #include "svn_repos.h" #include "svn_string.h" #include "svn_dirent_uri.h" #include "svn_path.h" #include "svn_time.h" #include "svn_checksum.h" #include "svn_props.h" #include "svn_sorts.h" #include "private/svn_repos_private.h" #include "private/svn_mergeinfo_private.h" #include "private/svn_fs_private.h" #include "private/svn_sorts_private.h" #include "private/svn_utf_private.h" #include "private/svn_cache.h" #define ARE_VALID_COPY_ARGS(p,r) ((p) && SVN_IS_VALID_REVNUM(r)) /*----------------------------------------------------------------------*/ /* To be able to check whether a path exists in the current revision (as changes come in), we need to track the relevant tree changes. In particular, we remember deletions, additions and copies including their copy-from info. Since the dump performs a pre-order tree walk, we only need to store the data for the stack of parent folders. The problem that we are trying to solve is that the dump receives transforming operations whose validity depends on previous operations in the same revision but cannot be checked against the final state as stored in the repository as that is the state *after* we applied the respective tree changes. Note that the tracker functions don't perform any sanity or validity checks. Those higher-level tests have to be done in the calling code. However, there is no way to corrupt the data structure using the provided functions. */ /* Single entry in the path tracker. Not all levels along the path hierarchy do need to have an instance of this struct but only those that got changed by a tree modification. Please note that the path info in this struct is stored in re-usable stringbuf objects such that we don't need to allocate more memory than the longest path we encounter. */ typedef struct path_tracker_entry_t { /* path in the current tree */ svn_stringbuf_t *path; /* copy-from path (must be empty if COPYFROM_REV is SVN_INVALID_REVNUM) */ svn_stringbuf_t *copyfrom_path; /* copy-from revision (SVN_INVALID_REVNUM for additions / replacements that don't copy history, i.e. with no sub-tree) */ svn_revnum_t copyfrom_rev; /* if FALSE, PATH has been deleted */ svn_boolean_t exists; } path_tracker_entry_t; /* Tracks all tree modifications above the current path. */ typedef struct path_tracker_t { /* Container for all relevant tree changes in depth order. May contain more entries than DEPTH to allow for reusing memory. Only entries 0 .. DEPTH-1 are valid. */ apr_array_header_t *stack; /* Number of relevant entries in STACK. May be 0 */ int depth; /* Revision that we current track. If DEPTH is 0, paths are exist in REVISION exactly when they exist in REVISION-1. This applies only to the current state of our tree walk. */ svn_revnum_t revision; /* Allocate container entries here. */ apr_pool_t *pool; } path_tracker_t; /* Return a new path tracker object for REVISION, allocated in POOL. */ static path_tracker_t * tracker_create(svn_revnum_t revision, apr_pool_t *pool) { path_tracker_t *result = apr_pcalloc(pool, sizeof(*result)); result->stack = apr_array_make(pool, 16, sizeof(path_tracker_entry_t)); result->revision = revision; result->pool = pool; return result; } /* Remove all entries from TRACKER that are not relevant to PATH anymore. * If ALLOW_EXACT_MATCH is FALSE, keep only entries that pertain to * parent folders but not to PATH itself. * * This internal function implicitly updates the tracker state during the * tree by removing "past" entries. Other functions will add entries when * we encounter a new tree change. */ static void tracker_trim(path_tracker_t *tracker, const char *path, svn_boolean_t allow_exact_match) { /* remove everything that is unrelated to PATH. Note that TRACKER->STACK is depth-ordered, i.e. stack[N] is a (maybe indirect) parent of stack[N+1] for N+1 < DEPTH. */ for (; tracker->depth; --tracker->depth) { path_tracker_entry_t *parent = &APR_ARRAY_IDX(tracker->stack, tracker->depth - 1, path_tracker_entry_t); const char *rel_path = svn_dirent_skip_ancestor(parent->path->data, path); /* always keep parents. Keep exact matches when allowed. */ if (rel_path && (allow_exact_match || *rel_path != '\0')) break; } } /* Using TRACKER, check what path at what revision in the repository must be checked to decide that whether PATH exists. Return the info in *ORIG_PATH and *ORIG_REV, respectively. If the path is known to not exist, *ORIG_PATH will be NULL and *ORIG_REV will be SVN_INVALID_REVNUM. If *ORIG_REV is SVN_INVALID_REVNUM, PATH has just been added in the revision currently being tracked. Use POOL for allocations. Note that *ORIG_PATH may be allocated in POOL, a reference to internal data with the same lifetime as TRACKER or just PATH. */ static void tracker_lookup(const char **orig_path, svn_revnum_t *orig_rev, path_tracker_t *tracker, const char *path, apr_pool_t *pool) { tracker_trim(tracker, path, TRUE); if (tracker->depth == 0) { /* no tree changes -> paths are the same as in the previous rev. */ *orig_path = path; *orig_rev = tracker->revision - 1; } else { path_tracker_entry_t *parent = &APR_ARRAY_IDX(tracker->stack, tracker->depth - 1, path_tracker_entry_t); if (parent->exists) { const char *rel_path = svn_dirent_skip_ancestor(parent->path->data, path); if (parent->copyfrom_rev != SVN_INVALID_REVNUM) { /* parent is a copy with history. Translate path. */ *orig_path = svn_dirent_join(parent->copyfrom_path->data, rel_path, pool); *orig_rev = parent->copyfrom_rev; } else if (*rel_path == '\0') { /* added in this revision with no history */ *orig_path = path; *orig_rev = tracker->revision; } else { /* parent got added but not this path */ *orig_path = NULL; *orig_rev = SVN_INVALID_REVNUM; } } else { /* (maybe parent) path has been deleted */ *orig_path = NULL; *orig_rev = SVN_INVALID_REVNUM; } } } /* Return a reference to the stack entry in TRACKER for PATH. If no suitable entry exists, add one. Implicitly updates the tracked tree location. Only the PATH member of the result is being updated. All other members will have undefined values. */ static path_tracker_entry_t * tracker_add_entry(path_tracker_t *tracker, const char *path) { path_tracker_entry_t *entry; tracker_trim(tracker, path, FALSE); if (tracker->depth == tracker->stack->nelts) { entry = apr_array_push(tracker->stack); entry->path = svn_stringbuf_create_empty(tracker->pool); entry->copyfrom_path = svn_stringbuf_create_empty(tracker->pool); } else { entry = &APR_ARRAY_IDX(tracker->stack, tracker->depth, path_tracker_entry_t); } svn_stringbuf_set(entry->path, path); ++tracker->depth; return entry; } /* Update the TRACKER with a copy from COPYFROM_PATH@COPYFROM_REV to PATH in the tracked revision. */ static void tracker_path_copy(path_tracker_t *tracker, const char *path, const char *copyfrom_path, svn_revnum_t copyfrom_rev) { path_tracker_entry_t *entry = tracker_add_entry(tracker, path); svn_stringbuf_set(entry->copyfrom_path, copyfrom_path); entry->copyfrom_rev = copyfrom_rev; entry->exists = TRUE; } /* Update the TRACKER with a plain addition of PATH (without history). */ static void tracker_path_add(path_tracker_t *tracker, const char *path) { path_tracker_entry_t *entry = tracker_add_entry(tracker, path); svn_stringbuf_setempty(entry->copyfrom_path); entry->copyfrom_rev = SVN_INVALID_REVNUM; entry->exists = TRUE; } /* Update the TRACKER with a replacement of PATH with a plain addition (without history). */ static void tracker_path_replace(path_tracker_t *tracker, const char *path) { /* this will implicitly purge all previous sub-tree info from STACK. Thus, no need to tack the deletion explicitly. */ tracker_path_add(tracker, path); } /* Update the TRACKER with a deletion of PATH. */ static void tracker_path_delete(path_tracker_t *tracker, const char *path) { path_tracker_entry_t *entry = tracker_add_entry(tracker, path); svn_stringbuf_setempty(entry->copyfrom_path); entry->copyfrom_rev = SVN_INVALID_REVNUM; entry->exists = FALSE; } /* Compute the delta between OLDROOT/OLDPATH and NEWROOT/NEWPATH and store it into a new temporary file *TEMPFILE. OLDROOT may be NULL, in which case the delta will be computed against an empty file, as per the svn_fs_get_file_delta_stream docstring. Record the length of the temporary file in *LEN, and rewind the file before returning. */ static svn_error_t * store_delta(apr_file_t **tempfile, svn_filesize_t *len, svn_fs_root_t *oldroot, const char *oldpath, svn_fs_root_t *newroot, const char *newpath, apr_pool_t *pool) { svn_stream_t *temp_stream; apr_off_t offset = 0; svn_txdelta_stream_t *delta_stream; svn_txdelta_window_handler_t wh; void *whb; /* Create a temporary file and open a stream to it. Note that we need the file handle in order to rewind it. */ SVN_ERR(svn_io_open_unique_file3(tempfile, NULL, NULL, svn_io_file_del_on_pool_cleanup, pool, pool)); temp_stream = svn_stream_from_aprfile2(*tempfile, TRUE, pool); /* Compute the delta and send it to the temporary file. */ SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream, oldroot, oldpath, newroot, newpath, pool)); svn_txdelta_to_svndiff3(&wh, &whb, temp_stream, 0, SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, pool); SVN_ERR(svn_txdelta_send_txstream(delta_stream, wh, whb, pool)); /* Get the length of the temporary file and rewind it. */ SVN_ERR(svn_io_file_seek(*tempfile, APR_CUR, &offset, pool)); *len = offset; offset = 0; return svn_io_file_seek(*tempfile, APR_SET, &offset, pool); } /* Send a notification of type #svn_repos_notify_warning, subtype WARNING, with message WARNING_FMT formatted with the remaining variable arguments. Send it by calling NOTIFY_FUNC (if not null) with NOTIFY_BATON. */ __attribute__((format(printf, 5, 6))) static void notify_warning(apr_pool_t *scratch_pool, svn_repos_notify_func_t notify_func, void *notify_baton, svn_repos_notify_warning_t warning, const char *warning_fmt, ...) { va_list va; svn_repos_notify_t *notify; if (notify_func == NULL) return; notify = svn_repos_notify_create(svn_repos_notify_warning, scratch_pool); notify->warning = warning; va_start(va, warning_fmt); notify->warning_str = apr_pvsprintf(scratch_pool, warning_fmt, va); va_end(va); notify_func(notify_baton, notify, scratch_pool); } /*----------------------------------------------------------------------*/ /* Write to STREAM the header in HEADERS named KEY, if present. */ static svn_error_t * write_header(svn_stream_t *stream, apr_hash_t *headers, const char *key, apr_pool_t *scratch_pool) { const char *val = svn_hash_gets(headers, key); if (val) { SVN_ERR(svn_stream_printf(stream, scratch_pool, "%s: %s\n", key, val)); } return SVN_NO_ERROR; } /* Write headers, in arbitrary order. * ### TODO: use a stable order * ### Modifies HEADERS. */ static svn_error_t * write_revision_headers(svn_stream_t *stream, apr_hash_t *headers, apr_pool_t *scratch_pool) { const char **h; apr_hash_index_t *hi; static const char *revision_headers_order[] = { SVN_REPOS_DUMPFILE_REVISION_NUMBER, /* must be first */ NULL }; /* Write some headers in a given order */ for (h = revision_headers_order; *h; h++) { SVN_ERR(write_header(stream, headers, *h, scratch_pool)); svn_hash_sets(headers, *h, NULL); } /* Write any and all remaining headers except Content-length. * ### TODO: use a stable order */ for (hi = apr_hash_first(scratch_pool, headers); hi; hi = apr_hash_next(hi)) { const char *key = apr_hash_this_key(hi); if (strcmp(key, SVN_REPOS_DUMPFILE_CONTENT_LENGTH) != 0) SVN_ERR(write_header(stream, headers, key, scratch_pool)); } /* Content-length must be last */ SVN_ERR(write_header(stream, headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH, scratch_pool)); return SVN_NO_ERROR; } /* A header entry: the element type of the apr_array_header_t which is * the real type of svn_repos__dumpfile_headers_t. */ typedef struct svn_repos__dumpfile_header_entry_t { const char *key, *val; } svn_repos__dumpfile_header_entry_t; svn_repos__dumpfile_headers_t * svn_repos__dumpfile_headers_create(apr_pool_t *pool) { svn_repos__dumpfile_headers_t *headers = apr_array_make(pool, 5, sizeof(svn_repos__dumpfile_header_entry_t)); return headers; } void svn_repos__dumpfile_header_push(svn_repos__dumpfile_headers_t *headers, const char *key, const char *val) { svn_repos__dumpfile_header_entry_t *h = &APR_ARRAY_PUSH(headers, svn_repos__dumpfile_header_entry_t); h->key = apr_pstrdup(headers->pool, key); h->val = apr_pstrdup(headers->pool, val); } void svn_repos__dumpfile_header_pushf(svn_repos__dumpfile_headers_t *headers, const char *key, const char *val_fmt, ...) { va_list ap; svn_repos__dumpfile_header_entry_t *h = &APR_ARRAY_PUSH(headers, svn_repos__dumpfile_header_entry_t); h->key = apr_pstrdup(headers->pool, key); va_start(ap, val_fmt); h->val = apr_pvsprintf(headers->pool, val_fmt, ap); va_end(ap); } svn_error_t * svn_repos__dump_headers(svn_stream_t *stream, svn_repos__dumpfile_headers_t *headers, apr_pool_t *scratch_pool) { int i; for (i = 0; i < headers->nelts; i++) { svn_repos__dumpfile_header_entry_t *h = &APR_ARRAY_IDX(headers, i, svn_repos__dumpfile_header_entry_t); SVN_ERR(svn_stream_printf(stream, scratch_pool, "%s: %s\n", h->key, h->val)); } /* End of headers */ SVN_ERR(svn_stream_puts(stream, "\n")); return SVN_NO_ERROR; } svn_error_t * svn_repos__dump_revision_record(svn_stream_t *dump_stream, svn_revnum_t revision, apr_hash_t *extra_headers, apr_hash_t *revprops, svn_boolean_t props_section_always, apr_pool_t *scratch_pool) { svn_stringbuf_t *propstring = NULL; apr_hash_t *headers; if (extra_headers) headers = apr_hash_copy(scratch_pool, extra_headers); else headers = apr_hash_make(scratch_pool); /* ### someday write a revision-content-checksum */ svn_hash_sets(headers, SVN_REPOS_DUMPFILE_REVISION_NUMBER, apr_psprintf(scratch_pool, "%ld", revision)); if (apr_hash_count(revprops) || props_section_always) { svn_stream_t *propstream; propstring = svn_stringbuf_create_empty(scratch_pool); propstream = svn_stream_from_stringbuf(propstring, scratch_pool); SVN_ERR(svn_hash_write2(revprops, propstream, "PROPS-END", scratch_pool)); SVN_ERR(svn_stream_close(propstream)); svn_hash_sets(headers, SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH, apr_psprintf(scratch_pool, "%" APR_SIZE_T_FMT, propstring->len)); } - /* Write out a regular Content-length header for the benefit of - non-Subversion RFC-822 parsers. */ - svn_hash_sets(headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH, - apr_psprintf(scratch_pool, - "%" APR_SIZE_T_FMT, propstring->len)); + if (propstring) + { + /* Write out a regular Content-length header for the benefit of + non-Subversion RFC-822 parsers. */ + svn_hash_sets(headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH, + apr_psprintf(scratch_pool, + "%" APR_SIZE_T_FMT, propstring->len)); + } + SVN_ERR(write_revision_headers(dump_stream, headers, scratch_pool)); /* End of headers */ SVN_ERR(svn_stream_puts(dump_stream, "\n")); /* Property data. */ if (propstring) { SVN_ERR(svn_stream_write(dump_stream, propstring->data, &propstring->len)); } /* put an end to revision */ SVN_ERR(svn_stream_puts(dump_stream, "\n")); return SVN_NO_ERROR; } svn_error_t * svn_repos__dump_node_record(svn_stream_t *dump_stream, svn_repos__dumpfile_headers_t *headers, svn_stringbuf_t *props_str, svn_boolean_t has_text, svn_filesize_t text_content_length, svn_boolean_t content_length_always, apr_pool_t *scratch_pool) { svn_filesize_t content_length = 0; /* add content-length headers */ if (props_str) { svn_repos__dumpfile_header_pushf( headers, SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH, "%" APR_SIZE_T_FMT, props_str->len); content_length += props_str->len; } if (has_text) { svn_repos__dumpfile_header_pushf( headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH, "%" SVN_FILESIZE_T_FMT, text_content_length); content_length += text_content_length; } if (content_length_always || props_str || has_text) { svn_repos__dumpfile_header_pushf( headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH, "%" SVN_FILESIZE_T_FMT, content_length); } /* write the headers */ SVN_ERR(svn_repos__dump_headers(dump_stream, headers, scratch_pool)); /* write the props */ if (props_str) { SVN_ERR(svn_stream_write(dump_stream, props_str->data, &props_str->len)); } return SVN_NO_ERROR; } /*----------------------------------------------------------------------*/ /** An editor which dumps node-data in 'dumpfile format' to a file. **/ /* Look, mom! No file batons! */ struct edit_baton { /* The relpath which implicitly prepends all full paths coming into this editor. This will almost always be "". */ const char *path; /* The stream to dump to. */ svn_stream_t *stream; /* Send feedback here, if non-NULL */ svn_repos_notify_func_t notify_func; void *notify_baton; /* The fs revision root, so we can read the contents of paths. */ svn_fs_root_t *fs_root; svn_revnum_t current_rev; /* The fs, so we can grab historic information if needed. */ svn_fs_t *fs; /* True if dumped nodes should output deltas instead of full text. */ svn_boolean_t use_deltas; /* True if this "dump" is in fact a verify. */ svn_boolean_t verify; /* True if checking UCS normalization during a verify. */ svn_boolean_t check_normalization; /* The first revision dumped in this dumpstream. */ svn_revnum_t oldest_dumped_rev; /* If not NULL, set to true if any references to revisions older than OLDEST_DUMPED_REV were found in the dumpstream. */ svn_boolean_t *found_old_reference; /* If not NULL, set to true if any mergeinfo was dumped which contains revisions older than OLDEST_DUMPED_REV. */ svn_boolean_t *found_old_mergeinfo; /* Structure allows us to verify the paths currently being dumped. If NULL, validity checks are being skipped. */ path_tracker_t *path_tracker; }; struct dir_baton { struct edit_baton *edit_baton; /* has this directory been written to the output stream? */ svn_boolean_t written_out; /* the repository relpath associated with this directory */ const char *path; /* The comparison repository relpath and revision of this directory. If both of these are valid, use them as a source against which to compare the directory instead of the default comparison source of PATH in the previous revision. */ const char *cmp_path; svn_revnum_t cmp_rev; /* hash of paths that need to be deleted, though some -might- be replaced. maps const char * paths to this dir_baton. (they're full paths, because that's what the editor driver gives us. but really, they're all within this directory.) */ apr_hash_t *deleted_entries; /* A flag indicating that new entries have been added to this directory in this revision. Used to optimize detection of UCS representation collisions; we will only check for that in revisions where new names appear in the directory. */ svn_boolean_t check_name_collision; /* pool to be used for deleting the hash items */ apr_pool_t *pool; }; /* Make a directory baton to represent the directory was path (relative to EDIT_BATON's path) is PATH. CMP_PATH/CMP_REV are the path/revision against which this directory should be compared for changes. If either is omitted (NULL for the path, SVN_INVALID_REVNUM for the rev), just compare this directory PATH against itself in the previous revision. PB is the directory baton of this directory's parent, or NULL if this is the top-level directory of the edit. Perform all allocations in POOL. */ static struct dir_baton * make_dir_baton(const char *path, const char *cmp_path, svn_revnum_t cmp_rev, void *edit_baton, struct dir_baton *pb, apr_pool_t *pool) { struct edit_baton *eb = edit_baton; struct dir_baton *new_db = apr_pcalloc(pool, sizeof(*new_db)); const char *full_path; /* A path relative to nothing? I don't think so. */ SVN_ERR_ASSERT_NO_RETURN(!path || pb); /* Construct the full path of this node. */ if (pb) full_path = svn_relpath_join(eb->path, path, pool); else full_path = apr_pstrdup(pool, eb->path); /* Remove leading slashes from copyfrom paths. */ if (cmp_path) cmp_path = svn_relpath_canonicalize(cmp_path, pool); new_db->edit_baton = eb; new_db->path = full_path; new_db->cmp_path = cmp_path; new_db->cmp_rev = cmp_rev; new_db->written_out = FALSE; new_db->deleted_entries = apr_hash_make(pool); new_db->check_name_collision = FALSE; new_db->pool = pool; return new_db; } 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); /* Return an error when PATH in REVISION does not exist or is of a different kind than EXPECTED_KIND. If the latter is svn_node_unknown, skip that check. Use EB for context information. If REVISION is the current revision, use EB's path tracker to follow renames, deletions, etc. Use SCRATCH_POOL for temporary allocations. No-op if EB's path tracker has not been initialized. */ static svn_error_t * node_must_exist(struct edit_baton *eb, const char *path, svn_revnum_t revision, svn_node_kind_t expected_kind, apr_pool_t *scratch_pool) { svn_node_kind_t kind = svn_node_none; /* in case the caller is trying something stupid ... */ if (eb->path_tracker == NULL) return SVN_NO_ERROR; /* paths pertaining to the revision currently being processed must be translated / checked using our path tracker. */ if (revision == eb->path_tracker->revision) tracker_lookup(&path, &revision, eb->path_tracker, path, scratch_pool); /* determine the node type (default: no such node) */ if (path) SVN_ERR(fetch_kind_func(&kind, eb, path, revision, scratch_pool)); /* check results */ if (kind == svn_node_none) return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL, _("Path '%s' not found in r%ld."), path, revision); if (expected_kind != kind && expected_kind != svn_node_unknown) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Unexpected node kind %d for '%s' at r%ld. " "Expected kind was %d."), kind, path, revision, expected_kind); return SVN_NO_ERROR; } /* Return an error when PATH exists in REVISION. Use EB for context information. If REVISION is the current revision, use EB's path tracker to follow renames, deletions, etc. Use SCRATCH_POOL for temporary allocations. No-op if EB's path tracker has not been initialized. */ static svn_error_t * node_must_not_exist(struct edit_baton *eb, const char *path, svn_revnum_t revision, apr_pool_t *scratch_pool) { svn_node_kind_t kind = svn_node_none; /* in case the caller is trying something stupid ... */ if (eb->path_tracker == NULL) return SVN_NO_ERROR; /* paths pertaining to the revision currently being processed must be translated / checked using our path tracker. */ if (revision == eb->path_tracker->revision) tracker_lookup(&path, &revision, eb->path_tracker, path, scratch_pool); /* determine the node type (default: no such node) */ if (path) SVN_ERR(fetch_kind_func(&kind, eb, path, revision, scratch_pool)); /* check results */ if (kind != svn_node_none) return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL, _("Path '%s' exists in r%ld."), path, revision); return SVN_NO_ERROR; } /* If the mergeinfo in MERGEINFO_STR refers to any revisions older than * OLDEST_DUMPED_REV, issue a warning and set *FOUND_OLD_MERGEINFO to TRUE, * otherwise leave *FOUND_OLD_MERGEINFO unchanged. */ static svn_error_t * verify_mergeinfo_revisions(svn_boolean_t *found_old_mergeinfo, const char *mergeinfo_str, svn_revnum_t oldest_dumped_rev, svn_repos_notify_func_t notify_func, void *notify_baton, apr_pool_t *pool) { svn_mergeinfo_t mergeinfo, old_mergeinfo; SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_str, pool)); SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges( &old_mergeinfo, mergeinfo, oldest_dumped_rev - 1, 0, TRUE, pool, pool)); if (apr_hash_count(old_mergeinfo)) { notify_warning(pool, notify_func, notify_baton, svn_repos_notify_warning_found_old_mergeinfo, _("Mergeinfo referencing revision(s) prior " "to the oldest dumped revision (r%ld). " "Loading this dump may result in invalid " "mergeinfo."), oldest_dumped_rev); if (found_old_mergeinfo) *found_old_mergeinfo = TRUE; } return SVN_NO_ERROR; } /* Unique string pointers used by verify_mergeinfo_normalization() and check_name_collision() */ static const char normalized_unique[] = "normalized_unique"; static const char normalized_collision[] = "normalized_collision"; /* Baton for extract_mergeinfo_paths */ struct extract_mergeinfo_paths_baton { apr_hash_t *result; svn_boolean_t normalize; svn_membuf_t buffer; }; /* Hash iterator that uniquifies all keys into a single hash table, optionally normalizing them first. */ static svn_error_t * extract_mergeinfo_paths(void *baton, const void *key, apr_ssize_t klen, void *val, apr_pool_t *iterpool) { struct extract_mergeinfo_paths_baton *const xb = baton; if (xb->normalize) { const char *normkey; SVN_ERR(svn_utf__normalize(&normkey, key, klen, &xb->buffer)); svn_hash_sets(xb->result, apr_pstrdup(xb->buffer.pool, normkey), normalized_unique); } else apr_hash_set(xb->result, apr_pmemdup(xb->buffer.pool, key, klen + 1), klen, normalized_unique); return SVN_NO_ERROR; } /* Baton for filter_mergeinfo_paths */ struct filter_mergeinfo_paths_baton { apr_hash_t *paths; }; /* Compare two sets of denormalized paths from mergeinfo entries, removing duplicates. */ static svn_error_t * filter_mergeinfo_paths(void *baton, const void *key, apr_ssize_t klen, void *val, apr_pool_t *iterpool) { struct filter_mergeinfo_paths_baton *const fb = baton; if (apr_hash_get(fb->paths, key, klen)) apr_hash_set(fb->paths, key, klen, NULL); return SVN_NO_ERROR; } /* Baton used by the check_mergeinfo_normalization hash iterator. */ struct verify_mergeinfo_normalization_baton { const char* path; apr_hash_t *normalized_paths; svn_membuf_t buffer; svn_repos_notify_func_t notify_func; void *notify_baton; }; /* Hash iterator that verifies normalization and collision of paths in an svn:mergeinfo property. */ static svn_error_t * verify_mergeinfo_normalization(void *baton, const void *key, apr_ssize_t klen, void *val, apr_pool_t *iterpool) { struct verify_mergeinfo_normalization_baton *const vb = baton; const char *const path = key; const char *normpath; const char *found; SVN_ERR(svn_utf__normalize(&normpath, path, klen, &vb->buffer)); found = svn_hash_gets(vb->normalized_paths, normpath); if (!found) svn_hash_sets(vb->normalized_paths, apr_pstrdup(vb->buffer.pool, normpath), normalized_unique); else if (found == normalized_collision) /* Skip already reported collision */; else { /* Report path collision in mergeinfo */ svn_hash_sets(vb->normalized_paths, apr_pstrdup(vb->buffer.pool, normpath), normalized_collision); notify_warning(iterpool, vb->notify_func, vb->notify_baton, svn_repos_notify_warning_mergeinfo_collision, _("Duplicate representation of path '%s'" " in %s property of '%s'"), normpath, SVN_PROP_MERGEINFO, vb->path); } return SVN_NO_ERROR; } /* Check UCS normalization of mergeinfo for PATH. NEW_MERGEINFO is the svn:mergeinfo property value being set; OLD_MERGEINFO is the previous property value, which may be NULL. Only the paths that were added in are checked, including collision checks. This minimizes the number of notifications we generate for a given mergeinfo property. */ static svn_error_t * check_mergeinfo_normalization(const char *path, const char *new_mergeinfo, const char *old_mergeinfo, svn_repos_notify_func_t notify_func, void *notify_baton, apr_pool_t *pool) { svn_mergeinfo_t mergeinfo; apr_hash_t *normalized_paths; apr_hash_t *added_paths; struct extract_mergeinfo_paths_baton extract_baton; struct verify_mergeinfo_normalization_baton verify_baton; SVN_ERR(svn_mergeinfo_parse(&mergeinfo, new_mergeinfo, pool)); extract_baton.result = apr_hash_make(pool); extract_baton.normalize = FALSE; svn_membuf__create(&extract_baton.buffer, 0, pool); SVN_ERR(svn_iter_apr_hash(NULL, mergeinfo, extract_mergeinfo_paths, &extract_baton, pool)); added_paths = extract_baton.result; if (old_mergeinfo) { struct filter_mergeinfo_paths_baton filter_baton; svn_mergeinfo_t oldinfo; extract_baton.result = apr_hash_make(pool); extract_baton.normalize = TRUE; SVN_ERR(svn_mergeinfo_parse(&oldinfo, old_mergeinfo, pool)); SVN_ERR(svn_iter_apr_hash(NULL, oldinfo, extract_mergeinfo_paths, &extract_baton, pool)); normalized_paths = extract_baton.result; filter_baton.paths = added_paths; SVN_ERR(svn_iter_apr_hash(NULL, oldinfo, filter_mergeinfo_paths, &filter_baton, pool)); } else normalized_paths = apr_hash_make(pool); verify_baton.path = path; verify_baton.normalized_paths = normalized_paths; verify_baton.buffer = extract_baton.buffer; verify_baton.notify_func = notify_func; verify_baton.notify_baton = notify_baton; SVN_ERR(svn_iter_apr_hash(NULL, added_paths, verify_mergeinfo_normalization, &verify_baton, pool)); return SVN_NO_ERROR; } /* A special case of dump_node(), for a delete record. * * The only thing special about this version is it only writes one blank * line, not two, after the headers. Why? Historical precedent for the * case where a delete record is used as part of a (delete + add-with-history) * in implementing a replacement. * * Also it doesn't do a path-tracker check. */ static svn_error_t * dump_node_delete(svn_stream_t *stream, const char *node_relpath, apr_pool_t *pool) { svn_repos__dumpfile_headers_t *headers = svn_repos__dumpfile_headers_create(pool); /* Node-path: ... */ svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_PATH, node_relpath); /* Node-action: delete */ svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete"); SVN_ERR(svn_repos__dump_headers(stream, headers, pool)); return SVN_NO_ERROR; } /* This helper is the main "meat" of the editor -- it does all the work of writing a node record. Write out a node record for PATH of type KIND under EB->FS_ROOT. ACTION describes what is happening to the node (see enum svn_node_action). Write record to writable EB->STREAM. If the node was itself copied, IS_COPY is TRUE and the path/revision of the copy source are in CMP_PATH/CMP_REV. If IS_COPY is FALSE, yet CMP_PATH/CMP_REV are valid, this node is part of a copied subtree. */ static svn_error_t * dump_node(struct edit_baton *eb, const char *path, svn_node_kind_t kind, enum svn_node_action action, svn_boolean_t is_copy, const char *cmp_path, svn_revnum_t cmp_rev, apr_pool_t *pool) { svn_stringbuf_t *propstring; apr_size_t len; svn_boolean_t must_dump_text = FALSE, must_dump_props = FALSE; const char *compare_path = path; svn_revnum_t compare_rev = eb->current_rev - 1; svn_fs_root_t *compare_root = NULL; apr_file_t *delta_file = NULL; svn_repos__dumpfile_headers_t *headers = svn_repos__dumpfile_headers_create(pool); svn_filesize_t textlen; /* Maybe validate the path. */ if (eb->verify || eb->notify_func) { svn_error_t *err = svn_fs__path_valid(path, pool); if (err) { if (eb->notify_func) { char errbuf[512]; /* ### svn_strerror() magic number */ notify_warning(pool, eb->notify_func, eb->notify_baton, svn_repos_notify_warning_invalid_fspath, _("E%06d: While validating fspath '%s': %s"), err->apr_err, path, svn_err_best_message(err, errbuf, sizeof(errbuf))); } /* Return the error in addition to notifying about it. */ if (eb->verify) return svn_error_trace(err); else svn_error_clear(err); } } /* Write out metadata headers for this file node. */ svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_PATH, path); if (kind == svn_node_file) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_KIND, "file"); else if (kind == svn_node_dir) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_KIND, "dir"); /* Remove leading slashes from copyfrom paths. */ if (cmp_path) cmp_path = svn_relpath_canonicalize(cmp_path, pool); /* Validate the comparison path/rev. */ if (ARE_VALID_COPY_ARGS(cmp_path, cmp_rev)) { compare_path = cmp_path; compare_rev = cmp_rev; } switch (action) { case svn_node_action_change: if (eb->path_tracker) SVN_ERR_W(node_must_exist(eb, path, eb->current_rev, kind, pool), apr_psprintf(pool, _("Change invalid path '%s' in r%ld"), path, eb->current_rev)); svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "change"); /* either the text or props changed, or possibly both. */ SVN_ERR(svn_fs_revision_root(&compare_root, svn_fs_root_fs(eb->fs_root), compare_rev, pool)); SVN_ERR(svn_fs_props_changed(&must_dump_props, compare_root, compare_path, eb->fs_root, path, pool)); if (kind == svn_node_file) SVN_ERR(svn_fs_contents_changed(&must_dump_text, compare_root, compare_path, eb->fs_root, path, pool)); break; case svn_node_action_delete: if (eb->path_tracker) { SVN_ERR_W(node_must_exist(eb, path, eb->current_rev, kind, pool), apr_psprintf(pool, _("Deleting invalid path '%s' in r%ld"), path, eb->current_rev)); tracker_path_delete(eb->path_tracker, path); } svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete"); /* we can leave this routine quietly now, don't need to dump any content. */ must_dump_text = FALSE; must_dump_props = FALSE; break; case svn_node_action_replace: if (eb->path_tracker) SVN_ERR_W(node_must_exist(eb, path, eb->current_rev, svn_node_unknown, pool), apr_psprintf(pool, _("Replacing non-existent path '%s' in r%ld"), path, eb->current_rev)); if (! is_copy) { if (eb->path_tracker) tracker_path_replace(eb->path_tracker, path); /* a simple delete+add, implied by a single 'replace' action. */ svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "replace"); /* definitely need to dump all content for a replace. */ if (kind == svn_node_file) must_dump_text = TRUE; must_dump_props = TRUE; break; } else { /* more complex: delete original, then add-with-history. */ /* ### Why not write a 'replace' record? Don't know. */ if (eb->path_tracker) { tracker_path_delete(eb->path_tracker, path); } /* ### Unusually, we end this 'delete' node record with only a single blank line after the header block -- no extra blank line. */ SVN_ERR(dump_node_delete(eb->stream, path, pool)); /* The remaining action is a non-replacing add-with-history */ /* action = svn_node_action_add; */ } /* FALL THROUGH to 'add' */ case svn_node_action_add: if (eb->path_tracker) SVN_ERR_W(node_must_not_exist(eb, path, eb->current_rev, pool), apr_psprintf(pool, _("Adding already existing path '%s' in r%ld"), path, eb->current_rev)); svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "add"); if (! is_copy) { if (eb->path_tracker) tracker_path_add(eb->path_tracker, path); /* Dump all contents for a simple 'add'. */ if (kind == svn_node_file) must_dump_text = TRUE; must_dump_props = TRUE; } else { if (eb->path_tracker) { SVN_ERR_W(node_must_exist(eb, compare_path, compare_rev, kind, pool), apr_psprintf(pool, _("Copying from invalid path to " "'%s' in r%ld"), path, eb->current_rev)); tracker_path_copy(eb->path_tracker, path, compare_path, compare_rev); } if (!eb->verify && cmp_rev < eb->oldest_dumped_rev && eb->notify_func) { notify_warning(pool, eb->notify_func, eb->notify_baton, svn_repos_notify_warning_found_old_reference, _("Referencing data in revision %ld," " which is older than the oldest" " dumped revision (r%ld). Loading this dump" " into an empty repository" " will fail."), cmp_rev, eb->oldest_dumped_rev); if (eb->found_old_reference) *eb->found_old_reference = TRUE; } svn_repos__dumpfile_header_pushf( headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV, "%ld", cmp_rev); svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH, cmp_path); SVN_ERR(svn_fs_revision_root(&compare_root, svn_fs_root_fs(eb->fs_root), compare_rev, pool)); /* Need to decide if the copied node had any extra textual or property mods as well. */ SVN_ERR(svn_fs_props_changed(&must_dump_props, compare_root, compare_path, eb->fs_root, path, pool)); if (kind == svn_node_file) { svn_checksum_t *checksum; const char *hex_digest; SVN_ERR(svn_fs_contents_changed(&must_dump_text, compare_root, compare_path, eb->fs_root, path, pool)); SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, compare_root, compare_path, FALSE, pool)); hex_digest = svn_checksum_to_cstring(checksum, pool); if (hex_digest) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_MD5, hex_digest); SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1, compare_root, compare_path, FALSE, pool)); hex_digest = svn_checksum_to_cstring(checksum, pool); if (hex_digest) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_SHA1, hex_digest); } } break; } if ((! must_dump_text) && (! must_dump_props)) { /* If we're not supposed to dump text or props, so be it, we can just go home. However, if either one needs to be dumped, then our dumpstream format demands that at a *minimum*, we see a lone "PROPS-END" as a divider between text and props content within the content-block. */ SVN_ERR(svn_repos__dump_headers(eb->stream, headers, pool)); len = 1; return svn_stream_write(eb->stream, "\n", &len); /* ### needed? */ } /*** Start prepping content to dump... ***/ /* If we are supposed to dump properties, write out a property length header and generate a stringbuf that contains those property values here. */ if (must_dump_props) { apr_hash_t *prophash, *oldhash = NULL; svn_stream_t *propstream; SVN_ERR(svn_fs_node_proplist(&prophash, eb->fs_root, path, pool)); /* If this is a partial dump, then issue a warning if we dump mergeinfo properties that refer to revisions older than the first revision dumped. */ if (!eb->verify && eb->notify_func && eb->oldest_dumped_rev > 1) { svn_string_t *mergeinfo_str = svn_hash_gets(prophash, SVN_PROP_MERGEINFO); if (mergeinfo_str) { /* An error in verifying the mergeinfo must not prevent dumping the data. Ignore any such error. */ svn_error_clear(verify_mergeinfo_revisions( eb->found_old_mergeinfo, mergeinfo_str->data, eb->oldest_dumped_rev, eb->notify_func, eb->notify_baton, pool)); } } /* If we're checking UCS normalization, also parse any changed mergeinfo and warn about denormalized paths and name collisions there. */ if (eb->verify && eb->check_normalization && eb->notify_func) { /* N.B.: This hash lookup happens only once; the conditions for verifying historic mergeinfo references and checking UCS normalization are mutually exclusive. */ svn_string_t *mergeinfo_str = svn_hash_gets(prophash, SVN_PROP_MERGEINFO); if (mergeinfo_str) { svn_string_t *oldinfo_str = NULL; if (compare_root) { SVN_ERR(svn_fs_node_proplist(&oldhash, compare_root, compare_path, pool)); oldinfo_str = svn_hash_gets(oldhash, SVN_PROP_MERGEINFO); } SVN_ERR(check_mergeinfo_normalization( path, mergeinfo_str->data, (oldinfo_str ? oldinfo_str->data : NULL), eb->notify_func, eb->notify_baton, pool)); } } if (eb->use_deltas && compare_root) { /* Fetch the old property hash to diff against and output a header saying that our property contents are a delta. */ if (!oldhash) /* May have been set for normalization check */ SVN_ERR(svn_fs_node_proplist(&oldhash, compare_root, compare_path, pool)); svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_PROP_DELTA, "true"); } else oldhash = apr_hash_make(pool); propstring = svn_stringbuf_create_ensure(0, pool); propstream = svn_stream_from_stringbuf(propstring, pool); SVN_ERR(svn_hash_write_incremental(prophash, oldhash, propstream, "PROPS-END", pool)); SVN_ERR(svn_stream_close(propstream)); } /* If we are supposed to dump text, write out a text length header here, and an MD5 checksum (if available). */ if (must_dump_text && (kind == svn_node_file)) { svn_checksum_t *checksum; const char *hex_digest; if (eb->use_deltas) { /* Compute the text delta now and write it into a temporary file, so that we can find its length. Output a header saying our text contents are a delta. */ SVN_ERR(store_delta(&delta_file, &textlen, compare_root, compare_path, eb->fs_root, path, pool)); svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_DELTA, "true"); if (compare_root) { SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, compare_root, compare_path, FALSE, pool)); hex_digest = svn_checksum_to_cstring(checksum, pool); if (hex_digest) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5, hex_digest); SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1, compare_root, compare_path, FALSE, pool)); hex_digest = svn_checksum_to_cstring(checksum, pool); if (hex_digest) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1, hex_digest); } } else { /* Just fetch the length of the file. */ SVN_ERR(svn_fs_file_length(&textlen, eb->fs_root, path, pool)); } SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, eb->fs_root, path, FALSE, pool)); hex_digest = svn_checksum_to_cstring(checksum, pool); if (hex_digest) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5, hex_digest); SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1, eb->fs_root, path, FALSE, pool)); hex_digest = svn_checksum_to_cstring(checksum, pool); if (hex_digest) svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_SHA1, hex_digest); } /* 'Content-length:' is the last header before we dump the content, and is the sum of the text and prop contents lengths. We write this only for the benefit of non-Subversion RFC-822 parsers. */ SVN_ERR(svn_repos__dump_node_record(eb->stream, headers, must_dump_props ? propstring : NULL, must_dump_text, must_dump_text ? textlen : 0, TRUE /*content_length_always*/, pool)); /* Dump text content */ if (must_dump_text && (kind == svn_node_file)) { svn_stream_t *contents; if (delta_file) { /* Make sure to close the underlying file when the stream is closed. */ contents = svn_stream_from_aprfile2(delta_file, FALSE, pool); } else SVN_ERR(svn_fs_file_contents(&contents, eb->fs_root, path, pool)); SVN_ERR(svn_stream_copy3(contents, svn_stream_disown(eb->stream, pool), NULL, NULL, pool)); } len = 2; return svn_stream_write(eb->stream, "\n\n", &len); /* ### needed? */ } static svn_error_t * open_root(void *edit_baton, svn_revnum_t base_revision, apr_pool_t *pool, void **root_baton) { *root_baton = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM, edit_baton, NULL, pool); return SVN_NO_ERROR; } 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; const char *mypath = apr_pstrdup(pb->pool, path); /* remember this path needs to be deleted. */ svn_hash_sets(pb->deleted_entries, mypath, pb); return SVN_NO_ERROR; } 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; void *was_deleted; svn_boolean_t is_copy = FALSE; struct dir_baton *new_db = make_dir_baton(path, copyfrom_path, copyfrom_rev, eb, pb, pool); /* This might be a replacement -- is the path already deleted? */ was_deleted = svn_hash_gets(pb->deleted_entries, path); /* Detect an add-with-history. */ is_copy = ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev); /* Dump the node. */ SVN_ERR(dump_node(eb, path, svn_node_dir, was_deleted ? svn_node_action_replace : svn_node_action_add, is_copy, is_copy ? copyfrom_path : NULL, is_copy ? copyfrom_rev : SVN_INVALID_REVNUM, pool)); if (was_deleted) /* Delete the path, it's now been dumped. */ svn_hash_sets(pb->deleted_entries, path, NULL); /* Check for normalized name clashes, but only if this is actually a new name in the parent, not a replacement. */ if (!was_deleted && eb->verify && eb->check_normalization && eb->notify_func) { pb->check_name_collision = TRUE; } new_db->written_out = TRUE; *child_baton = new_db; return SVN_NO_ERROR; } 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 *pb = parent_baton; struct edit_baton *eb = pb->edit_baton; struct dir_baton *new_db; const char *cmp_path = NULL; svn_revnum_t cmp_rev = SVN_INVALID_REVNUM; /* If the parent directory has explicit comparison path and rev, record the same for this one. */ if (ARE_VALID_COPY_ARGS(pb->cmp_path, pb->cmp_rev)) { cmp_path = svn_relpath_join(pb->cmp_path, svn_relpath_basename(path, pool), pool); cmp_rev = pb->cmp_rev; } new_db = make_dir_baton(path, cmp_path, cmp_rev, eb, pb, pool); *child_baton = new_db; return SVN_NO_ERROR; } 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; apr_pool_t *subpool = svn_pool_create(pool); int i; apr_array_header_t *sorted_entries; /* Sort entries lexically instead of as paths. Even though the entries * are full paths they're all in the same directory (see comment in struct * dir_baton definition). So we really want to sort by basename, in which * case the lexical sort function is more efficient. */ sorted_entries = svn_sort__hash(db->deleted_entries, svn_sort_compare_items_lexically, pool); for (i = 0; i < sorted_entries->nelts; i++) { const char *path = APR_ARRAY_IDX(sorted_entries, i, svn_sort__item_t).key; svn_pool_clear(subpool); /* By sending 'svn_node_unknown', the Node-kind: header simply won't be written out. No big deal at all, really. The loader shouldn't care. */ SVN_ERR(dump_node(eb, path, svn_node_unknown, svn_node_action_delete, FALSE, NULL, SVN_INVALID_REVNUM, subpool)); } svn_pool_destroy(subpool); return SVN_NO_ERROR; } 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; void *was_deleted; svn_boolean_t is_copy = FALSE; /* This might be a replacement -- is the path already deleted? */ was_deleted = svn_hash_gets(pb->deleted_entries, path); /* Detect add-with-history. */ is_copy = ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev); /* Dump the node. */ SVN_ERR(dump_node(eb, path, svn_node_file, was_deleted ? svn_node_action_replace : svn_node_action_add, is_copy, is_copy ? copyfrom_path : NULL, is_copy ? copyfrom_rev : SVN_INVALID_REVNUM, pool)); if (was_deleted) /* delete the path, it's now been dumped. */ svn_hash_sets(pb->deleted_entries, path, NULL); /* Check for normalized name clashes, but only if this is actually a new name in the parent, not a replacement. */ if (!was_deleted && eb->verify && eb->check_normalization && eb->notify_func) { pb->check_name_collision = TRUE; } *file_baton = NULL; /* muhahahaha */ return SVN_NO_ERROR; } static svn_error_t * open_file(const char *path, void *parent_baton, svn_revnum_t ancestor_revision, apr_pool_t *pool, void **file_baton) { struct dir_baton *pb = parent_baton; struct edit_baton *eb = pb->edit_baton; const char *cmp_path = NULL; svn_revnum_t cmp_rev = SVN_INVALID_REVNUM; /* If the parent directory has explicit comparison path and rev, record the same for this one. */ if (ARE_VALID_COPY_ARGS(pb->cmp_path, pb->cmp_rev)) { cmp_path = svn_relpath_join(pb->cmp_path, svn_relpath_basename(path, pool), pool); cmp_rev = pb->cmp_rev; } SVN_ERR(dump_node(eb, path, svn_node_file, svn_node_action_change, FALSE, cmp_path, cmp_rev, pool)); *file_baton = NULL; /* muhahahaha again */ return SVN_NO_ERROR; } static svn_error_t * change_dir_prop(void *parent_baton, const char *name, const svn_string_t *value, apr_pool_t *pool) { struct dir_baton *db = parent_baton; struct edit_baton *eb = db->edit_baton; /* This function is what distinguishes between a directory that is opened to merely get somewhere, vs. one that is opened because it *actually* changed by itself. Instead of recording the prop changes here, we just use this method to trigger writing the node; dump_node() finds all the changes. */ if (! db->written_out) { SVN_ERR(dump_node(eb, db->path, svn_node_dir, svn_node_action_change, /* ### We pass is_copy=FALSE; this might be wrong but the parameter isn't used when action=change. */ FALSE, db->cmp_path, db->cmp_rev, pool)); db->written_out = TRUE; } 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) { struct edit_baton *eb = baton; svn_error_t *err; svn_fs_root_t *fs_root; if (!SVN_IS_VALID_REVNUM(base_revision)) base_revision = eb->current_rev - 1; SVN_ERR(svn_fs_revision_root(&fs_root, eb->fs, 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) { struct edit_baton *eb = baton; svn_fs_root_t *fs_root; if (!SVN_IS_VALID_REVNUM(base_revision)) base_revision = eb->current_rev - 1; SVN_ERR(svn_fs_revision_root(&fs_root, eb->fs, 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) { struct edit_baton *eb = baton; svn_stream_t *contents; svn_stream_t *file_stream; const char *tmp_filename; svn_error_t *err; svn_fs_root_t *fs_root; if (!SVN_IS_VALID_REVNUM(base_revision)) base_revision = eb->current_rev - 1; SVN_ERR(svn_fs_revision_root(&fs_root, eb->fs, 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; } static svn_error_t * get_dump_editor(const svn_delta_editor_t **editor, void **edit_baton, svn_fs_t *fs, svn_revnum_t to_rev, const char *root_path, svn_stream_t *stream, svn_boolean_t *found_old_reference, svn_boolean_t *found_old_mergeinfo, svn_error_t *(*custom_close_directory)(void *dir_baton, apr_pool_t *scratch_pool), svn_repos_notify_func_t notify_func, void *notify_baton, svn_revnum_t oldest_dumped_rev, svn_boolean_t use_deltas, svn_boolean_t verify, svn_boolean_t check_normalization, apr_pool_t *pool) { /* Allocate an edit baton to be stored in every directory baton. Set it up for the directory baton we create here, which is the root baton. */ struct edit_baton *eb = apr_pcalloc(pool, sizeof(*eb)); svn_delta_editor_t *dump_editor = svn_delta_default_editor(pool); svn_delta_shim_callbacks_t *shim_callbacks = svn_delta_shim_callbacks_default(pool); /* Set up the edit baton. */ eb->stream = stream; eb->notify_func = notify_func; eb->notify_baton = notify_baton; eb->oldest_dumped_rev = oldest_dumped_rev; eb->path = apr_pstrdup(pool, root_path); SVN_ERR(svn_fs_revision_root(&(eb->fs_root), fs, to_rev, pool)); eb->fs = fs; eb->current_rev = to_rev; eb->use_deltas = use_deltas; eb->verify = verify; eb->check_normalization = check_normalization; eb->found_old_reference = found_old_reference; eb->found_old_mergeinfo = found_old_mergeinfo; /* In non-verification mode, we will allow anything to be dumped because it might be an incremental dump with possible manual intervention. Also, this might be the last resort when it comes to data recovery. Else, make sure that all paths exists at their respective revisions. */ eb->path_tracker = verify ? tracker_create(to_rev, pool) : NULL; /* Set up the editor. */ dump_editor->open_root = open_root; dump_editor->delete_entry = delete_entry; dump_editor->add_directory = add_directory; dump_editor->open_directory = open_directory; if (custom_close_directory) dump_editor->close_directory = custom_close_directory; else dump_editor->close_directory = close_directory; dump_editor->change_dir_prop = change_dir_prop; dump_editor->add_file = add_file; dump_editor->open_file = open_file; *edit_baton = eb; *editor = dump_editor; shim_callbacks->fetch_kind_func = fetch_kind_func; shim_callbacks->fetch_props_func = fetch_props_func; shim_callbacks->fetch_base_func = fetch_base_func; shim_callbacks->fetch_baton = eb; SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton, NULL, NULL, shim_callbacks, pool, pool)); return SVN_NO_ERROR; } /*----------------------------------------------------------------------*/ /** The main dumping routine, svn_repos_dump_fs. **/ /* Helper for svn_repos_dump_fs. Write a revision record of REV in FS to writable STREAM, using POOL. */ static svn_error_t * write_revision_record(svn_stream_t *stream, svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool) { apr_hash_t *props; apr_time_t timetemp; svn_string_t *datevalue; SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, pool)); /* Run revision date properties through the time conversion to canonicalize them. */ /* ### Remove this when it is no longer needed for sure. */ datevalue = svn_hash_gets(props, SVN_PROP_REVISION_DATE); if (datevalue) { SVN_ERR(svn_time_from_cstring(&timetemp, datevalue->data, pool)); datevalue = svn_string_create(svn_time_to_cstring(timetemp, pool), pool); svn_hash_sets(props, SVN_PROP_REVISION_DATE, datevalue); } SVN_ERR(svn_repos__dump_revision_record(stream, rev, NULL, props, TRUE /*props_section_always*/, pool)); return SVN_NO_ERROR; } /* The main dumper. */ svn_error_t * svn_repos_dump_fs3(svn_repos_t *repos, svn_stream_t *stream, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_boolean_t incremental, svn_boolean_t use_deltas, svn_repos_notify_func_t notify_func, void *notify_baton, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) { const svn_delta_editor_t *dump_editor; void *dump_edit_baton = NULL; svn_revnum_t rev; svn_fs_t *fs = svn_repos_fs(repos); apr_pool_t *subpool = svn_pool_create(pool); svn_revnum_t youngest; const char *uuid; int version; svn_boolean_t found_old_reference = FALSE; svn_boolean_t found_old_mergeinfo = FALSE; svn_repos_notify_t *notify; /* Determine the current youngest revision of the filesystem. */ SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); /* Use default vals if necessary. */ if (! SVN_IS_VALID_REVNUM(start_rev)) start_rev = 0; if (! SVN_IS_VALID_REVNUM(end_rev)) end_rev = youngest; if (! stream) stream = svn_stream_empty(pool); /* Validate the revisions. */ if (start_rev > end_rev) return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL, _("Start revision %ld" " is greater than end revision %ld"), start_rev, end_rev); if (end_rev > youngest) return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL, _("End revision %ld is invalid " "(youngest revision is %ld)"), end_rev, youngest); /* Write out the UUID. */ SVN_ERR(svn_fs_get_uuid(fs, &uuid, pool)); /* If we're not using deltas, use the previous version, for compatibility with svn 1.0.x. */ version = SVN_REPOS_DUMPFILE_FORMAT_VERSION; if (!use_deltas) version--; /* Write out "general" metadata for the dumpfile. In this case, a magic header followed by a dumpfile format version. */ SVN_ERR(svn_stream_printf(stream, pool, SVN_REPOS_DUMPFILE_MAGIC_HEADER ": %d\n\n", version)); SVN_ERR(svn_stream_printf(stream, pool, SVN_REPOS_DUMPFILE_UUID ": %s\n\n", uuid)); /* Create a notify object that we can reuse in the loop. */ if (notify_func) notify = svn_repos_notify_create(svn_repos_notify_dump_rev_end, pool); /* Main loop: we're going to dump revision REV. */ for (rev = start_rev; rev <= end_rev; rev++) { svn_fs_root_t *to_root; svn_boolean_t use_deltas_for_rev; svn_pool_clear(subpool); /* Check for cancellation. */ if (cancel_func) SVN_ERR(cancel_func(cancel_baton)); /* Write the revision record. */ SVN_ERR(write_revision_record(stream, fs, rev, subpool)); /* When dumping revision 0, we just write out the revision record. The parser might want to use its properties. */ if (rev == 0) goto loop_end; /* Fetch the editor which dumps nodes to a file. Regardless of what we've been told, don't use deltas for the first rev of a non-incremental dump. */ use_deltas_for_rev = use_deltas && (incremental || rev != start_rev); SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton, fs, rev, "", stream, &found_old_reference, &found_old_mergeinfo, NULL, notify_func, notify_baton, start_rev, use_deltas_for_rev, FALSE, FALSE, subpool)); /* Drive the editor in one way or another. */ SVN_ERR(svn_fs_revision_root(&to_root, fs, rev, subpool)); /* If this is the first revision of a non-incremental dump, we're in for a full tree dump. Otherwise, we want to simply replay the revision. */ if ((rev == start_rev) && (! incremental)) { /* Compare against revision 0, so everything appears to be added. */ svn_fs_root_t *from_root; SVN_ERR(svn_fs_revision_root(&from_root, fs, 0, subpool)); SVN_ERR(svn_repos_dir_delta2(from_root, "", "", to_root, "", dump_editor, dump_edit_baton, NULL, NULL, FALSE, /* don't send text-deltas */ svn_depth_infinity, FALSE, /* don't send entry props */ FALSE, /* don't ignore ancestry */ subpool)); } else { /* The normal case: compare consecutive revs. */ SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE, dump_editor, dump_edit_baton, NULL, NULL, subpool)); /* While our editor close_edit implementation is a no-op, we still do this for completeness. */ SVN_ERR(dump_editor->close_edit(dump_edit_baton, subpool)); } loop_end: if (notify_func) { notify->revision = rev; notify_func(notify_baton, notify, subpool); } } if (notify_func) { /* Did we issue any warnings about references to revisions older than the oldest dumped revision? If so, then issue a final generic warning, since the inline warnings already issued might easily be missed. */ notify = svn_repos_notify_create(svn_repos_notify_dump_end, subpool); notify_func(notify_baton, notify, subpool); if (found_old_reference) { notify_warning(subpool, notify_func, notify_baton, svn_repos_notify_warning_found_old_reference, _("The range of revisions dumped " "contained references to " "copy sources outside that " "range.")); } /* Ditto if we issued any warnings about old revisions referenced in dumped mergeinfo. */ if (found_old_mergeinfo) { notify_warning(subpool, notify_func, notify_baton, svn_repos_notify_warning_found_old_mergeinfo, _("The range of revisions dumped " "contained mergeinfo " "which reference revisions outside " "that range.")); } } svn_pool_destroy(subpool); return SVN_NO_ERROR; } /*----------------------------------------------------------------------*/ /* verify, based on dump */ /* Creating a new revision that changes /A/B/E/bravo means creating new directory listings for /, /A, /A/B, and /A/B/E in the new revision, with each entry not changed in the new revision a link back to the entry in a previous revision. svn_repos_replay()ing a revision does not verify that those links are correct. For paths actually changed in the revision we verify, we get directory contents or file length twice: once in the dump editor, and once here. We could create a new verify baton, store in it the changed paths, and skip those here, but that means building an entire wrapper editor and managing two levels of batons. The impact from checking these entries twice should be minimal, while the code to avoid it is not. */ static svn_error_t * verify_directory_entry(void *baton, const void *key, apr_ssize_t klen, void *val, apr_pool_t *pool) { struct dir_baton *db = baton; svn_fs_dirent_t *dirent = (svn_fs_dirent_t *)val; char *path; svn_boolean_t right_kind; path = svn_relpath_join(db->path, (const char *)key, pool); /* since we can't access the directory entries directly by their ID, we need to navigate from the FS_ROOT to them (relatively expensive because we may start at a never rev than the last change to node). We check that the node kind stored in the noderev matches the dir entry. This also ensures that all entries point to valid noderevs. */ switch (dirent->kind) { case svn_node_dir: SVN_ERR(svn_fs_is_dir(&right_kind, db->edit_baton->fs_root, path, pool)); if (!right_kind) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Node '%s' is not a directory."), path); break; case svn_node_file: SVN_ERR(svn_fs_is_file(&right_kind, db->edit_baton->fs_root, path, pool)); if (!right_kind) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Node '%s' is not a file."), path); break; default: return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Unexpected node kind %d for '%s'"), dirent->kind, path); } return SVN_NO_ERROR; } /* Baton used by the check_name_collision hash iterator. */ struct check_name_collision_baton { struct dir_baton *dir_baton; apr_hash_t *normalized; svn_membuf_t buffer; }; /* Scan the directory and report all entry names that differ only in Unicode character representation. */ static svn_error_t * check_name_collision(void *baton, const void *key, apr_ssize_t klen, void *val, apr_pool_t *iterpool) { struct check_name_collision_baton *const cb = baton; const char *name; const char *found; SVN_ERR(svn_utf__normalize(&name, key, klen, &cb->buffer)); found = svn_hash_gets(cb->normalized, name); if (!found) svn_hash_sets(cb->normalized, apr_pstrdup(cb->buffer.pool, name), normalized_unique); else if (found == normalized_collision) /* Skip already reported collision */; else { struct dir_baton *const db = cb->dir_baton; struct edit_baton *const eb = db->edit_baton; const char* normpath; svn_hash_sets(cb->normalized, apr_pstrdup(cb->buffer.pool, name), normalized_collision); SVN_ERR(svn_utf__normalize( &normpath, svn_relpath_join(db->path, name, iterpool), SVN_UTF__UNKNOWN_LENGTH, &cb->buffer)); notify_warning(iterpool, eb->notify_func, eb->notify_baton, svn_repos_notify_warning_name_collision, _("Duplicate representation of path '%s'"), normpath); } return SVN_NO_ERROR; } static svn_error_t * verify_close_directory(void *dir_baton, apr_pool_t *pool) { struct dir_baton *db = dir_baton; apr_hash_t *dirents; SVN_ERR(svn_fs_dir_entries(&dirents, db->edit_baton->fs_root, db->path, pool)); SVN_ERR(svn_iter_apr_hash(NULL, dirents, verify_directory_entry, dir_baton, pool)); if (db->check_name_collision) { struct check_name_collision_baton check_baton; check_baton.dir_baton = db; check_baton.normalized = apr_hash_make(pool); svn_membuf__create(&check_baton.buffer, 0, pool); SVN_ERR(svn_iter_apr_hash(NULL, dirents, check_name_collision, &check_baton, pool)); } return close_directory(dir_baton, pool); } /* Verify revision REV in file system FS. */ static svn_error_t * verify_one_revision(svn_fs_t *fs, svn_revnum_t rev, svn_repos_notify_func_t notify_func, void *notify_baton, svn_revnum_t start_rev, svn_boolean_t check_normalization, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *scratch_pool) { const svn_delta_editor_t *dump_editor; void *dump_edit_baton; svn_fs_root_t *to_root; apr_hash_t *props; const svn_delta_editor_t *cancel_editor; void *cancel_edit_baton; /* Get cancellable dump editor, but with our close_directory handler.*/ SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton, fs, rev, "", svn_stream_empty(scratch_pool), NULL, NULL, verify_close_directory, notify_func, notify_baton, start_rev, FALSE, TRUE, /* use_deltas, verify */ check_normalization, scratch_pool)); SVN_ERR(svn_delta_get_cancellation_editor(cancel_func, cancel_baton, dump_editor, dump_edit_baton, &cancel_editor, &cancel_edit_baton, scratch_pool)); SVN_ERR(svn_fs_revision_root(&to_root, fs, rev, scratch_pool)); SVN_ERR(svn_fs_verify_root(to_root, scratch_pool)); SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE, cancel_editor, cancel_edit_baton, NULL, NULL, scratch_pool)); /* While our editor close_edit implementation is a no-op, we still do this for completeness. */ SVN_ERR(cancel_editor->close_edit(cancel_edit_baton, scratch_pool)); SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, scratch_pool)); return SVN_NO_ERROR; } /* Baton type used for forwarding notifications from FS API to REPOS API. */ struct verify_fs_notify_func_baton_t { /* notification function to call (must not be NULL) */ svn_repos_notify_func_t notify_func; /* baton to use for it */ void *notify_baton; /* type of notification to send (we will simply plug in the revision) */ svn_repos_notify_t *notify; }; /* Forward the notification to BATON. */ static void verify_fs_notify_func(svn_revnum_t revision, void *baton, apr_pool_t *pool) { struct verify_fs_notify_func_baton_t *notify_baton = baton; notify_baton->notify->revision = revision; notify_baton->notify_func(notify_baton->notify_baton, notify_baton->notify, pool); } static svn_error_t * report_error(svn_revnum_t revision, svn_error_t *verify_err, svn_repos_verify_callback_t verify_callback, void *verify_baton, apr_pool_t *pool) { if (verify_callback) { svn_error_t *cb_err; /* The caller provided us with a callback, so make him responsible for what's going to happen with the error. */ cb_err = verify_callback(verify_baton, revision, verify_err, pool); svn_error_clear(verify_err); SVN_ERR(cb_err); return SVN_NO_ERROR; } else { /* No callback -- no second guessing. Just return the error. */ return svn_error_trace(verify_err); } } svn_error_t * svn_repos_verify_fs3(svn_repos_t *repos, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_boolean_t check_normalization, svn_boolean_t metadata_only, svn_repos_notify_func_t notify_func, void *notify_baton, svn_repos_verify_callback_t verify_callback, void *verify_baton, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) { svn_fs_t *fs = svn_repos_fs(repos); svn_revnum_t youngest; svn_revnum_t rev; apr_pool_t *iterpool = svn_pool_create(pool); svn_repos_notify_t *notify; svn_fs_progress_notify_func_t verify_notify = NULL; struct verify_fs_notify_func_baton_t *verify_notify_baton = NULL; svn_error_t *err; /* Determine the current youngest revision of the filesystem. */ SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); /* Use default vals if necessary. */ if (! SVN_IS_VALID_REVNUM(start_rev)) start_rev = 0; if (! SVN_IS_VALID_REVNUM(end_rev)) end_rev = youngest; /* Validate the revisions. */ if (start_rev > end_rev) return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL, _("Start revision %ld" " is greater than end revision %ld"), start_rev, end_rev); if (end_rev > youngest) return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL, _("End revision %ld is invalid " "(youngest revision is %ld)"), end_rev, youngest); /* Create a notify object that we can reuse within the loop and a forwarding structure for notifications from inside svn_fs_verify(). */ if (notify_func) { notify = svn_repos_notify_create(svn_repos_notify_verify_rev_end, pool); verify_notify = verify_fs_notify_func; verify_notify_baton = apr_palloc(pool, sizeof(*verify_notify_baton)); verify_notify_baton->notify_func = notify_func; verify_notify_baton->notify_baton = notify_baton; verify_notify_baton->notify = svn_repos_notify_create(svn_repos_notify_verify_rev_structure, pool); } /* Verify global metadata and backend-specific data first. */ err = svn_fs_verify(svn_fs_path(fs, pool), svn_fs_config(fs, pool), start_rev, end_rev, verify_notify, verify_notify_baton, cancel_func, cancel_baton, pool); if (err && err->apr_err == SVN_ERR_CANCELLED) { return svn_error_trace(err); } else if (err) { SVN_ERR(report_error(SVN_INVALID_REVNUM, err, verify_callback, verify_baton, iterpool)); } if (!metadata_only) for (rev = start_rev; rev <= end_rev; rev++) { svn_pool_clear(iterpool); /* Wrapper function to catch the possible errors. */ err = verify_one_revision(fs, rev, notify_func, notify_baton, start_rev, check_normalization, cancel_func, cancel_baton, iterpool); if (err && err->apr_err == SVN_ERR_CANCELLED) { return svn_error_trace(err); } else if (err) { SVN_ERR(report_error(rev, err, verify_callback, verify_baton, iterpool)); } else if (notify_func) { /* Tell the caller that we're done with this revision. */ notify->revision = rev; notify_func(notify_baton, notify, iterpool); } } /* We're done. */ if (notify_func) { notify = svn_repos_notify_create(svn_repos_notify_verify_end, iterpool); notify_func(notify_baton, notify, iterpool); } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } Index: stable/11/contrib/subversion/subversion/libsvn_subr/config_file.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_subr/config_file.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_subr/config_file.c (revision 322442) @@ -1,1431 +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 #include #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 # include #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 { 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))); 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 || 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:/path/to/config-key" NL "" NL "The REGISTRY: prefix must be in upper case. The 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 "### svnserve -t" NL "### (If the URL includes a username, then the hostname will be" NL "### passed to the tunnel agent as @.) If the" NL "### built-in ssh scheme were not predefined, it could be defined" NL "### as:" NL - "# ssh = $SVN_SSH ssh -q" 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 + "# rsh = rsh --" NL "### Or, if you wanted to specify a full path and arguments:" NL - "# rsh = /path/to/rsh -l myusername" 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/internal_statements.h =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_subr/internal_statements.h (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_subr/internal_statements.h (revision 322442) @@ -1,76 +1,76 @@ -/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_subr/token-map.h. +/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.7/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/io.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_subr/io.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_subr/io.c (revision 322442) @@ -1,5342 +1,5369 @@ /* * io.c: shared file reading, writing, and probing code. * * ==================================================================== * 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 #ifndef WIN32 #include #endif #ifndef APR_STATUS_IS_EPERM #include #ifdef EPERM #define APR_STATUS_IS_EPERM(s) ((s) == EPERM) #else #define APR_STATUS_IS_EPERM(s) (0) #endif #endif #include #include #include #include #include #include #include #include #if APR_HAVE_FCNTL_H #include #endif #include "svn_hash.h" #include "svn_types.h" #include "svn_dirent_uri.h" #include "svn_path.h" #include "svn_string.h" #include "svn_error.h" #include "svn_io.h" #include "svn_pools.h" #include "svn_utf.h" #include "svn_config.h" #include "svn_private_config.h" #include "svn_ctype.h" #include "private/svn_atomic.h" #include "private/svn_io_private.h" #include "private/svn_utf_private.h" #include "private/svn_dep_compat.h" #define SVN_SLEEP_ENV_VAR "SVN_I_LOVE_CORRUPTED_WORKING_COPIES_SO_DISABLE_SLEEP_FOR_TIMESTAMPS" /* Windows is 'aided' by a number of types of applications that follow other applications around and open up files they have changed for various reasons (the most intrusive are virus scanners). So, if one of these other apps has glommed onto our file we may get an 'access denied' error. This retry loop does not completely solve the problem (who knows how long the other app is going to hold onto it for), but goes a long way towards minimizing it. It is not an infinite loop because there might really be an error. Another reason for retrying delete operations on Windows is that they are asynchronous -- the file or directory is not actually deleted until the last handle to it is closed. The retry loop cannot completely solve this problem either, but can help mitigate it. */ #define RETRY_MAX_ATTEMPTS 100 #define RETRY_INITIAL_SLEEP 1000 #define RETRY_MAX_SLEEP 128000 #define RETRY_LOOP(err, expr, retry_test, sleep_test) \ do \ { \ apr_status_t os_err = APR_TO_OS_ERROR(err); \ int sleep_count = RETRY_INITIAL_SLEEP; \ int retries; \ for (retries = 0; \ retries < RETRY_MAX_ATTEMPTS && (retry_test); \ os_err = APR_TO_OS_ERROR(err)) \ { \ if (sleep_test) \ { \ ++retries; \ apr_sleep(sleep_count); \ if (sleep_count < RETRY_MAX_SLEEP) \ sleep_count *= 2; \ } \ (err) = (expr); \ } \ } \ while (0) #if defined(EDEADLK) && APR_HAS_THREADS #define FILE_LOCK_RETRY_LOOP(err, expr) \ RETRY_LOOP(err, \ expr, \ (APR_STATUS_IS_EINTR(err) || os_err == EDEADLK), \ (!APR_STATUS_IS_EINTR(err))) #else #define FILE_LOCK_RETRY_LOOP(err, expr) \ RETRY_LOOP(err, \ expr, \ (APR_STATUS_IS_EINTR(err)), \ 0) #endif #ifndef WIN32_RETRY_LOOP #if defined(WIN32) && !defined(SVN_NO_WIN32_RETRY_LOOP) #define WIN32_RETRY_LOOP(err, expr) \ RETRY_LOOP(err, expr, (os_err == ERROR_ACCESS_DENIED \ || os_err == ERROR_SHARING_VIOLATION \ || os_err == ERROR_DIR_NOT_EMPTY), \ 1) #else #define WIN32_RETRY_LOOP(err, expr) ((void)0) #endif #endif #ifdef WIN32 #if _WIN32_WINNT < 0x600 /* Does the SDK assume Windows Vista+? */ typedef struct _FILE_RENAME_INFO { BOOL ReplaceIfExists; HANDLE RootDirectory; DWORD FileNameLength; WCHAR FileName[1]; } FILE_RENAME_INFO, *PFILE_RENAME_INFO; typedef struct _FILE_DISPOSITION_INFO { BOOL DeleteFile; } FILE_DISPOSITION_INFO, *PFILE_DISPOSITION_INFO; #define FileRenameInfo 3 #define FileDispositionInfo 4 #endif /* WIN32 < Vista */ /* One-time initialization of the late bound Windows API functions. */ static volatile svn_atomic_t win_dynamic_imports_state = 0; /* Pointer to GetFinalPathNameByHandleW function from kernel32.dll. */ typedef DWORD (WINAPI *GETFINALPATHNAMEBYHANDLE)( HANDLE hFile, WCHAR *lpszFilePath, DWORD cchFilePath, DWORD dwFlags); typedef BOOL (WINAPI *SetFileInformationByHandle_t)(HANDLE hFile, int FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize); static GETFINALPATHNAMEBYHANDLE get_final_path_name_by_handle_proc = NULL; static SetFileInformationByHandle_t set_file_information_by_handle_proc = NULL; /* Forward declaration. */ static svn_error_t * io_win_read_link(svn_string_t **dest, const char *path, apr_pool_t *pool); #endif /* Forward declaration */ static apr_status_t dir_is_empty(const char *dir, apr_pool_t *pool); static APR_INLINE svn_error_t * do_io_file_wrapper_cleanup(apr_file_t *file, apr_status_t status, const char *msg, const char *msg_no_name, apr_pool_t *pool); /* Local wrapper of svn_path_cstring_to_utf8() that does no copying on * operating systems where APR always uses utf-8 as native path format */ static svn_error_t * cstring_to_utf8(const char **path_utf8, const char *path_apr, apr_pool_t *pool) { #if defined(WIN32) || defined(DARWIN) *path_utf8 = path_apr; return SVN_NO_ERROR; #else return svn_path_cstring_to_utf8(path_utf8, path_apr, pool); #endif } /* Local wrapper of svn_path_cstring_from_utf8() that does no copying on * operating systems where APR always uses utf-8 as native path format */ static svn_error_t * cstring_from_utf8(const char **path_apr, const char *path_utf8, apr_pool_t *pool) { #if defined(WIN32) || defined(DARWIN) *path_apr = path_utf8; return SVN_NO_ERROR; #else return svn_path_cstring_from_utf8(path_apr, path_utf8, pool); #endif } /* Helper function that allows to convert an APR-level PATH to something * that we can pass the svn_error_wrap_apr. Since we use it in context * of error reporting, having *some* path info may be more useful than * having none. Therefore, we use a best effort approach here. * * This is different from svn_io_file_name_get in that it uses a different * signature style and will never fail. */ static const char * try_utf8_from_internal_style(const char *path, apr_pool_t *pool) { svn_error_t *error; const char *path_utf8; /* Special case. */ if (path == NULL) return "(NULL)"; /* (try to) convert PATH to UTF-8. If that fails, continue with the plain * PATH because it is the best we have. It may actually be UTF-8 already. */ error = cstring_to_utf8(&path_utf8, path, pool); if (error) { /* fallback to best representation we have */ svn_error_clear(error); path_utf8 = path; } /* Toggle (back-)slashes etc. as necessary. */ return svn_dirent_local_style(path_utf8, pool); } /* Set *NAME_P to the UTF-8 representation of directory entry NAME. * NAME is in the internal encoding used by APR; PARENT is in * UTF-8 and in internal (not local) style. * * Use PARENT only for generating an error string if the conversion * fails because NAME could not be represented in UTF-8. In that * case, return a two-level error in which the outer error's message * mentions PARENT, but the inner error's message does not mention * NAME (except possibly in hex) since NAME may not be printable. * Such a compound error at least allows the user to go looking in the * right directory for the problem. * * If there is any other error, just return that error directly. * * If there is any error, the effect on *NAME_P is undefined. * * *NAME_P and NAME may refer to the same storage. */ static svn_error_t * entry_name_to_utf8(const char **name_p, const char *name, const char *parent, apr_pool_t *pool) { #if defined(WIN32) || defined(DARWIN) *name_p = apr_pstrdup(pool, name); return SVN_NO_ERROR; #else svn_error_t *err = svn_path_cstring_to_utf8(name_p, name, pool); if (err && err->apr_err == APR_EINVAL) { return svn_error_createf(err->apr_err, err, _("Error converting entry " "in directory '%s' to UTF-8"), svn_dirent_local_style(parent, pool)); } return err; #endif } static void map_apr_finfo_to_node_kind(svn_node_kind_t *kind, svn_boolean_t *is_special, apr_finfo_t *finfo) { *is_special = FALSE; if (finfo->filetype == APR_REG) *kind = svn_node_file; else if (finfo->filetype == APR_DIR) *kind = svn_node_dir; else if (finfo->filetype == APR_LNK) { *is_special = TRUE; *kind = svn_node_file; } else *kind = svn_node_unknown; } /* Helper for svn_io_check_path() and svn_io_check_resolved_path(); essentially the same semantics as those two, with the obvious interpretation for RESOLVE_SYMLINKS. */ static svn_error_t * io_check_path(const char *path, svn_boolean_t resolve_symlinks, svn_boolean_t *is_special_p, svn_node_kind_t *kind, apr_pool_t *pool) { apr_int32_t flags; apr_finfo_t finfo; apr_status_t apr_err; const char *path_apr; svn_boolean_t is_special = FALSE; if (path[0] == '\0') path = "."; /* Not using svn_io_stat() here because we want to check the apr_err return explicitly. */ SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); flags = resolve_symlinks ? APR_FINFO_MIN : (APR_FINFO_MIN | APR_FINFO_LINK); apr_err = apr_stat(&finfo, path_apr, flags, pool); if (APR_STATUS_IS_ENOENT(apr_err)) *kind = svn_node_none; else if (SVN__APR_STATUS_IS_ENOTDIR(apr_err)) *kind = svn_node_none; else if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't check path '%s'"), svn_dirent_local_style(path, pool)); else map_apr_finfo_to_node_kind(kind, &is_special, &finfo); *is_special_p = is_special; return SVN_NO_ERROR; } /* Wrapper for apr_file_open(), taking an APR-encoded filename. */ static apr_status_t file_open(apr_file_t **f, const char *fname_apr, apr_int32_t flag, apr_fileperms_t perm, svn_boolean_t retry_on_failure, apr_pool_t *pool) { apr_status_t status = apr_file_open(f, fname_apr, flag, perm, pool); if (retry_on_failure) { #ifdef WIN32 if (status == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED)) { if ((flag & (APR_CREATE | APR_EXCL)) == (APR_CREATE | APR_EXCL)) return status; /* Can't create if there is something */ if (flag & (APR_WRITE | APR_CREATE)) { apr_finfo_t finfo; if (!apr_stat(&finfo, fname_apr, SVN__APR_FINFO_READONLY, pool)) { if (finfo.protection & APR_FREADONLY) return status; /* Retrying won't fix this */ } } } #endif WIN32_RETRY_LOOP(status, apr_file_open(f, fname_apr, flag, perm, pool)); } return status; } svn_error_t * svn_io_check_resolved_path(const char *path, svn_node_kind_t *kind, apr_pool_t *pool) { svn_boolean_t ignored; return io_check_path(path, TRUE, &ignored, kind, pool); } svn_error_t * svn_io_check_path(const char *path, svn_node_kind_t *kind, apr_pool_t *pool) { svn_boolean_t ignored; return io_check_path(path, FALSE, &ignored, kind, pool); } svn_error_t * svn_io_check_special_path(const char *path, svn_node_kind_t *kind, svn_boolean_t *is_special, apr_pool_t *pool) { return io_check_path(path, FALSE, is_special, kind, pool); } struct temp_file_cleanup_s { apr_pool_t *pool; /* The (APR-encoded) full path of the file to be removed, or NULL if * nothing to do. */ const char *fname_apr; }; static apr_status_t temp_file_plain_cleanup_handler(void *baton) { struct temp_file_cleanup_s *b = baton; apr_status_t apr_err = APR_SUCCESS; if (b->fname_apr) { apr_err = apr_file_remove(b->fname_apr, b->pool); WIN32_RETRY_LOOP(apr_err, apr_file_remove(b->fname_apr, b->pool)); } return apr_err; } static apr_status_t temp_file_child_cleanup_handler(void *baton) { struct temp_file_cleanup_s *b = baton; apr_pool_cleanup_kill(b->pool, b, temp_file_plain_cleanup_handler); return APR_SUCCESS; } svn_error_t * svn_io_open_uniquely_named(apr_file_t **file, const char **unique_path, const char *dirpath, const char *filename, const char *suffix, svn_io_file_del_t delete_when, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *path; unsigned int i; struct temp_file_cleanup_s *baton = NULL; /* At the beginning, we don't know whether unique_path will need UTF8 conversion */ svn_boolean_t needs_utf8_conversion = TRUE; SVN_ERR_ASSERT(file || unique_path); if (dirpath == NULL) SVN_ERR(svn_io_temp_dir(&dirpath, scratch_pool)); if (filename == NULL) filename = "tempfile"; if (suffix == NULL) suffix = ".tmp"; path = svn_dirent_join(dirpath, filename, scratch_pool); if (delete_when == svn_io_file_del_on_pool_cleanup) { baton = apr_palloc(result_pool, sizeof(*baton)); baton->pool = result_pool; baton->fname_apr = NULL; /* Because cleanups are run LIFO, we need to make sure to register our cleanup before the apr_file_close cleanup: On Windows, you can't remove an open file. */ apr_pool_cleanup_register(result_pool, baton, temp_file_plain_cleanup_handler, temp_file_child_cleanup_handler); } for (i = 1; i <= 99999; i++) { const char *unique_name; const char *unique_name_apr; apr_file_t *try_file; apr_status_t apr_err; apr_int32_t flag = (APR_READ | APR_WRITE | APR_CREATE | APR_EXCL | APR_BUFFERED | APR_BINARY); if (delete_when == svn_io_file_del_on_close) flag |= APR_DELONCLOSE; /* Special case the first attempt -- if we can avoid having a generated numeric portion at all, that's best. So first we try with just the suffix; then future tries add a number before the suffix. (A do-while loop could avoid the repeated conditional, but it's not worth the clarity loss.) If the first attempt fails, the first number will be "2". This is good, since "1" would misleadingly imply that the second attempt was actually the first... and if someone's got conflicts on their conflicts, we probably don't want to add to their confusion :-). */ if (i == 1) unique_name = apr_psprintf(scratch_pool, "%s%s", path, suffix); else unique_name = apr_psprintf(scratch_pool, "%s.%u%s", path, i, suffix); /* Hmmm. Ideally, we would append to a native-encoding buf before starting iteration, then convert back to UTF-8 for return. But I suppose that would make the appending code sensitive to i18n in a way it shouldn't be... Oh well. */ if (needs_utf8_conversion) { SVN_ERR(cstring_from_utf8(&unique_name_apr, unique_name, scratch_pool)); if (i == 1) { /* The variable parts of unique_name will not require UTF8 conversion. Therefore, if UTF8 conversion had no effect on it in the first iteration, it won't require conversion in any future iteration. */ needs_utf8_conversion = strcmp(unique_name_apr, unique_name); } } else unique_name_apr = unique_name; apr_err = file_open(&try_file, unique_name_apr, flag, APR_OS_DEFAULT, FALSE, result_pool); if (APR_STATUS_IS_EEXIST(apr_err)) continue; else if (apr_err) { /* On Win32, CreateFile fails with an "Access Denied" error code, rather than "File Already Exists", if the colliding name belongs to a directory. */ if (APR_STATUS_IS_EACCES(apr_err)) { apr_finfo_t finfo; apr_status_t apr_err_2 = apr_stat(&finfo, unique_name_apr, APR_FINFO_TYPE, scratch_pool); if (!apr_err_2 && finfo.filetype == APR_DIR) continue; #ifdef WIN32 apr_err_2 = APR_TO_OS_ERROR(apr_err); if (apr_err_2 == ERROR_ACCESS_DENIED || apr_err_2 == ERROR_SHARING_VIOLATION) { /* The file is in use by another process or is hidden; create a new name, but don't do this 99999 times in case the folder is not writable */ i += 797; continue; } #endif /* Else fall through and return the original error. */ } if (file) *file = NULL; if (unique_path) *unique_path = NULL; return svn_error_wrap_apr(apr_err, _("Can't open '%s'"), svn_dirent_local_style(unique_name, scratch_pool)); } else { if (delete_when == svn_io_file_del_on_pool_cleanup) baton->fname_apr = apr_pstrdup(result_pool, unique_name_apr); if (file) *file = try_file; else apr_file_close(try_file); if (unique_path) *unique_path = apr_pstrdup(result_pool, unique_name); return SVN_NO_ERROR; } } if (file) *file = NULL; if (unique_path) *unique_path = NULL; return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED, NULL, _("Unable to make name for '%s'"), svn_dirent_local_style(path, scratch_pool)); } svn_error_t * svn_io_create_unique_link(const char **unique_name_p, const char *path, const char *dest, const char *suffix, apr_pool_t *pool) { #ifdef HAVE_SYMLINK unsigned int i; const char *unique_name; const char *unique_name_apr; const char *dest_apr; int rv; SVN_ERR(cstring_from_utf8(&dest_apr, dest, pool)); for (i = 1; i <= 99999; i++) { apr_status_t apr_err; /* Special case the first attempt -- if we can avoid having a generated numeric portion at all, that's best. So first we try with just the suffix; then future tries add a number before the suffix. (A do-while loop could avoid the repeated conditional, but it's not worth the clarity loss.) If the first attempt fails, the first number will be "2". This is good, since "1" would misleadingly imply that the second attempt was actually the first... and if someone's got conflicts on their conflicts, we probably don't want to add to their confusion :-). */ if (i == 1) unique_name = apr_psprintf(pool, "%s%s", path, suffix); else unique_name = apr_psprintf(pool, "%s.%u%s", path, i, suffix); /* Hmmm. Ideally, we would append to a native-encoding buf before starting iteration, then convert back to UTF-8 for return. But I suppose that would make the appending code sensitive to i18n in a way it shouldn't be... Oh well. */ SVN_ERR(cstring_from_utf8(&unique_name_apr, unique_name, pool)); do { rv = symlink(dest_apr, unique_name_apr); } while (rv == -1 && APR_STATUS_IS_EINTR(apr_get_os_error())); apr_err = apr_get_os_error(); if (rv == -1 && APR_STATUS_IS_EEXIST(apr_err)) continue; else if (rv == -1 && apr_err) { /* On Win32, CreateFile fails with an "Access Denied" error code, rather than "File Already Exists", if the colliding name belongs to a directory. */ if (APR_STATUS_IS_EACCES(apr_err)) { apr_finfo_t finfo; apr_status_t apr_err_2 = apr_stat(&finfo, unique_name_apr, APR_FINFO_TYPE, pool); if (!apr_err_2 && (finfo.filetype == APR_DIR)) continue; /* Else ignore apr_err_2; better to fall through and return the original error. */ } *unique_name_p = NULL; return svn_error_wrap_apr(apr_err, _("Can't create symbolic link '%s'"), svn_dirent_local_style(unique_name, pool)); } else { *unique_name_p = unique_name; return SVN_NO_ERROR; } } *unique_name_p = NULL; return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED, NULL, _("Unable to make name for '%s'"), svn_dirent_local_style(path, pool)); #else return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Symbolic links are not supported on this " "platform")); #endif } svn_error_t * svn_io_read_link(svn_string_t **dest, const char *path, apr_pool_t *pool) { #if defined(HAVE_READLINK) svn_string_t dest_apr; const char *path_apr; char buf[1025]; ssize_t rv; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); do { rv = readlink(path_apr, buf, sizeof(buf) - 1); } while (rv == -1 && APR_STATUS_IS_EINTR(apr_get_os_error())); if (rv == -1) return svn_error_wrap_apr(apr_get_os_error(), _("Can't read contents of link")); buf[rv] = '\0'; dest_apr.data = buf; dest_apr.len = rv; /* ### Cast needed, one of these interfaces is wrong */ return svn_utf_string_to_utf8((const svn_string_t **)dest, &dest_apr, pool); #elif defined(WIN32) return io_win_read_link(dest, path, pool); #else return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Symbolic links are not supported on this " "platform")); #endif } svn_error_t * svn_io_copy_link(const char *src, const char *dst, apr_pool_t *pool) { #ifdef HAVE_READLINK svn_string_t *link_dest; const char *dst_tmp; /* Notice what the link is pointing at... */ SVN_ERR(svn_io_read_link(&link_dest, src, pool)); /* Make a tmp-link pointing at the same thing. */ SVN_ERR(svn_io_create_unique_link(&dst_tmp, dst, link_dest->data, ".tmp", pool)); /* Move the tmp-link to link. */ return svn_io_file_rename(dst_tmp, dst, pool); #else return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Symbolic links are not supported on this " "platform")); #endif } /* Temporary directory name cache for svn_io_temp_dir() */ static volatile svn_atomic_t temp_dir_init_state = 0; static const char *temp_dir; /* Helper function to initialize temp dir. Passed to svn_atomic__init_once */ static svn_error_t * init_temp_dir(void *baton, apr_pool_t *scratch_pool) { /* Global pool for the temp path */ apr_pool_t *global_pool = svn_pool_create(NULL); const char *dir; apr_status_t apr_err = apr_temp_dir_get(&dir, scratch_pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't find a temporary directory")); SVN_ERR(cstring_to_utf8(&dir, dir, scratch_pool)); dir = svn_dirent_internal_style(dir, scratch_pool); SVN_ERR(svn_dirent_get_absolute(&temp_dir, dir, global_pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_temp_dir(const char **dir, apr_pool_t *pool) { SVN_ERR(svn_atomic__init_once(&temp_dir_init_state, init_temp_dir, NULL, pool)); *dir = apr_pstrdup(pool, temp_dir); return SVN_NO_ERROR; } /*** Creating, copying and appending files. ***/ /* Transfer the contents of FROM_FILE to TO_FILE, using POOL for temporary * allocations. * * NOTE: We don't use apr_copy_file() for this, since it takes filenames * as parameters. Since we want to copy to a temporary file * and rename for atomicity (see below), this would require an extra * close/open pair, which can be expensive, especially on * remote file systems. */ static apr_status_t copy_contents(apr_file_t *from_file, apr_file_t *to_file, apr_pool_t *pool) { /* Copy bytes till the cows come home. */ while (1) { char buf[SVN__STREAM_CHUNK_SIZE]; apr_size_t bytes_this_time = sizeof(buf); apr_status_t read_err; apr_status_t write_err; /* Read 'em. */ read_err = apr_file_read(from_file, buf, &bytes_this_time); if (read_err && !APR_STATUS_IS_EOF(read_err)) { return read_err; } /* Write 'em. */ write_err = apr_file_write_full(to_file, buf, bytes_this_time, NULL); if (write_err) { return write_err; } if (read_err && APR_STATUS_IS_EOF(read_err)) { /* Return the results of this close: an error, or success. */ return APR_SUCCESS; } } /* NOTREACHED */ } svn_error_t * svn_io_copy_file(const char *src, const char *dst, svn_boolean_t copy_perms, apr_pool_t *pool) { apr_file_t *from_file, *to_file; apr_status_t apr_err; const char *dst_tmp; svn_error_t *err; /* ### NOTE: sometimes src == dst. In this case, because we copy to a ### temporary file, and then rename over the top of the destination, ### the net result is resetting the permissions on src/dst. ### ### Note: specifically, this can happen during a switch when the desired ### permissions for a file change from one branch to another. See ### switch_tests 17. ### ### ... yes, we should avoid copying to the same file, and we should ### make the "reset perms" explicit. The switch *happens* to work ### because of this copy-to-temp-then-rename implementation. If it ### weren't for that, the switch would break. */ #ifdef CHECK_FOR_SAME_FILE if (strcmp(src, dst) == 0) return SVN_NO_ERROR; #endif SVN_ERR(svn_io_file_open(&from_file, src, APR_READ, APR_OS_DEFAULT, pool)); /* For atomicity, we copy to a tmp file and then rename the tmp file over the real destination. */ SVN_ERR(svn_io_open_unique_file3(&to_file, &dst_tmp, svn_dirent_dirname(dst, pool), svn_io_file_del_none, pool, pool)); apr_err = copy_contents(from_file, to_file, pool); if (apr_err) { err = svn_error_wrap_apr(apr_err, _("Can't copy '%s' to '%s'"), svn_dirent_local_style(src, pool), svn_dirent_local_style(dst_tmp, pool)); } else err = NULL; err = svn_error_compose_create(err, svn_io_file_close(from_file, pool)); err = svn_error_compose_create(err, svn_io_file_close(to_file, pool)); if (err) { return svn_error_compose_create( err, svn_io_remove_file2(dst_tmp, TRUE, pool)); } /* If copying perms, set the perms on dst_tmp now, so they will be atomically inherited in the upcoming rename. But note that we had to wait until now to set perms, because if they say read-only, then we'd have failed filling dst_tmp's contents. */ if (copy_perms) SVN_ERR(svn_io_copy_perms(src, dst_tmp, pool)); return svn_error_trace(svn_io_file_rename(dst_tmp, dst, pool)); } #if !defined(WIN32) && !defined(__OS2__) /* Wrapper for apr_file_perms_set(), taking a UTF8-encoded filename. */ static svn_error_t * file_perms_set(const char *fname, apr_fileperms_t perms, apr_pool_t *pool) { const char *fname_apr; apr_status_t status; SVN_ERR(cstring_from_utf8(&fname_apr, fname, pool)); status = apr_file_perms_set(fname_apr, perms); if (status) return svn_error_wrap_apr(status, _("Can't set permissions on '%s'"), fname); else return SVN_NO_ERROR; } /* Set permissions PERMS on the FILE. This is a cheaper variant of the * file_perms_set wrapper() function because no locale-dependent string * conversion is required. POOL will be used for allocations. */ static svn_error_t * file_perms_set2(apr_file_t* file, apr_fileperms_t perms, apr_pool_t *pool) { const char *fname_apr; apr_status_t status; status = apr_file_name_get(&fname_apr, file); if (status) return svn_error_wrap_apr(status, _("Can't get file name")); status = apr_file_perms_set(fname_apr, perms); if (status) return svn_error_wrap_apr(status, _("Can't set permissions on '%s'"), try_utf8_from_internal_style(fname_apr, pool)); else return SVN_NO_ERROR; } #endif /* !WIN32 && !__OS2__ */ svn_error_t * svn_io_copy_perms(const char *src, const char *dst, apr_pool_t *pool) { /* ### On Windows or OS/2, apr_file_perms_set always returns APR_ENOTIMPL, and the path passed to apr_file_perms_set must be encoded in the platform-specific path encoding; not necessary UTF-8. We need a platform-specific implementation to get the permissions right. */ #if !defined(WIN32) && !defined(__OS2__) { apr_finfo_t finfo; svn_node_kind_t kind; svn_boolean_t is_special; svn_error_t *err; /* If DST is a symlink, don't bother copying permissions. */ SVN_ERR(svn_io_check_special_path(dst, &kind, &is_special, pool)); if (is_special) return SVN_NO_ERROR; SVN_ERR(svn_io_stat(&finfo, src, APR_FINFO_PROT, pool)); err = file_perms_set(dst, finfo.protection, pool); if (err) { /* We shouldn't be able to get APR_INCOMPLETE or APR_ENOTIMPL here under normal circumstances, because the perms themselves came from a call to apr_file_info_get(), and we already know this is the non-Win32 case. But if it does happen, it's not an error. */ if (APR_STATUS_IS_INCOMPLETE(err->apr_err) || APR_STATUS_IS_ENOTIMPL(err->apr_err)) svn_error_clear(err); else { return svn_error_quick_wrapf( err, _("Can't set permissions on '%s'"), svn_dirent_local_style(dst, pool)); } } } #endif /* !WIN32 && !__OS2__ */ return SVN_NO_ERROR; } svn_error_t * svn_io_append_file(const char *src, const char *dst, apr_pool_t *pool) { apr_status_t apr_err; const char *src_apr, *dst_apr; SVN_ERR(cstring_from_utf8(&src_apr, src, pool)); SVN_ERR(cstring_from_utf8(&dst_apr, dst, pool)); apr_err = apr_file_append(src_apr, dst_apr, APR_OS_DEFAULT, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't append '%s' to '%s'"), svn_dirent_local_style(src, pool), svn_dirent_local_style(dst, pool)); return SVN_NO_ERROR; } svn_error_t *svn_io_copy_dir_recursively(const char *src, const char *dst_parent, const char *dst_basename, svn_boolean_t copy_perms, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) { svn_node_kind_t kind; apr_status_t status; const char *dst_path; apr_dir_t *this_dir; apr_finfo_t this_entry; apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME; /* Make a subpool for recursion */ apr_pool_t *subpool = svn_pool_create(pool); /* The 'dst_path' is simply dst_parent/dst_basename */ dst_path = svn_dirent_join(dst_parent, dst_basename, pool); /* Sanity checks: SRC and DST_PARENT are directories, and DST_BASENAME doesn't already exist in DST_PARENT. */ SVN_ERR(svn_io_check_path(src, &kind, subpool)); if (kind != svn_node_dir) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Source '%s' is not a directory"), svn_dirent_local_style(src, pool)); SVN_ERR(svn_io_check_path(dst_parent, &kind, subpool)); if (kind != svn_node_dir) return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL, _("Destination '%s' is not a directory"), svn_dirent_local_style(dst_parent, pool)); SVN_ERR(svn_io_check_path(dst_path, &kind, subpool)); if (kind != svn_node_none) return svn_error_createf(SVN_ERR_ENTRY_EXISTS, NULL, _("Destination '%s' already exists"), svn_dirent_local_style(dst_path, pool)); /* Create the new directory. */ /* ### TODO: copy permissions (needs apr_file_attrs_get()) */ SVN_ERR(svn_io_dir_make(dst_path, APR_OS_DEFAULT, pool)); /* Loop over the dirents in SRC. ('.' and '..' are auto-excluded) */ SVN_ERR(svn_io_dir_open(&this_dir, src, subpool)); for (status = apr_dir_read(&this_entry, flags, this_dir); status == APR_SUCCESS; status = apr_dir_read(&this_entry, flags, this_dir)) { if ((this_entry.name[0] == '.') && ((this_entry.name[1] == '\0') || ((this_entry.name[1] == '.') && (this_entry.name[2] == '\0')))) { continue; } else { const char *src_target, *entryname_utf8; if (cancel_func) SVN_ERR(cancel_func(cancel_baton)); SVN_ERR(entry_name_to_utf8(&entryname_utf8, this_entry.name, src, subpool)); src_target = svn_dirent_join(src, entryname_utf8, subpool); if (this_entry.filetype == APR_REG) /* regular file */ { const char *dst_target = svn_dirent_join(dst_path, entryname_utf8, subpool); SVN_ERR(svn_io_copy_file(src_target, dst_target, copy_perms, subpool)); } else if (this_entry.filetype == APR_LNK) /* symlink */ { const char *dst_target = svn_dirent_join(dst_path, entryname_utf8, subpool); SVN_ERR(svn_io_copy_link(src_target, dst_target, subpool)); } else if (this_entry.filetype == APR_DIR) /* recurse */ { /* Prevent infinite recursion by filtering off our newly created destination path. */ if (strcmp(src, dst_parent) == 0 && strcmp(entryname_utf8, dst_basename) == 0) continue; SVN_ERR(svn_io_copy_dir_recursively (src_target, dst_path, entryname_utf8, copy_perms, cancel_func, cancel_baton, subpool)); } /* ### support other APR node types someday?? */ } } if (! (APR_STATUS_IS_ENOENT(status))) return svn_error_wrap_apr(status, _("Can't read directory '%s'"), svn_dirent_local_style(src, pool)); status = apr_dir_close(this_dir); if (status) return svn_error_wrap_apr(status, _("Error closing directory '%s'"), svn_dirent_local_style(src, pool)); /* Free any memory used by recursion */ svn_pool_destroy(subpool); return SVN_NO_ERROR; } svn_error_t * svn_io_make_dir_recursively(const char *path, apr_pool_t *pool) { const char *path_apr; apr_status_t apr_err; if (svn_path_is_empty(path)) /* Empty path (current dir) is assumed to always exist, so we do nothing, per docs. */ return SVN_NO_ERROR; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); apr_err = apr_dir_make_recursive(path_apr, APR_OS_DEFAULT, pool); #ifdef WIN32 /* Don't retry on ERROR_ACCESS_DENIED, as that typically signals a permanent error */ if (apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION)) WIN32_RETRY_LOOP(apr_err, apr_dir_make_recursive(path_apr, APR_OS_DEFAULT, pool)); #endif if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't make directory '%s'"), svn_dirent_local_style(path, pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_file_create_bytes(const char *file, const void *contents, apr_size_t length, apr_pool_t *scratch_pool) { apr_file_t *f; apr_size_t written; svn_error_t *err = SVN_NO_ERROR; SVN_ERR(svn_io_file_open(&f, file, (APR_WRITE | APR_CREATE | APR_EXCL), APR_OS_DEFAULT, scratch_pool)); if (length) err = svn_io_file_write_full(f, contents, length, &written, scratch_pool); err = svn_error_compose_create( err, svn_io_file_close(f, scratch_pool)); if (err) { /* Our caller doesn't know if we left a file or not if we return an error. Better to cleanup after ourselves if we created the file. */ return svn_error_trace( svn_error_compose_create( err, svn_io_remove_file2(file, TRUE, scratch_pool))); } return SVN_NO_ERROR; } svn_error_t * svn_io_file_create(const char *file, const char *contents, apr_pool_t *pool) { return svn_error_trace(svn_io_file_create_bytes(file, contents, contents ? strlen(contents) : 0, pool)); } svn_error_t * svn_io_file_create_empty(const char *file, apr_pool_t *scratch_pool) { return svn_error_trace(svn_io_file_create_bytes(file, NULL, 0, scratch_pool)); } svn_error_t * svn_io_dir_file_copy(const char *src_path, const char *dest_path, const char *file, apr_pool_t *pool) { const char *file_dest_path = svn_dirent_join(dest_path, file, pool); const char *file_src_path = svn_dirent_join(src_path, file, pool); return svn_error_trace( svn_io_copy_file(file_src_path, file_dest_path, TRUE, pool)); } /*** Modtime checking. ***/ svn_error_t * svn_io_file_affected_time(apr_time_t *apr_time, const char *path, apr_pool_t *pool) { apr_finfo_t finfo; SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_MIN | APR_FINFO_LINK, pool)); *apr_time = finfo.mtime; return SVN_NO_ERROR; } svn_error_t * svn_io_set_file_affected_time(apr_time_t apr_time, const char *path, apr_pool_t *pool) { apr_status_t status; const char *native_path; SVN_ERR(cstring_from_utf8(&native_path, path, pool)); status = apr_file_mtime_set(native_path, apr_time, pool); if (status) return svn_error_wrap_apr(status, _("Can't set access time of '%s'"), svn_dirent_local_style(path, pool)); return SVN_NO_ERROR; } void svn_io_sleep_for_timestamps(const char *path, apr_pool_t *pool) { apr_time_t now, then; svn_error_t *err; char *sleep_env_var; sleep_env_var = getenv(SVN_SLEEP_ENV_VAR); if (sleep_env_var && apr_strnatcasecmp(sleep_env_var, "yes") == 0) return; /* Allow skipping for testing */ now = apr_time_now(); /* Calculate 0.02 seconds after the next second wallclock tick. */ then = apr_time_make(apr_time_sec(now) + 1, APR_USEC_PER_SEC / 50); /* Worst case is waiting one second, so we can use that time to determine if we can sleep shorter than that */ if (path) { apr_finfo_t finfo; err = svn_io_stat(&finfo, path, APR_FINFO_MTIME | APR_FINFO_LINK, pool); if (err) { svn_error_clear(err); /* Fall back on original behavior */ } else if (finfo.mtime % APR_USEC_PER_SEC) { /* Very simplistic but safe approach: If the filesystem has < sec mtime we can be reasonably sure that the filesystem has some sub-second resolution. On Windows it is likely to be sub-millisecond; on Linux systems it depends on the filesystem, ext4 is typically 1ms, 4ms or 10ms resolution. ## Perhaps find a better algorithm here. This will fail once in every 1000 cases on a millisecond precision filesystem if the mtime happens to be an exact second. But better to fail once in every thousand cases than every time, like we did before. Note for further research on algorithm: FAT32 has < 1 sec precision on ctime, but 2 sec on mtime. Linux/ext4 with CONFIG_HZ=250 has high resolution apr_time_now and although the filesystem timestamps have similar high precision they are only updated with a coarser 4ms resolution. */ /* 10 milliseconds after now. */ #ifndef SVN_HI_RES_SLEEP_MS #define SVN_HI_RES_SLEEP_MS 10 #endif then = now + apr_time_from_msec(SVN_HI_RES_SLEEP_MS); } /* Remove time taken to do stat() from sleep. */ now = apr_time_now(); } if (now >= then) return; /* Passing negative values may suspend indefinitely (Windows) */ /* (t < 1000 will be round to 0 in apr) */ if (then - now < 1000) apr_sleep(1000); else apr_sleep(then - now); } svn_error_t * svn_io_filesizes_different_p(svn_boolean_t *different_p, const char *file1, const char *file2, apr_pool_t *pool) { apr_finfo_t finfo1; apr_finfo_t finfo2; apr_status_t status; const char *file1_apr, *file2_apr; /* Not using svn_io_stat() because don't want to generate svn_error_t objects for non-error conditions. */ SVN_ERR(cstring_from_utf8(&file1_apr, file1, pool)); SVN_ERR(cstring_from_utf8(&file2_apr, file2, pool)); /* Stat both files */ status = apr_stat(&finfo1, file1_apr, APR_FINFO_MIN, pool); if (status) { /* If we got an error stat'ing a file, it could be because the file was removed... or who knows. Whatever the case, we don't know if the filesizes are definitely different, so assume that they're not. */ *different_p = FALSE; return SVN_NO_ERROR; } status = apr_stat(&finfo2, file2_apr, APR_FINFO_MIN, pool); if (status) { /* See previous comment. */ *different_p = FALSE; return SVN_NO_ERROR; } /* Examine file sizes */ if (finfo1.size == finfo2.size) *different_p = FALSE; else *different_p = TRUE; return SVN_NO_ERROR; } svn_error_t * svn_io_filesizes_three_different_p(svn_boolean_t *different_p12, svn_boolean_t *different_p23, svn_boolean_t *different_p13, const char *file1, const char *file2, const char *file3, apr_pool_t *scratch_pool) { apr_finfo_t finfo1, finfo2, finfo3; apr_status_t status1, status2, status3; const char *file1_apr, *file2_apr, *file3_apr; /* Not using svn_io_stat() because don't want to generate svn_error_t objects for non-error conditions. */ SVN_ERR(cstring_from_utf8(&file1_apr, file1, scratch_pool)); SVN_ERR(cstring_from_utf8(&file2_apr, file2, scratch_pool)); SVN_ERR(cstring_from_utf8(&file3_apr, file3, scratch_pool)); /* Stat all three files */ status1 = apr_stat(&finfo1, file1_apr, APR_FINFO_MIN, scratch_pool); status2 = apr_stat(&finfo2, file2_apr, APR_FINFO_MIN, scratch_pool); status3 = apr_stat(&finfo3, file3_apr, APR_FINFO_MIN, scratch_pool); /* If we got an error stat'ing a file, it could be because the file was removed... or who knows. Whatever the case, we don't know if the filesizes are definitely different, so assume that they're not. */ *different_p12 = !status1 && !status2 && finfo1.size != finfo2.size; *different_p23 = !status2 && !status3 && finfo2.size != finfo3.size; *different_p13 = !status1 && !status3 && finfo1.size != finfo3.size; return SVN_NO_ERROR; } svn_error_t * svn_io_file_checksum2(svn_checksum_t **checksum, const char *file, svn_checksum_kind_t kind, apr_pool_t *pool) { svn_stream_t *file_stream; svn_stream_t *checksum_stream; apr_file_t* f; SVN_ERR(svn_io_file_open(&f, file, APR_READ, APR_OS_DEFAULT, pool)); file_stream = svn_stream_from_aprfile2(f, FALSE, pool); checksum_stream = svn_stream_checksummed2(file_stream, checksum, NULL, kind, TRUE, pool); /* Because the checksummed stream will force the reading (and checksumming) of all the file's bytes, we can just close the stream and let its magic work. */ return svn_stream_close(checksum_stream); } svn_error_t * svn_io_file_checksum(unsigned char digest[], const char *file, apr_pool_t *pool) { svn_checksum_t *checksum; SVN_ERR(svn_io_file_checksum2(&checksum, file, svn_checksum_md5, pool)); memcpy(digest, checksum->digest, APR_MD5_DIGESTSIZE); return SVN_NO_ERROR; } /*** Permissions and modes. ***/ #if !defined(WIN32) && !defined(__OS2__) /* Given the file specified by PATH, attempt to create an identical version of it owned by the current user. This is done by moving it to a temporary location, copying the file back to its old path, then deleting the temporarily moved version. All temporary allocations are done in POOL. */ static svn_error_t * reown_file(const char *path, apr_pool_t *pool) { const char *unique_name; SVN_ERR(svn_io_open_unique_file3(NULL, &unique_name, svn_dirent_dirname(path, pool), svn_io_file_del_none, pool, pool)); SVN_ERR(svn_io_file_rename(path, unique_name, pool)); SVN_ERR(svn_io_copy_file(unique_name, path, TRUE, pool)); return svn_error_trace(svn_io_remove_file2(unique_name, FALSE, pool)); } /* Determine what the PERMS for a new file should be by looking at the permissions of a temporary file that we create. Unfortunately, umask() as defined in POSIX provides no thread-safe way to get at the current value of the umask, so what we're doing here is the only way we have to determine which combination of write bits (User/Group/World) should be set by default. Make temporary allocations in SCRATCH_POOL. */ static svn_error_t * get_default_file_perms(apr_fileperms_t *perms, apr_pool_t *scratch_pool) { /* the default permissions as read from the temp folder */ static apr_fileperms_t default_perms = 0; /* Technically, this "racy": Multiple threads may use enter here and try to figure out the default permission concurrently. That's fine since they will end up with the same results. Even more technical, apr_fileperms_t is an atomic type on 32+ bit machines. */ if (default_perms == 0) { apr_finfo_t finfo; apr_file_t *fd; const char *fname_base, *fname; apr_uint32_t randomish; svn_error_t *err; /* Get the perms for a newly created file to find out what bits should be set. Explicitly delete the file because we want this file to be as short-lived as possible since its presence means other processes may have to try multiple names. Using svn_io_open_uniquely_named() here because other tempfile creation functions tweak the permission bits of files they create. */ randomish = ((apr_uint32_t)(apr_uintptr_t)scratch_pool + (apr_uint32_t)apr_time_now()); fname_base = apr_psprintf(scratch_pool, "svn-%08x", randomish); SVN_ERR(svn_io_open_uniquely_named(&fd, &fname, NULL, fname_base, NULL, svn_io_file_del_none, scratch_pool, scratch_pool)); err = svn_io_file_info_get(&finfo, APR_FINFO_PROT, fd, scratch_pool); err = svn_error_compose_create(err, svn_io_file_close(fd, scratch_pool)); err = svn_error_compose_create(err, svn_io_remove_file2(fname, TRUE, scratch_pool)); SVN_ERR(err); *perms = finfo.protection; default_perms = finfo.protection; } else *perms = default_perms; return SVN_NO_ERROR; } /* OR together permission bits of the file FD and the default permissions of a file as determined by get_default_file_perms(). Do temporary allocations in SCRATCH_POOL. */ static svn_error_t * merge_default_file_perms(apr_file_t *fd, apr_fileperms_t *perms, apr_pool_t *scratch_pool) { apr_finfo_t finfo; apr_fileperms_t default_perms; SVN_ERR(get_default_file_perms(&default_perms, scratch_pool)); SVN_ERR(svn_io_file_info_get(&finfo, APR_FINFO_PROT, fd, scratch_pool)); /* Glom the perms together. */ *perms = default_perms | finfo.protection; return SVN_NO_ERROR; } /* This is a helper function for the svn_io_set_file_read* functions that attempts to honor the users umask when dealing with permission changes. It is a no-op when invoked on a symlink. */ static svn_error_t * io_set_file_perms(const char *path, svn_boolean_t change_readwrite, svn_boolean_t enable_write, svn_boolean_t change_executable, svn_boolean_t executable, svn_boolean_t ignore_enoent, apr_pool_t *pool) { apr_status_t status; const char *path_apr; apr_finfo_t finfo; apr_fileperms_t perms_to_set; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); /* Try to change only a minimal amount of the perms first by getting the current perms and adding bits only on where read perms are granted. If this fails fall through to just setting file attributes. */ status = apr_stat(&finfo, path_apr, APR_FINFO_PROT | APR_FINFO_LINK, pool); if (status) { if (ignore_enoent && (APR_STATUS_IS_ENOENT(status) || SVN__APR_STATUS_IS_ENOTDIR(status))) return SVN_NO_ERROR; else if (status != APR_ENOTIMPL) return svn_error_wrap_apr(status, _("Can't change perms of file '%s'"), svn_dirent_local_style(path, pool)); return SVN_NO_ERROR; } if (finfo.filetype == APR_LNK) return SVN_NO_ERROR; perms_to_set = finfo.protection; if (change_readwrite) { if (enable_write) /* Make read-write. */ { /* Tweak the owner bits only. The group/other bits aren't safe to * touch because we may end up setting them in undesired ways. */ perms_to_set |= (APR_UREAD|APR_UWRITE); } else { if (finfo.protection & APR_UREAD) perms_to_set &= ~APR_UWRITE; if (finfo.protection & APR_GREAD) perms_to_set &= ~APR_GWRITE; if (finfo.protection & APR_WREAD) perms_to_set &= ~APR_WWRITE; } } if (change_executable) { if (executable) { if (finfo.protection & APR_UREAD) perms_to_set |= APR_UEXECUTE; if (finfo.protection & APR_GREAD) perms_to_set |= APR_GEXECUTE; if (finfo.protection & APR_WREAD) perms_to_set |= APR_WEXECUTE; } else { if (finfo.protection & APR_UREAD) perms_to_set &= ~APR_UEXECUTE; if (finfo.protection & APR_GREAD) perms_to_set &= ~APR_GEXECUTE; if (finfo.protection & APR_WREAD) perms_to_set &= ~APR_WEXECUTE; } } /* If we aren't changing anything then just return, this saves some system calls and helps with shared working copies */ if (perms_to_set == finfo.protection) return SVN_NO_ERROR; status = apr_file_perms_set(path_apr, perms_to_set); if (!status) return SVN_NO_ERROR; if (APR_STATUS_IS_EPERM(status)) { /* We don't have permissions to change the permissions! Try a move, copy, and delete workaround to see if we can get the file owned by us. If these succeed, try the permissions set again. Note that we only attempt this in the stat-available path. This assumes that the move-copy workaround will only be helpful on platforms that implement apr_stat. */ SVN_ERR(reown_file(path, pool)); status = apr_file_perms_set(path_apr, perms_to_set); } if (!status) return SVN_NO_ERROR; if (ignore_enoent && APR_STATUS_IS_ENOENT(status)) return SVN_NO_ERROR; else if (status == APR_ENOTIMPL) { /* At least try to set the attributes. */ apr_fileattrs_t attrs = 0; apr_fileattrs_t attrs_values = 0; if (change_readwrite) { attrs = APR_FILE_ATTR_READONLY; if (!enable_write) attrs_values = APR_FILE_ATTR_READONLY; } if (change_executable) { attrs = APR_FILE_ATTR_EXECUTABLE; if (executable) attrs_values = APR_FILE_ATTR_EXECUTABLE; } status = apr_file_attrs_set(path_apr, attrs, attrs_values, pool); } return svn_error_wrap_apr(status, _("Can't change perms of file '%s'"), svn_dirent_local_style(path, pool)); } #endif /* !WIN32 && !__OS2__ */ #ifdef WIN32 /* This is semantically the same as the APR utf8_to_unicode_path function, but reimplemented here because APR does not export it. */ svn_error_t* svn_io__utf8_to_unicode_longpath(const WCHAR **result, const char *source, apr_pool_t *result_pool) { /* This is correct, we don't twist the filename if it will * definitely be shorter than 248 characters. It merits some * performance testing to see if this has any effect, but there * seem to be applications that get confused by the resulting * Unicode \\?\ style file names, especially if they use argv[0] * or call the Win32 API functions such as GetModuleName, etc. * Not every application is prepared to handle such names. * * Note also this is shorter than MAX_PATH, as directory paths * are actually limited to 248 characters. * * Note that a utf-8 name can never result in more wide chars * than the original number of utf-8 narrow chars. */ const WCHAR *prefix = NULL; const int srclen = strlen(source); WCHAR *buffer; if (srclen > 248) { if (svn_ctype_isalpha(source[0]) && source[1] == ':' && (source[2] == '/' || source[2] == '\\')) { /* This is an ordinary absolute path. */ prefix = L"\\\\?\\"; } else if ((source[0] == '/' || source[0] == '\\') && (source[1] == '/' || source[1] == '\\') && source[2] != '?') { /* This is a UNC path */ source += 2; /* Skip the leading slashes */ prefix = L"\\\\?\\UNC\\"; } } SVN_ERR(svn_utf__win32_utf8_to_utf16(&(const WCHAR*)buffer, source, prefix, result_pool)); /* Convert slashes to backslashes because the \\?\ path format does not allow backslashes as path separators. */ *result = buffer; for (; *buffer; ++buffer) { if (*buffer == '/') *buffer = '\\'; } return SVN_NO_ERROR; } /* This is semantically the same as the APR unicode_to_utf8_path function, but reimplemented here because APR does not export it. */ static svn_error_t * io_unicode_to_utf8_path(const char **result, const WCHAR *source, apr_pool_t *result_pool) { const char *utf8_buffer; char *buffer; SVN_ERR(svn_utf__win32_utf16_to_utf8(&utf8_buffer, source, NULL, result_pool)); if (!*utf8_buffer) { *result = utf8_buffer; return SVN_NO_ERROR; } /* We know that the non-empty buffer returned from the UTF-16 to UTF-8 conversion function is in fact writable. */ buffer = (char*)utf8_buffer; /* Skip the leading 4 characters if the path begins \\?\, or substitute * // for the \\?\UNC\ path prefix, allocating the maximum string * length based on the remaining string, plus the trailing null. * then transform \\'s back into /'s since the \\?\ form never * allows '/' path separators, and APR always uses '/'s. */ if (0 == strncmp(buffer, "\\\\?\\", 4)) { buffer += 4; if (0 == strncmp(buffer, "UNC\\", 4)) { buffer += 2; *buffer = '/'; } } *result = buffer; for (; *buffer; ++buffer) { if (*buffer == '\\') *buffer = '/'; } return SVN_NO_ERROR; } static svn_error_t * io_win_file_attrs_set(const char *fname, DWORD attributes, DWORD attr_mask, apr_pool_t *pool) { /* this is an implementation of apr_file_attrs_set() but one that uses the proper Windows attributes instead of the apr attributes. This way, we can apply any Windows file and folder attributes even if apr doesn't implement them */ DWORD flags; const WCHAR *wfname; SVN_ERR(svn_io__utf8_to_unicode_longpath(&wfname, fname, pool)); flags = GetFileAttributesW(wfname); if (flags == 0xFFFFFFFF) return svn_error_wrap_apr(apr_get_os_error(), _("Can't get attributes of file '%s'"), svn_dirent_local_style(fname, pool)); flags &= ~attr_mask; flags |= (attributes & attr_mask); if (!SetFileAttributesW(wfname, flags)) return svn_error_wrap_apr(apr_get_os_error(), _("Can't set attributes of file '%s'"), svn_dirent_local_style(fname, pool)); return SVN_NO_ERROR;; } static svn_error_t *win_init_dynamic_imports(void *baton, apr_pool_t *pool) { HMODULE kernel32 = GetModuleHandleA("kernel32.dll"); if (kernel32) { get_final_path_name_by_handle_proc = (GETFINALPATHNAMEBYHANDLE) GetProcAddress(kernel32, "GetFinalPathNameByHandleW"); set_file_information_by_handle_proc = (SetFileInformationByHandle_t) GetProcAddress(kernel32, "SetFileInformationByHandle"); } return SVN_NO_ERROR; } static svn_error_t * io_win_read_link(svn_string_t **dest, const char *path, apr_pool_t *pool) { SVN_ERR(svn_atomic__init_once(&win_dynamic_imports_state, win_init_dynamic_imports, NULL, pool)); if (get_final_path_name_by_handle_proc) { DWORD rv; apr_status_t status; apr_file_t *file; apr_os_file_t filehand; WCHAR wdest[APR_PATH_MAX]; const char *data; /* reserve one char for terminating zero. */ DWORD wdest_len = sizeof(wdest)/sizeof(wdest[0]) - 1; status = apr_file_open(&file, path, APR_OPENINFO, APR_OS_DEFAULT, pool); if (status) return svn_error_wrap_apr(status, _("Can't read contents of link")); apr_os_file_get(&filehand, file); rv = get_final_path_name_by_handle_proc( filehand, wdest, wdest_len, FILE_NAME_NORMALIZED | VOLUME_NAME_DOS); /* Save error code. */ status = apr_get_os_error(); /* Close file/directory handle in any case. */ apr_file_close(file); /* GetFinaPathNameByHandleW returns number of characters copied to * output buffer. Returns zero on error. Returns required buffer size * if supplied buffer is not enough. */ if (rv > wdest_len || rv == 0) { return svn_error_wrap_apr(status, _("Can't read contents of link")); } /* GetFinaPathNameByHandleW doesn't add terminating NUL. */ wdest[rv] = 0; SVN_ERR(io_unicode_to_utf8_path(&data, wdest, pool)); /* The result is already in the correct pool, so avoid copying it to create the string. */ *dest = svn_string_create_empty(pool); if (*data) { (*dest)->data = data; (*dest)->len = strlen(data); } return SVN_NO_ERROR; } else { return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Symbolic links are not supported on this " "platform")); } } /* Wrapper around Windows API function SetFileInformationByHandle() that * returns APR status instead of boolean flag. */ static apr_status_t win32_set_file_information_by_handle(HANDLE hFile, int FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize) { svn_error_clear(svn_atomic__init_once(&win_dynamic_imports_state, win_init_dynamic_imports, NULL, NULL)); if (!set_file_information_by_handle_proc) { return SVN_ERR_UNSUPPORTED_FEATURE; } if (!set_file_information_by_handle_proc(hFile, FileInformationClass, lpFileInformation, dwBufferSize)) { return apr_get_os_error(); } return APR_SUCCESS; } svn_error_t * svn_io__win_delete_file_on_close(apr_file_t *file, const char *path, apr_pool_t *pool) { FILE_DISPOSITION_INFO disposition_info; HANDLE hFile; apr_status_t status; apr_os_file_get(&hFile, file); disposition_info.DeleteFile = TRUE; status = win32_set_file_information_by_handle(hFile, FileDispositionInfo, &disposition_info, sizeof(disposition_info)); if (status) { return svn_error_wrap_apr(status, _("Can't remove file '%s'"), svn_dirent_local_style(path, pool)); } return SVN_NO_ERROR; } svn_error_t * svn_io__win_rename_open_file(apr_file_t *file, const char *from_path, const char *to_path, apr_pool_t *pool) { WCHAR *w_final_abspath; size_t path_len; size_t rename_size; FILE_RENAME_INFO *rename_info; HANDLE hFile; apr_status_t status; apr_os_file_get(&hFile, file); SVN_ERR(svn_io__utf8_to_unicode_longpath( &w_final_abspath, svn_dirent_local_style(to_path,pool), pool)); path_len = wcslen(w_final_abspath); rename_size = sizeof(*rename_info) + sizeof(WCHAR) * path_len; /* The rename info struct doesn't need hacks for long paths, so no ugly escaping calls here */ rename_info = apr_pcalloc(pool, rename_size); rename_info->ReplaceIfExists = TRUE; rename_info->FileNameLength = path_len; memcpy(rename_info->FileName, w_final_abspath, path_len * sizeof(WCHAR)); status = win32_set_file_information_by_handle(hFile, FileRenameInfo, rename_info, rename_size); if (APR_STATUS_IS_EACCES(status) || APR_STATUS_IS_EEXIST(status)) { /* Set the destination file writable because Windows will not allow us to rename when final_abspath is read-only. */ SVN_ERR(svn_io_set_file_read_write(to_path, TRUE, pool)); status = win32_set_file_information_by_handle(hFile, FileRenameInfo, rename_info, rename_size); } /* Windows returns Vista+ client accessing network share stored on Windows Server 2003 returns ERROR_ACCESS_DENIED. The same happens when Vista+ client access Windows Server 2008 with disabled SMBv2 protocol. So return SVN_ERR_UNSUPPORTED_FEATURE in this case like we do when SetFileInformationByHandle() is not available and let caller to handle it. See "Access denied error on checkout-commit after updating to 1.9.X" discussion on dev@s.a.o: http://svn.haxx.se/dev/archive-2015-09/0054.shtml */ if (status == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED)) { status = SVN_ERR_UNSUPPORTED_FEATURE; } if (status) { return svn_error_wrap_apr(status, _("Can't move '%s' to '%s'"), svn_dirent_local_style(from_path, pool), svn_dirent_local_style(to_path, pool)); } return SVN_NO_ERROR; } #endif /* WIN32 */ svn_error_t * svn_io_set_file_read_write_carefully(const char *path, svn_boolean_t enable_write, svn_boolean_t ignore_enoent, apr_pool_t *pool) { if (enable_write) return svn_io_set_file_read_write(path, ignore_enoent, pool); return svn_io_set_file_read_only(path, ignore_enoent, pool); } svn_error_t * svn_io_set_file_read_only(const char *path, svn_boolean_t ignore_enoent, apr_pool_t *pool) { /* On Windows and OS/2, just set the file attributes -- on unix call our internal function which attempts to honor the umask. */ #if !defined(WIN32) && !defined(__OS2__) return io_set_file_perms(path, TRUE, FALSE, FALSE, FALSE, ignore_enoent, pool); #else apr_status_t status; const char *path_apr; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); status = apr_file_attrs_set(path_apr, APR_FILE_ATTR_READONLY, APR_FILE_ATTR_READONLY, pool); if (status && status != APR_ENOTIMPL) if (!(ignore_enoent && (APR_STATUS_IS_ENOENT(status) || SVN__APR_STATUS_IS_ENOTDIR(status)))) return svn_error_wrap_apr(status, _("Can't set file '%s' read-only"), svn_dirent_local_style(path, pool)); return SVN_NO_ERROR; #endif } svn_error_t * svn_io_set_file_read_write(const char *path, svn_boolean_t ignore_enoent, apr_pool_t *pool) { /* On Windows and OS/2, just set the file attributes -- on unix call our internal function which attempts to honor the umask. */ #if !defined(WIN32) && !defined(__OS2__) return io_set_file_perms(path, TRUE, TRUE, FALSE, FALSE, ignore_enoent, pool); #else apr_status_t status; const char *path_apr; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); status = apr_file_attrs_set(path_apr, 0, APR_FILE_ATTR_READONLY, pool); if (status && status != APR_ENOTIMPL) if (!ignore_enoent || !APR_STATUS_IS_ENOENT(status)) return svn_error_wrap_apr(status, _("Can't set file '%s' read-write"), svn_dirent_local_style(path, pool)); return SVN_NO_ERROR; #endif } svn_error_t * svn_io_set_file_executable(const char *path, svn_boolean_t executable, svn_boolean_t ignore_enoent, apr_pool_t *pool) { /* On Windows and OS/2, just exit -- on unix call our internal function which attempts to honor the umask. */ #if (!defined(WIN32) && !defined(__OS2__)) return io_set_file_perms(path, FALSE, FALSE, TRUE, executable, ignore_enoent, pool); #else return SVN_NO_ERROR; #endif } svn_error_t * svn_io__is_finfo_read_only(svn_boolean_t *read_only, apr_finfo_t *file_info, apr_pool_t *pool) { #if defined(APR_HAS_USER) && !defined(WIN32) &&!defined(__OS2__) apr_status_t apr_err; apr_uid_t uid; apr_gid_t gid; *read_only = FALSE; apr_err = apr_uid_current(&uid, &gid, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Error getting UID of process")); /* Check write bit for current user. */ if (apr_uid_compare(uid, file_info->user) == APR_SUCCESS) *read_only = !(file_info->protection & APR_UWRITE); else if (apr_gid_compare(gid, file_info->group) == APR_SUCCESS) *read_only = !(file_info->protection & APR_GWRITE); else *read_only = !(file_info->protection & APR_WWRITE); #else /* WIN32 || __OS2__ || !APR_HAS_USER */ *read_only = (file_info->protection & APR_FREADONLY); #endif return SVN_NO_ERROR; } svn_error_t * svn_io__is_finfo_executable(svn_boolean_t *executable, apr_finfo_t *file_info, apr_pool_t *pool) { #if defined(APR_HAS_USER) && !defined(WIN32) &&!defined(__OS2__) apr_status_t apr_err; apr_uid_t uid; apr_gid_t gid; *executable = FALSE; apr_err = apr_uid_current(&uid, &gid, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Error getting UID of process")); /* Check executable bit for current user. */ if (apr_uid_compare(uid, file_info->user) == APR_SUCCESS) *executable = (file_info->protection & APR_UEXECUTE); else if (apr_gid_compare(gid, file_info->group) == APR_SUCCESS) *executable = (file_info->protection & APR_GEXECUTE); else *executable = (file_info->protection & APR_WEXECUTE); #else /* WIN32 || __OS2__ || !APR_HAS_USER */ *executable = FALSE; #endif return SVN_NO_ERROR; } svn_error_t * svn_io_is_file_executable(svn_boolean_t *executable, const char *path, apr_pool_t *pool) { #if defined(APR_HAS_USER) && !defined(WIN32) &&!defined(__OS2__) apr_finfo_t file_info; SVN_ERR(svn_io_stat(&file_info, path, APR_FINFO_PROT | APR_FINFO_OWNER, pool)); SVN_ERR(svn_io__is_finfo_executable(executable, &file_info, pool)); #else /* WIN32 || __OS2__ || !APR_HAS_USER */ *executable = FALSE; #endif return SVN_NO_ERROR; } /*** File locking. ***/ #if !defined(WIN32) && !defined(__OS2__) /* Clear all outstanding locks on ARG, an open apr_file_t *. */ static apr_status_t file_clear_locks(void *arg) { apr_status_t apr_err; apr_file_t *f = arg; /* Remove locks. */ apr_err = apr_file_unlock(f); if (apr_err) return apr_err; return 0; } #endif svn_error_t * svn_io_lock_open_file(apr_file_t *lockfile_handle, svn_boolean_t exclusive, svn_boolean_t nonblocking, apr_pool_t *pool) { int locktype = APR_FLOCK_SHARED; apr_status_t apr_err; const char *fname; if (exclusive) locktype = APR_FLOCK_EXCLUSIVE; if (nonblocking) locktype |= APR_FLOCK_NONBLOCK; /* We need this only in case of an error but this is cheap to get - * so we do it here for clarity. */ apr_err = apr_file_name_get(&fname, lockfile_handle); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't get file name")); /* Get lock on the filehandle. */ apr_err = apr_file_lock(lockfile_handle, locktype); /* In deployments with two or more multithreaded servers running on the same system serving two or more fsfs repositories it is possible for a deadlock to occur when getting a write lock on db/txn-current-lock: Process 1 Process 2 --------- --------- thread 1: get lock in repos A thread 1: get lock in repos B thread 2: block getting lock in repos A thread 2: try to get lock in B *** deadlock *** Retry for a while for the deadlock to clear. */ FILE_LOCK_RETRY_LOOP(apr_err, apr_file_lock(lockfile_handle, locktype)); if (apr_err) { switch (locktype & APR_FLOCK_TYPEMASK) { case APR_FLOCK_SHARED: return svn_error_wrap_apr(apr_err, _("Can't get shared lock on file '%s'"), try_utf8_from_internal_style(fname, pool)); case APR_FLOCK_EXCLUSIVE: return svn_error_wrap_apr(apr_err, _("Can't get exclusive lock on file '%s'"), try_utf8_from_internal_style(fname, pool)); default: SVN_ERR_MALFUNCTION(); } } /* On Windows and OS/2 file locks are automatically released when the file handle closes */ #if !defined(WIN32) && !defined(__OS2__) apr_pool_cleanup_register(pool, lockfile_handle, file_clear_locks, apr_pool_cleanup_null); #endif return SVN_NO_ERROR; } svn_error_t * svn_io_unlock_open_file(apr_file_t *lockfile_handle, apr_pool_t *pool) { const char *fname; apr_status_t apr_err; /* We need this only in case of an error but this is cheap to get - * so we do it here for clarity. */ apr_err = apr_file_name_get(&fname, lockfile_handle); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't get file name")); /* The actual unlock attempt. */ apr_err = apr_file_unlock(lockfile_handle); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't unlock file '%s'"), try_utf8_from_internal_style(fname, pool)); /* On Windows and OS/2 file locks are automatically released when the file handle closes */ #if !defined(WIN32) && !defined(__OS2__) apr_pool_cleanup_kill(pool, lockfile_handle, file_clear_locks); #endif return SVN_NO_ERROR; } svn_error_t * svn_io_file_lock2(const char *lock_file, svn_boolean_t exclusive, svn_boolean_t nonblocking, apr_pool_t *pool) { int locktype = APR_FLOCK_SHARED; apr_file_t *lockfile_handle; apr_int32_t flags; if (exclusive) locktype = APR_FLOCK_EXCLUSIVE; flags = APR_READ; if (locktype == APR_FLOCK_EXCLUSIVE) flags |= APR_WRITE; /* locktype is never read after this block, so we don't need to bother setting it. If that were to ever change, uncomment the following block. if (nonblocking) locktype |= APR_FLOCK_NONBLOCK; */ SVN_ERR(svn_io_file_open(&lockfile_handle, lock_file, flags, APR_OS_DEFAULT, pool)); /* Get lock on the filehandle. */ return svn_io_lock_open_file(lockfile_handle, exclusive, nonblocking, pool); } svn_error_t * svn_io__file_lock_autocreate(const char *lock_file, apr_pool_t *pool) { svn_error_t *err = svn_io_file_lock2(lock_file, TRUE, FALSE, pool); if (err && APR_STATUS_IS_ENOENT(err->apr_err)) { /* No lock file? No big deal; these are just empty files anyway. Create it and try again. */ svn_error_clear(err); /* This file creation is racy. We don't care as long as file gets created at all. */ err = svn_io_file_create_empty(lock_file, pool); if (err && APR_STATUS_IS_EEXIST(err->apr_err)) { svn_error_clear(err); err = NULL; } /* Finally, lock the file - if it exists */ if (!err) err = svn_io_file_lock2(lock_file, TRUE, FALSE, pool); } return svn_error_trace(err); } /* Data consistency/coherency operations. */ svn_error_t *svn_io_file_flush_to_disk(apr_file_t *file, apr_pool_t *pool) { apr_os_file_t filehand; /* ### In apr 1.4+ we could delegate most of this function to apr_file_sync(). The only major difference is that this doesn't contain the retry loop for EINTR on linux. */ /* First make sure that any user-space buffered data is flushed. */ SVN_ERR(svn_io_file_flush(file, pool)); apr_os_file_get(&filehand, file); /* Call the operating system specific function to actually force the data to disk. */ { #ifdef WIN32 if (! FlushFileBuffers(filehand)) return svn_error_wrap_apr(apr_get_os_error(), _("Can't flush file to disk")); #else int rv; do { #ifdef F_FULLFSYNC rv = fcntl(filehand, F_FULLFSYNC, 0); #else rv = fsync(filehand); #endif } while (rv == -1 && APR_STATUS_IS_EINTR(apr_get_os_error())); /* If the file is in a memory filesystem, fsync() may return EINVAL. Presumably the user knows the risks, and we can just ignore the error. */ if (rv == -1 && APR_STATUS_IS_EINVAL(apr_get_os_error())) return SVN_NO_ERROR; if (rv == -1) return svn_error_wrap_apr(apr_get_os_error(), _("Can't flush file to disk")); #endif } return SVN_NO_ERROR; } /* TODO write test for these two functions, then refactor. */ /* Set RESULT to an svn_stringbuf_t containing the contents of FILE. FILENAME is the FILE's on-disk APR-safe name, or NULL if that name isn't known. If CHECK_SIZE is TRUE, the function will attempt to first stat() the file to determine it's size before sucking its contents into the stringbuf. (Doing so can prevent unnecessary memory usage, an unwanted side effect of the stringbuf growth and reallocation mechanism.) */ static svn_error_t * stringbuf_from_aprfile(svn_stringbuf_t **result, const char *filename, apr_file_t *file, svn_boolean_t check_size, apr_pool_t *pool) { apr_size_t len; svn_error_t *err; svn_stringbuf_t *res = NULL; apr_size_t res_initial_len = SVN__STREAM_CHUNK_SIZE; char *buf; /* If our caller wants us to check the size of the file for efficient memory handling, we'll try to do so. */ if (check_size) { apr_finfo_t finfo = { 0 }; /* In some cases we get size 0 and no error for non files, so we also check for the name. (= cached in apr_file_t) */ if (! apr_file_info_get(&finfo, APR_FINFO_SIZE, file) && finfo.fname) { /* we've got the file length. Now, read it in one go. */ svn_boolean_t eof; res_initial_len = (apr_size_t)finfo.size; res = svn_stringbuf_create_ensure(res_initial_len, pool); SVN_ERR(svn_io_file_read_full2(file, res->data, res_initial_len, &res->len, &eof, pool)); res->data[res->len] = 0; *result = res; return SVN_NO_ERROR; } } /* XXX: We should check the incoming data for being of type binary. */ buf = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE); res = svn_stringbuf_create_ensure(res_initial_len, pool); /* apr_file_read will not return data and eof in the same call. So this loop * is safe from missing read data. */ len = SVN__STREAM_CHUNK_SIZE; err = svn_io_file_read(file, buf, &len, pool); while (! err) { svn_stringbuf_appendbytes(res, buf, len); len = SVN__STREAM_CHUNK_SIZE; err = svn_io_file_read(file, buf, &len, pool); } /* Having read all the data we *expect* EOF */ if (err && !APR_STATUS_IS_EOF(err->apr_err)) return svn_error_trace(err); svn_error_clear(err); *result = res; return SVN_NO_ERROR; } svn_error_t * svn_stringbuf_from_file2(svn_stringbuf_t **result, const char *filename, apr_pool_t *pool) { apr_file_t *f; if (filename[0] == '-' && filename[1] == '\0') { apr_status_t apr_err; if ((apr_err = apr_file_open_stdin(&f, pool))) return svn_error_wrap_apr(apr_err, _("Can't open stdin")); SVN_ERR(stringbuf_from_aprfile(result, NULL, f, FALSE, pool)); } else { SVN_ERR(svn_io_file_open(&f, filename, APR_READ, APR_OS_DEFAULT, pool)); SVN_ERR(stringbuf_from_aprfile(result, filename, f, TRUE, pool)); } return svn_io_file_close(f, pool); } svn_error_t * svn_stringbuf_from_file(svn_stringbuf_t **result, const char *filename, apr_pool_t *pool) { if (filename[0] == '-' && filename[1] == '\0') return svn_error_create (SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Reading from stdin is disallowed")); return svn_stringbuf_from_file2(result, filename, pool); } svn_error_t * svn_stringbuf_from_aprfile(svn_stringbuf_t **result, apr_file_t *file, apr_pool_t *pool) { return stringbuf_from_aprfile(result, NULL, file, TRUE, pool); } /* Deletion. */ svn_error_t * svn_io_remove_file2(const char *path, svn_boolean_t ignore_enoent, apr_pool_t *scratch_pool) { apr_status_t apr_err; const char *path_apr; SVN_ERR(cstring_from_utf8(&path_apr, path, scratch_pool)); apr_err = apr_file_remove(path_apr, scratch_pool); #ifdef WIN32 /* If the target is read only NTFS reports EACCESS and FAT/FAT32 reports EEXIST */ if (APR_STATUS_IS_EACCES(apr_err) || APR_STATUS_IS_EEXIST(apr_err)) { /* Set the destination file writable because Windows will not allow us to delete when path is read-only */ SVN_ERR(svn_io_set_file_read_write(path, ignore_enoent, scratch_pool)); apr_err = apr_file_remove(path_apr, scratch_pool); if (!apr_err) return SVN_NO_ERROR; } /* Check to make sure we aren't trying to delete a directory */ if (apr_err == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED) || apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION)) { apr_finfo_t finfo; if (!apr_stat(&finfo, path_apr, APR_FINFO_TYPE, scratch_pool) && finfo.filetype == APR_REG) { WIN32_RETRY_LOOP(apr_err, apr_file_remove(path_apr, scratch_pool)); } } /* Just return the delete error */ #endif if (!apr_err) { return SVN_NO_ERROR; } else if (ignore_enoent && (APR_STATUS_IS_ENOENT(apr_err) || SVN__APR_STATUS_IS_ENOTDIR(apr_err))) { return SVN_NO_ERROR; } else { return svn_error_wrap_apr(apr_err, _("Can't remove file '%s'"), svn_dirent_local_style(path, scratch_pool)); } } svn_error_t * svn_io_remove_dir(const char *path, apr_pool_t *pool) { return svn_io_remove_dir2(path, FALSE, NULL, NULL, pool); } /* Mac OS X has a bug where if you're reading the contents of a directory via readdir in a loop, and you remove one of the entries in the directory and the directory has 338 or more files in it you will skip over some of the entries in the directory. Needless to say, this causes problems if you are using this kind of loop inside a function that is recursively deleting a directory, because when you get around to removing the directory it will still have something in it. A similar problem has been observed in other BSDs. This bug has since been fixed. See http://www.vnode.ch/fixing_seekdir for details. The workaround is to delete the files only _after_ the initial directory scan. A previous workaround involving rewinddir is problematic on Win32 and some NFS clients, notably NetBSD. See http://subversion.tigris.org/issues/show_bug.cgi?id=1896 and http://subversion.tigris.org/issues/show_bug.cgi?id=3501. */ /* Neither windows nor unix allows us to delete a non-empty directory. This is a function to perform the equivalent of 'rm -rf'. */ svn_error_t * svn_io_remove_dir2(const char *path, svn_boolean_t ignore_enoent, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) { svn_error_t *err; apr_pool_t *subpool; apr_hash_t *dirents; apr_hash_index_t *hi; /* Check for pending cancellation request. If we need to bail out, do so early. */ if (cancel_func) SVN_ERR((*cancel_func)(cancel_baton)); subpool = svn_pool_create(pool); err = svn_io_get_dirents3(&dirents, path, TRUE, subpool, subpool); if (err) { /* if the directory doesn't exist, our mission is accomplished */ if (ignore_enoent && (APR_STATUS_IS_ENOENT(err->apr_err) || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))) { svn_error_clear(err); return SVN_NO_ERROR; } return svn_error_trace(err); } for (hi = apr_hash_first(subpool, dirents); hi; hi = apr_hash_next(hi)) { const char *name = apr_hash_this_key(hi); const svn_io_dirent2_t *dirent = apr_hash_this_val(hi); const char *fullpath; fullpath = svn_dirent_join(path, name, subpool); if (dirent->kind == svn_node_dir) { /* Don't check for cancellation, the callee will immediately do so */ SVN_ERR(svn_io_remove_dir2(fullpath, FALSE, cancel_func, cancel_baton, subpool)); } else { if (cancel_func) SVN_ERR((*cancel_func)(cancel_baton)); err = svn_io_remove_file2(fullpath, FALSE, subpool); if (err) return svn_error_createf (err->apr_err, err, _("Can't remove '%s'"), svn_dirent_local_style(fullpath, subpool)); } } svn_pool_destroy(subpool); return svn_io_dir_remove_nonrecursive(path, pool); } svn_error_t * svn_io_get_dir_filenames(apr_hash_t **dirents, const char *path, apr_pool_t *pool) { return svn_error_trace(svn_io_get_dirents3(dirents, path, TRUE, pool, pool)); } svn_io_dirent2_t * svn_io_dirent2_create(apr_pool_t *result_pool) { svn_io_dirent2_t *dirent = apr_pcalloc(result_pool, sizeof(*dirent)); /*dirent->kind = svn_node_none; dirent->special = FALSE;*/ dirent->filesize = SVN_INVALID_FILESIZE; /*dirent->mtime = 0;*/ return dirent; } svn_io_dirent2_t * svn_io_dirent2_dup(const svn_io_dirent2_t *item, apr_pool_t *result_pool) { return apr_pmemdup(result_pool, item, sizeof(*item)); } svn_error_t * svn_io_get_dirents3(apr_hash_t **dirents, const char *path, svn_boolean_t only_check_type, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { apr_status_t status; apr_dir_t *this_dir; apr_finfo_t this_entry; apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME; if (!only_check_type) flags |= APR_FINFO_SIZE | APR_FINFO_MTIME; *dirents = apr_hash_make(result_pool); SVN_ERR(svn_io_dir_open(&this_dir, path, scratch_pool)); for (status = apr_dir_read(&this_entry, flags, this_dir); status == APR_SUCCESS; status = apr_dir_read(&this_entry, flags, this_dir)) { if ((this_entry.name[0] == '.') && ((this_entry.name[1] == '\0') || ((this_entry.name[1] == '.') && (this_entry.name[2] == '\0')))) { continue; } else { const char *name; svn_io_dirent2_t *dirent = svn_io_dirent2_create(result_pool); SVN_ERR(entry_name_to_utf8(&name, this_entry.name, path, result_pool)); map_apr_finfo_to_node_kind(&(dirent->kind), &(dirent->special), &this_entry); if (!only_check_type) { dirent->filesize = this_entry.size; dirent->mtime = this_entry.mtime; } svn_hash_sets(*dirents, name, dirent); } } if (! (APR_STATUS_IS_ENOENT(status))) return svn_error_wrap_apr(status, _("Can't read directory '%s'"), svn_dirent_local_style(path, scratch_pool)); status = apr_dir_close(this_dir); if (status) return svn_error_wrap_apr(status, _("Error closing directory '%s'"), svn_dirent_local_style(path, scratch_pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_stat_dirent2(const svn_io_dirent2_t **dirent_p, const char *path, svn_boolean_t verify_truename, svn_boolean_t ignore_enoent, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { apr_finfo_t finfo; svn_io_dirent2_t *dirent; svn_error_t *err; apr_int32_t wanted = APR_FINFO_TYPE | APR_FINFO_LINK | APR_FINFO_SIZE | APR_FINFO_MTIME; #if defined(WIN32) || defined(__OS2__) if (verify_truename) wanted |= APR_FINFO_NAME; #endif err = svn_io_stat(&finfo, path, wanted, scratch_pool); if (err && ignore_enoent && (APR_STATUS_IS_ENOENT(err->apr_err) || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))) { svn_error_clear(err); dirent = svn_io_dirent2_create(result_pool); SVN_ERR_ASSERT(dirent->kind == svn_node_none); *dirent_p = dirent; return SVN_NO_ERROR; } SVN_ERR(err); #if defined(WIN32) || defined(__OS2__) || defined(DARWIN) if (verify_truename) { const char *requested_name = svn_dirent_basename(path, NULL); if (requested_name[0] == '\0') { /* No parent directory. No need to stat/verify */ } #if defined(WIN32) || defined(__OS2__) else if (finfo.name) { const char *name_on_disk; SVN_ERR(entry_name_to_utf8(&name_on_disk, finfo.name, path, scratch_pool)); if (strcmp(name_on_disk, requested_name) /* != 0 */) { if (ignore_enoent) { *dirent_p = svn_io_dirent2_create(result_pool); return SVN_NO_ERROR; } else return svn_error_createf(APR_ENOENT, NULL, _("Path '%s' not found, case obstructed by '%s'"), svn_dirent_local_style(path, scratch_pool), name_on_disk); } } #elif defined(DARWIN) /* Currently apr doesn't set finfo.name on DARWIN, returning APR_INCOMPLETE. ### Can we optimize this in another way? */ else { apr_hash_t *dirents; err = svn_io_get_dirents3(&dirents, svn_dirent_dirname(path, scratch_pool), TRUE /* only_check_type */, scratch_pool, scratch_pool); if (err && ignore_enoent && (APR_STATUS_IS_ENOENT(err->apr_err) || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))) { svn_error_clear(err); *dirent_p = svn_io_dirent2_create(result_pool); return SVN_NO_ERROR; } else SVN_ERR(err); if (! svn_hash_gets(dirents, requested_name)) { if (ignore_enoent) { *dirent_p = svn_io_dirent2_create(result_pool); return SVN_NO_ERROR; } else return svn_error_createf(APR_ENOENT, NULL, _("Path '%s' not found"), svn_dirent_local_style(path, scratch_pool)); } } #endif } #endif dirent = svn_io_dirent2_create(result_pool); map_apr_finfo_to_node_kind(&(dirent->kind), &(dirent->special), &finfo); dirent->filesize = finfo.size; dirent->mtime = finfo.mtime; *dirent_p = dirent; return SVN_NO_ERROR; } /* Pool userdata key for the error file passed to svn_io_start_cmd(). */ #define ERRFILE_KEY "svn-io-start-cmd-errfile" /* Handle an error from the child process (before command execution) by printing DESC and the error string corresponding to STATUS to stderr. */ static void handle_child_process_error(apr_pool_t *pool, apr_status_t status, const char *desc) { char errbuf[256]; apr_file_t *errfile; void *p; /* We can't do anything if we get an error here, so just return. */ if (apr_pool_userdata_get(&p, ERRFILE_KEY, pool)) return; errfile = p; if (errfile) /* What we get from APR is in native encoding. */ apr_file_printf(errfile, "%s: %s", desc, apr_strerror(status, errbuf, sizeof(errbuf))); } svn_error_t * svn_io_start_cmd3(apr_proc_t *cmd_proc, const char *path, const char *cmd, const char *const *args, const char *const *env, 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) { apr_status_t apr_err; apr_procattr_t *cmdproc_attr; int num_args; const char **args_native; const char *cmd_apr; SVN_ERR_ASSERT(!((infile != NULL) && infile_pipe)); SVN_ERR_ASSERT(!((outfile != NULL) && outfile_pipe)); SVN_ERR_ASSERT(!((errfile != NULL) && errfile_pipe)); /* Create the process attributes. */ apr_err = apr_procattr_create(&cmdproc_attr, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't create process '%s' attributes"), cmd); /* Make sure we invoke cmd directly, not through a shell. */ apr_err = apr_procattr_cmdtype_set(cmdproc_attr, inherit ? APR_PROGRAM_PATH : APR_PROGRAM); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' cmdtype"), cmd); /* Set the process's working directory. */ if (path) { const char *path_apr; /* APR doesn't like our canonical path format for current directory */ if (path[0] == '\0') path = "."; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); apr_err = apr_procattr_dir_set(cmdproc_attr, path_apr); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' directory"), cmd); } /* Use requested inputs and outputs. ### Unfortunately each of these apr functions creates a pipe and then overwrites the pipe file descriptor with the descriptor we pass in. The pipes can then never be closed. This is an APR bug. */ if (infile) { apr_err = apr_procattr_child_in_set(cmdproc_attr, infile, NULL); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' child input"), cmd); } if (outfile) { apr_err = apr_procattr_child_out_set(cmdproc_attr, outfile, NULL); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' child outfile"), cmd); } if (errfile) { apr_err = apr_procattr_child_err_set(cmdproc_attr, errfile, NULL); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' child errfile"), cmd); } /* Forward request for pipes to APR. */ if (infile_pipe || outfile_pipe || errfile_pipe) { apr_err = apr_procattr_io_set(cmdproc_attr, infile_pipe ? APR_FULL_BLOCK : APR_NO_PIPE, outfile_pipe ? APR_FULL_BLOCK : APR_NO_PIPE, errfile_pipe ? APR_FULL_BLOCK : APR_NO_PIPE); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' stdio pipes"), cmd); } /* Have the child print any problems executing its program to errfile. */ apr_err = apr_pool_userdata_set(errfile, ERRFILE_KEY, NULL, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' child errfile for " "error handler"), cmd); apr_err = apr_procattr_child_errfn_set(cmdproc_attr, handle_child_process_error); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set process '%s' error handler"), cmd); /* Convert cmd and args from UTF-8 */ SVN_ERR(cstring_from_utf8(&cmd_apr, cmd, pool)); for (num_args = 0; args[num_args]; num_args++) ; args_native = apr_palloc(pool, (num_args + 1) * sizeof(char *)); args_native[num_args] = NULL; while (num_args--) { /* ### Well, it turns out that on APR on Windows expects all program args to be in UTF-8. Callers of svn_io_run_cmd should be aware of that. */ SVN_ERR(cstring_from_utf8(&args_native[num_args], args[num_args], pool)); } /* Start the cmd command. */ apr_err = apr_proc_create(cmd_proc, cmd_apr, args_native, inherit ? NULL : env, cmdproc_attr, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't start process '%s'"), cmd); return SVN_NO_ERROR; } #undef ERRFILE_KEY svn_error_t * svn_io_wait_for_cmd(apr_proc_t *cmd_proc, const char *cmd, int *exitcode, apr_exit_why_e *exitwhy, apr_pool_t *pool) { apr_status_t apr_err; apr_exit_why_e exitwhy_val; int exitcode_val; /* The Win32 apr_proc_wait doesn't set this... */ exitwhy_val = APR_PROC_EXIT; /* Wait for the cmd command to finish. */ apr_err = apr_proc_wait(cmd_proc, &exitcode_val, &exitwhy_val, APR_WAIT); if (!APR_STATUS_IS_CHILD_DONE(apr_err)) return svn_error_wrap_apr(apr_err, _("Error waiting for process '%s'"), cmd); if (exitwhy) *exitwhy = exitwhy_val; else if (APR_PROC_CHECK_SIGNALED(exitwhy_val) && APR_PROC_CHECK_CORE_DUMP(exitwhy_val)) return svn_error_createf (SVN_ERR_EXTERNAL_PROGRAM, NULL, _("Process '%s' failed (signal %d, core dumped)"), cmd, exitcode_val); else if (APR_PROC_CHECK_SIGNALED(exitwhy_val)) return svn_error_createf (SVN_ERR_EXTERNAL_PROGRAM, NULL, _("Process '%s' failed (signal %d)"), cmd, exitcode_val); else if (! APR_PROC_CHECK_EXIT(exitwhy_val)) /* Don't really know what happened here. */ return svn_error_createf (SVN_ERR_EXTERNAL_PROGRAM, NULL, _("Process '%s' failed (exitwhy %d, exitcode %d)"), cmd, exitwhy_val, exitcode_val); if (exitcode) *exitcode = exitcode_val; else if (exitcode_val != 0) return svn_error_createf (SVN_ERR_EXTERNAL_PROGRAM, NULL, _("Process '%s' returned error exitcode %d"), cmd, exitcode_val); return SVN_NO_ERROR; } svn_error_t * svn_io_run_cmd(const char *path, const char *cmd, const char *const *args, int *exitcode, apr_exit_why_e *exitwhy, svn_boolean_t inherit, apr_file_t *infile, apr_file_t *outfile, apr_file_t *errfile, apr_pool_t *pool) { apr_proc_t cmd_proc; SVN_ERR(svn_io_start_cmd3(&cmd_proc, path, cmd, args, NULL, inherit, FALSE, infile, FALSE, outfile, FALSE, errfile, pool)); return svn_io_wait_for_cmd(&cmd_proc, cmd, exitcode, exitwhy, pool); } svn_error_t * svn_io_run_diff2(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) { const char **args; int i; int exitcode; int nargs = 4; /* the diff command itself, two paths, plus a trailing NULL */ apr_pool_t *subpool = svn_pool_create(pool); if (pexitcode == NULL) pexitcode = &exitcode; if (user_args != NULL) nargs += num_user_args; else nargs += 1; /* -u */ if (label1 != NULL) nargs += 2; /* the -L and the label itself */ if (label2 != NULL) nargs += 2; /* the -L and the label itself */ args = apr_palloc(subpool, nargs * sizeof(char *)); i = 0; args[i++] = diff_cmd; if (user_args != NULL) { int j; for (j = 0; j < num_user_args; ++j) args[i++] = user_args[j]; } else args[i++] = "-u"; /* assume -u if the user didn't give us any args */ if (label1 != NULL) { args[i++] = "-L"; args[i++] = label1; } if (label2 != NULL) { args[i++] = "-L"; args[i++] = label2; } args[i++] = svn_dirent_local_style(from, subpool); args[i++] = svn_dirent_local_style(to, subpool); args[i++] = NULL; SVN_ERR_ASSERT(i == nargs); SVN_ERR(svn_io_run_cmd(dir, diff_cmd, args, pexitcode, NULL, TRUE, NULL, outfile, errfile, subpool)); /* The man page for (GNU) diff describes the return value as: "An exit status of 0 means no differences were found, 1 means some differences were found, and 2 means trouble." A return value of 2 typically occurs when diff cannot read its input or write to its output, but in any case we probably ought to return an error for anything other than 0 or 1 as the output is likely to be corrupt. */ if (*pexitcode != 0 && *pexitcode != 1) return svn_error_createf(SVN_ERR_EXTERNAL_PROGRAM, NULL, _("'%s' returned %d"), svn_dirent_local_style(diff_cmd, pool), *pexitcode); svn_pool_destroy(subpool); return SVN_NO_ERROR; } svn_error_t * svn_io_run_diff3_3(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) { const char **args = apr_palloc(pool, sizeof(char*) * (13 + (user_args ? user_args->nelts : 1))); #ifndef NDEBUG int nargs = 12; #endif int i = 0; /* Labels fall back to sensible defaults if not specified. */ if (mine_label == NULL) mine_label = ".working"; if (older_label == NULL) older_label = ".old"; if (yours_label == NULL) yours_label = ".new"; /* Set up diff3 command line. */ args[i++] = diff3_cmd; if (user_args) { int j; for (j = 0; j < user_args->nelts; ++j) args[i++] = APR_ARRAY_IDX(user_args, j, const char *); #ifndef NDEBUG nargs += user_args->nelts; #endif } else { args[i++] = "-E"; /* We tried "-A" here, but that caused overlapping identical changes to conflict. See issue #682. */ #ifndef NDEBUG ++nargs; #endif } args[i++] = "-m"; args[i++] = "-L"; args[i++] = mine_label; args[i++] = "-L"; args[i++] = older_label; /* note: this label is ignored if using 2-part markers, which is the case with "-E". */ args[i++] = "-L"; args[i++] = yours_label; #ifdef SVN_DIFF3_HAS_DIFF_PROGRAM_ARG { svn_boolean_t has_arg; /* ### FIXME: we really shouldn't be reading the config here; instead, the necessary bits should be passed in by the caller. But should we add another parameter to this function, when the whole external diff3 thing might eventually go away? */ apr_hash_t *config; svn_config_t *cfg; SVN_ERR(svn_config_get_config(&config, pool)); cfg = config ? svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG) : NULL; SVN_ERR(svn_config_get_bool(cfg, &has_arg, SVN_CONFIG_SECTION_HELPERS, SVN_CONFIG_OPTION_DIFF3_HAS_PROGRAM_ARG, TRUE)); if (has_arg) { const char *diff_cmd, *diff_utf8; svn_config_get(cfg, &diff_cmd, SVN_CONFIG_SECTION_HELPERS, SVN_CONFIG_OPTION_DIFF_CMD, SVN_CLIENT_DIFF); SVN_ERR(cstring_to_utf8(&diff_utf8, diff_cmd, pool)); args[i++] = apr_pstrcat(pool, "--diff-program=", diff_utf8, SVN_VA_NULL); #ifndef NDEBUG ++nargs; #endif } } #endif args[i++] = svn_dirent_local_style(mine, pool); args[i++] = svn_dirent_local_style(older, pool); args[i++] = svn_dirent_local_style(yours, pool); args[i++] = NULL; #ifndef NDEBUG SVN_ERR_ASSERT(i == nargs); #endif /* Run diff3, output the merged text into the scratch file. */ SVN_ERR(svn_io_run_cmd(dir, diff3_cmd, args, exitcode, NULL, TRUE, /* keep environment */ NULL, merged, NULL, pool)); /* According to the diff3 docs, a '0' means the merge was clean, and '1' means conflict markers were found. Anything else is real error. */ if ((*exitcode != 0) && (*exitcode != 1)) return svn_error_createf(SVN_ERR_EXTERNAL_PROGRAM, NULL, _("Error running '%s': exitcode was %d, " "args were:" "\nin directory '%s', basenames:\n%s\n%s\n%s"), svn_dirent_local_style(diff3_cmd, pool), *exitcode, svn_dirent_local_style(dir, pool), /* Don't call svn_path_local_style() on the basenames. We don't want them to be absolute, and we don't need the separator conversion. */ mine, older, yours); return SVN_NO_ERROR; } /* Canonicalize a string for hashing. Modifies KEY in place. */ static APR_INLINE char * fileext_tolower(char *key) { register char *p; for (p = key; *p != 0; ++p) *p = (char)apr_tolower(*p); return key; } svn_error_t * svn_io_parse_mimetypes_file(apr_hash_t **type_map, const char *mimetypes_file, apr_pool_t *pool) { svn_error_t *err = SVN_NO_ERROR; apr_hash_t *types = apr_hash_make(pool); svn_boolean_t eof = FALSE; svn_stringbuf_t *buf; apr_pool_t *subpool = svn_pool_create(pool); apr_file_t *types_file; svn_stream_t *mimetypes_stream; SVN_ERR(svn_io_file_open(&types_file, mimetypes_file, APR_READ, APR_OS_DEFAULT, pool)); mimetypes_stream = svn_stream_from_aprfile2(types_file, FALSE, pool); while (1) { apr_array_header_t *tokens; const char *type; svn_pool_clear(subpool); /* Read a line. */ if ((err = svn_stream_readline(mimetypes_stream, &buf, APR_EOL_STR, &eof, subpool))) break; /* Only pay attention to non-empty, non-comment lines. */ if (buf->len) { int i; if (buf->data[0] == '#') continue; /* Tokenize (into our return pool). */ tokens = svn_cstring_split(buf->data, " \t", TRUE, pool); if (tokens->nelts < 2) continue; /* The first token in a multi-token line is the media type. Subsequent tokens are filename extensions associated with that media type. */ type = APR_ARRAY_IDX(tokens, 0, const char *); for (i = 1; i < tokens->nelts; i++) { /* We can safely address 'ext' as a non-const string because * we know svn_cstring_split() allocated it in 'pool' for us. */ char *ext = APR_ARRAY_IDX(tokens, i, char *); fileext_tolower(ext); svn_hash_sets(types, ext, type); } } if (eof) break; } svn_pool_destroy(subpool); /* If there was an error above, close the file (ignoring any error from *that*) and return the originally error. */ if (err) { svn_error_clear(svn_stream_close(mimetypes_stream)); return err; } /* Close the stream (which closes the underlying file, too). */ SVN_ERR(svn_stream_close(mimetypes_stream)); *type_map = types; return SVN_NO_ERROR; } svn_error_t * svn_io_detect_mimetype2(const char **mimetype, const char *file, apr_hash_t *mimetype_map, apr_pool_t *pool) { static const char * const generic_binary = "application/octet-stream"; svn_node_kind_t kind; apr_file_t *fh; svn_error_t *err; unsigned char block[1024]; apr_size_t amt_read = sizeof(block); /* Default return value is NULL. */ *mimetype = NULL; /* If there is a mimetype_map provided, we'll first try to look up our file's extension in the map. Failing that, we'll run the heuristic. */ if (mimetype_map) { const char *type_from_map; char *path_ext; /* Can point to physical const memory but only when svn_path_splitext sets it to "". */ svn_path_splitext(NULL, (const char **)&path_ext, file, pool); fileext_tolower(path_ext); if ((type_from_map = svn_hash_gets(mimetype_map, path_ext))) { *mimetype = type_from_map; return SVN_NO_ERROR; } } /* See if this file even exists, and make sure it really is a file. */ SVN_ERR(svn_io_check_path(file, &kind, pool)); if (kind != svn_node_file) return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL, _("Can't detect MIME type of non-file '%s'"), svn_dirent_local_style(file, pool)); SVN_ERR(svn_io_file_open(&fh, file, APR_READ, 0, pool)); /* Read a block of data from FILE. */ err = svn_io_file_read(fh, block, &amt_read, pool); if (err && ! APR_STATUS_IS_EOF(err->apr_err)) return err; svn_error_clear(err); /* Now close the file. No use keeping it open any more. */ SVN_ERR(svn_io_file_close(fh, pool)); if (svn_io_is_binary_data(block, amt_read)) *mimetype = generic_binary; return SVN_NO_ERROR; } svn_boolean_t svn_io_is_binary_data(const void *data, apr_size_t len) { const unsigned char *buf = data; if (len == 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF) { /* This is an empty UTF-8 file which only contains the UTF-8 BOM. * Treat it as plain text. */ return FALSE; } /* Right now, this function is going to be really stupid. It's going to examine the block of data, and make sure that 15% of the bytes are such that their value is in the ranges 0x07-0x0D or 0x20-0x7F, and that none of those bytes is 0x00. If those criteria are not met, we're calling it binary. NOTE: Originally, I intended to target 85% of the bytes being in the specified ranges, but I flubbed the condition. At any rate, folks aren't complaining, so I'm not sure that it's worth adjusting this retroactively now. --cmpilato */ if (len > 0) { apr_size_t i; apr_size_t binary_count = 0; /* Run through the data we've read, counting the 'binary-ish' bytes. HINT: If we see a 0x00 byte, we'll set our count to its max and stop reading the file. */ for (i = 0; i < len; i++) { if (buf[i] == 0) { binary_count = len; break; } if ((buf[i] < 0x07) || ((buf[i] > 0x0D) && (buf[i] < 0x20)) || (buf[i] > 0x7F)) { binary_count++; } } return (((binary_count * 1000) / len) > 850); } return FALSE; } svn_error_t * svn_io_detect_mimetype(const char **mimetype, const char *file, apr_pool_t *pool) { return svn_io_detect_mimetype2(mimetype, file, NULL, pool); } svn_error_t * svn_io_file_open(apr_file_t **new_file, const char *fname, apr_int32_t flag, apr_fileperms_t perm, apr_pool_t *pool) { const char *fname_apr; apr_status_t status; SVN_ERR(cstring_from_utf8(&fname_apr, fname, pool)); status = file_open(new_file, fname_apr, flag | APR_BINARY, perm, TRUE, pool); if (status) return svn_error_wrap_apr(status, _("Can't open file '%s'"), svn_dirent_local_style(fname, pool)); else return SVN_NO_ERROR; } static APR_INLINE svn_error_t * do_io_file_wrapper_cleanup(apr_file_t *file, apr_status_t status, const char *msg, const char *msg_no_name, apr_pool_t *pool) { const char *name; svn_error_t *err; if (! status) return SVN_NO_ERROR; err = svn_io_file_name_get(&name, file, pool); if (err) name = NULL; svn_error_clear(err); /* ### Issue #3014: Return a specific error for broken pipes, * ### with a single element in the error chain. */ if (SVN__APR_STATUS_IS_EPIPE(status)) return svn_error_create(SVN_ERR_IO_PIPE_WRITE_ERROR, NULL, NULL); if (name) return svn_error_wrap_apr(status, _(msg), try_utf8_from_internal_style(name, pool)); else return svn_error_wrap_apr(status, "%s", _(msg_no_name)); } svn_error_t * svn_io_file_close(apr_file_t *file, apr_pool_t *pool) { return do_io_file_wrapper_cleanup(file, apr_file_close(file), N_("Can't close file '%s'"), N_("Can't close stream"), pool); } svn_error_t * svn_io_file_getc(char *ch, apr_file_t *file, apr_pool_t *pool) { return do_io_file_wrapper_cleanup(file, apr_file_getc(ch, file), N_("Can't read file '%s'"), N_("Can't read stream"), pool); } svn_error_t * svn_io_file_putc(char ch, apr_file_t *file, apr_pool_t *pool) { return do_io_file_wrapper_cleanup(file, apr_file_putc(ch, file), N_("Can't write file '%s'"), N_("Can't write stream"), pool); } svn_error_t * svn_io_file_info_get(apr_finfo_t *finfo, apr_int32_t wanted, apr_file_t *file, apr_pool_t *pool) { /* Quoting APR: On NT this request is incredibly expensive, but accurate. */ wanted &= ~SVN__APR_FINFO_MASK_OUT; return do_io_file_wrapper_cleanup( file, apr_file_info_get(finfo, wanted, file), N_("Can't get attribute information from file '%s'"), N_("Can't get attribute information from stream"), pool); } svn_error_t * svn_io_file_read(apr_file_t *file, void *buf, apr_size_t *nbytes, apr_pool_t *pool) { return do_io_file_wrapper_cleanup(file, apr_file_read(file, buf, nbytes), N_("Can't read file '%s'"), N_("Can't read stream"), pool); } svn_error_t * svn_io_file_read_full2(apr_file_t *file, void *buf, apr_size_t nbytes, apr_size_t *bytes_read, svn_boolean_t *hit_eof, apr_pool_t *pool) { apr_status_t status = apr_file_read_full(file, buf, nbytes, bytes_read); if (hit_eof) { if (APR_STATUS_IS_EOF(status)) { *hit_eof = TRUE; return SVN_NO_ERROR; } else *hit_eof = FALSE; } return do_io_file_wrapper_cleanup(file, status, N_("Can't read file '%s'"), N_("Can't read stream"), pool); } svn_error_t * svn_io_file_seek(apr_file_t *file, apr_seek_where_t where, apr_off_t *offset, apr_pool_t *pool) { return do_io_file_wrapper_cleanup( file, apr_file_seek(file, where, offset), N_("Can't set position pointer in file '%s'"), N_("Can't set position pointer in stream"), pool); } svn_error_t * svn_io_file_aligned_seek(apr_file_t *file, apr_off_t block_size, apr_off_t *buffer_start, apr_off_t offset, apr_pool_t *scratch_pool) { const apr_size_t apr_default_buffer_size = 4096; apr_size_t file_buffer_size = apr_default_buffer_size; apr_off_t desired_offset = 0; apr_off_t current = 0; apr_off_t aligned_offset = 0; svn_boolean_t fill_buffer = FALSE; /* paranoia check: huge blocks on 32 bit machines may cause overflows */ SVN_ERR_ASSERT(block_size == (apr_size_t)block_size); /* default for invalid block sizes */ if (block_size == 0) block_size = apr_default_buffer_size; file_buffer_size = apr_file_buffer_size_get(file); /* don't try to set a buffer size for non-buffered files! */ if (file_buffer_size == 0) { aligned_offset = offset; } else if (file_buffer_size != (apr_size_t)block_size) { /* FILE has the wrong buffer size. correct it */ char *buffer; file_buffer_size = (apr_size_t)block_size; buffer = apr_palloc(apr_file_pool_get(file), file_buffer_size); apr_file_buffer_set(file, buffer, file_buffer_size); /* seek to the start of the block and cause APR to read 1 block */ aligned_offset = offset - (offset % block_size); fill_buffer = TRUE; } else { aligned_offset = offset - (offset % file_buffer_size); /* We have no way to determine the block start of an APR file. Furthermore, we don't want to throw away the current buffer contents. Thus, we re-align the buffer only if the CURRENT offset definitely lies outside the desired, aligned buffer. This covers the typical case of linear reads getting very close to OFFSET but reading the previous / following block. Note that ALIGNED_OFFSET may still be within the current buffer and no I/O will actually happen in the FILL_BUFFER section below. */ SVN_ERR(svn_io_file_seek(file, APR_CUR, ¤t, scratch_pool)); fill_buffer = aligned_offset + file_buffer_size <= current || current <= aligned_offset; } if (fill_buffer) { char dummy; apr_status_t status; /* seek to the start of the block and cause APR to read 1 block */ SVN_ERR(svn_io_file_seek(file, APR_SET, &aligned_offset, scratch_pool)); status = apr_file_getc(&dummy, file); /* read may fail if we seek to or behind EOF. That's ok then. */ if (status != APR_SUCCESS && !APR_STATUS_IS_EOF(status)) return do_io_file_wrapper_cleanup(file, status, N_("Can't read file '%s'"), N_("Can't read stream"), scratch_pool); } /* finally, seek to the OFFSET the caller wants */ desired_offset = offset; SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, scratch_pool)); if (desired_offset != offset) return do_io_file_wrapper_cleanup(file, APR_EOF, N_("Can't seek in file '%s'"), N_("Can't seek in stream"), scratch_pool); /* return the buffer start that we (probably) enforced */ if (buffer_start) *buffer_start = aligned_offset; return SVN_NO_ERROR; } svn_error_t * svn_io_file_write(apr_file_t *file, const void *buf, apr_size_t *nbytes, apr_pool_t *pool) { return svn_error_trace(do_io_file_wrapper_cleanup( file, apr_file_write(file, buf, nbytes), N_("Can't write to file '%s'"), N_("Can't write to stream"), pool)); } svn_error_t * svn_io_file_flush(apr_file_t *file, apr_pool_t *scratch_pool) { return svn_error_trace(do_io_file_wrapper_cleanup( file, apr_file_flush(file), N_("Can't flush file '%s'"), N_("Can't flush stream"), scratch_pool)); } svn_error_t * svn_io_file_write_full(apr_file_t *file, const void *buf, apr_size_t nbytes, apr_size_t *bytes_written, apr_pool_t *pool) { /* We cannot simply call apr_file_write_full on Win32 as it may fail for larger values of NBYTES. In that case, we have to emulate the "_full" part here. Thus, always call apr_file_write directly on Win32 as this minimizes overhead for small data buffers. */ #ifdef WIN32 #define MAXBUFSIZE 30*1024 apr_size_t bw = nbytes; apr_size_t to_write = nbytes; /* try a simple "write everything at once" first */ apr_status_t rv = apr_file_write(file, buf, &bw); buf = (char *)buf + bw; to_write -= bw; /* if the OS cannot handle that, use smaller chunks */ if (rv == APR_FROM_OS_ERROR(ERROR_NOT_ENOUGH_MEMORY) && nbytes > MAXBUFSIZE) { do { bw = to_write > MAXBUFSIZE ? MAXBUFSIZE : to_write; rv = apr_file_write(file, buf, &bw); buf = (char *)buf + bw; to_write -= bw; } while (rv == APR_SUCCESS && to_write > 0); } /* bytes_written may actually be NULL */ if (bytes_written) *bytes_written = nbytes - to_write; #undef MAXBUFSIZE #else apr_status_t rv = apr_file_write_full(file, buf, nbytes, bytes_written); #endif return svn_error_trace(do_io_file_wrapper_cleanup( file, rv, N_("Can't write to file '%s'"), N_("Can't write to stream"), pool)); } svn_error_t * svn_io_write_unique(const char **tmp_path, const char *dirpath, const void *buf, apr_size_t nbytes, svn_io_file_del_t delete_when, apr_pool_t *pool) { apr_file_t *new_file; svn_error_t *err; SVN_ERR(svn_io_open_unique_file3(&new_file, tmp_path, dirpath, delete_when, pool, pool)); err = svn_io_file_write_full(new_file, buf, nbytes, NULL, pool); if (!err) { /* svn_io_file_flush_to_disk() can be very expensive, so use the cheaper standard flush if the file is created as temporary file anyway */ if (delete_when == svn_io_file_del_none) err = svn_io_file_flush_to_disk(new_file, pool); else err = svn_io_file_flush(new_file, pool); } return svn_error_trace( svn_error_compose_create(err, svn_io_file_close(new_file, pool))); } svn_error_t * svn_io_write_atomic(const char *final_path, const void *buf, apr_size_t nbytes, const char *copy_perms_path, apr_pool_t *scratch_pool) { apr_file_t *tmp_file; const char *tmp_path; svn_error_t *err; const char *dirname = svn_dirent_dirname(final_path, scratch_pool); SVN_ERR(svn_io_open_unique_file3(&tmp_file, &tmp_path, dirname, svn_io_file_del_none, scratch_pool, scratch_pool)); err = svn_io_file_write_full(tmp_file, buf, nbytes, NULL, scratch_pool); if (!err) err = svn_io_file_flush_to_disk(tmp_file, scratch_pool); err = svn_error_compose_create(err, svn_io_file_close(tmp_file, scratch_pool)); if (!err && copy_perms_path) err = svn_io_copy_perms(copy_perms_path, tmp_path, scratch_pool); if (!err) err = svn_io_file_rename(tmp_path, final_path, scratch_pool); if (err) { err = svn_error_compose_create(err, svn_io_remove_file2(tmp_path, TRUE, scratch_pool)); return svn_error_createf(err->apr_err, err, _("Can't write '%s' atomically"), svn_dirent_local_style(final_path, scratch_pool)); } #ifdef __linux__ { /* Linux has the unusual feature that fsync() on a file is not enough to ensure that a file's directory entries have been flushed to disk; you have to fsync the directory as well. On other operating systems, we'd only be asking for trouble by trying to open and fsync a directory. */ apr_file_t *file; SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT, scratch_pool)); SVN_ERR(svn_io_file_flush_to_disk(file, scratch_pool)); SVN_ERR(svn_io_file_close(file, scratch_pool)); } #endif return SVN_NO_ERROR; } svn_error_t * svn_io_file_trunc(apr_file_t *file, apr_off_t offset, apr_pool_t *pool) { + /* Workaround for yet another APR issue with trunc. + + If the APR file internally is in read mode, the current buffer pointer + will not be clipped to the valid data range. get_file_offset may then + return an invalid position *after* new data was written to it. + + To prevent this, write 1 dummy byte just after the OFFSET at which we + will trunc it. That will force the APR file into write mode + internally and the flush() work-around below becomes affective. */ + apr_off_t position = 0; + + /* A frequent usage is OFFSET==0, in which case we don't need to preserve + any file content or file pointer. */ + if (offset) + { + SVN_ERR(svn_io_file_seek(file, APR_CUR, &position, pool)); + SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, pool)); + } + SVN_ERR(svn_io_file_putc(0, file, pool)); + /* This is a work-around. APR would flush the write buffer _after_ truncating the file causing now invalid buffered data to be written behind OFFSET. */ SVN_ERR(do_io_file_wrapper_cleanup(file, apr_file_flush(file), N_("Can't flush file '%s'"), N_("Can't flush stream"), pool)); - return do_io_file_wrapper_cleanup(file, apr_file_trunc(file, offset), - N_("Can't truncate file '%s'"), - N_("Can't truncate stream"), - pool); + SVN_ERR(do_io_file_wrapper_cleanup(file, apr_file_trunc(file, offset), + N_("Can't truncate file '%s'"), + N_("Can't truncate stream"), + pool)); + + /* Restore original file pointer, if necessary. + It's currently at OFFSET. */ + if (position < offset) + SVN_ERR(svn_io_file_seek(file, APR_SET, &position, pool)); + + return SVN_NO_ERROR; } svn_error_t * svn_io_read_length_line(apr_file_t *file, char *buf, apr_size_t *limit, apr_pool_t *pool) { /* variables */ apr_size_t total_read = 0; svn_boolean_t eof = FALSE; const char *name; svn_error_t *err; apr_size_t buf_size = *limit; while (buf_size > 0) { /* read a fair chunk of data at once. But don't get too ambitious * as that would result in too much waste. Also make sure we can * put a NUL after the last byte read. */ apr_size_t to_read = buf_size < 129 ? buf_size - 1 : 128; apr_size_t bytes_read = 0; char *eol; if (to_read == 0) break; /* read data block (or just a part of it) */ SVN_ERR(svn_io_file_read_full2(file, buf, to_read, &bytes_read, &eof, pool)); /* look or a newline char */ buf[bytes_read] = 0; eol = strchr(buf, '\n'); if (eol) { apr_off_t offset = (eol + 1 - buf) - (apr_off_t)bytes_read; *eol = 0; *limit = total_read + (eol - buf); /* correct the file pointer: * appear as though we just had read the newline char */ SVN_ERR(svn_io_file_seek(file, APR_CUR, &offset, pool)); return SVN_NO_ERROR; } else if (eof) { /* no EOL found but we hit the end of the file. * Generate a nice EOF error object and return it. */ char dummy; SVN_ERR(svn_io_file_getc(&dummy, file, pool)); } /* next data chunk */ buf_size -= bytes_read; buf += bytes_read; total_read += bytes_read; } /* buffer limit has been exceeded without finding the EOL */ err = svn_io_file_name_get(&name, file, pool); if (err) name = NULL; svn_error_clear(err); if (name) return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL, _("Can't read length line in file '%s'"), svn_dirent_local_style(name, pool)); else return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL, _("Can't read length line in stream")); } svn_error_t * svn_io_stat(apr_finfo_t *finfo, const char *fname, apr_int32_t wanted, apr_pool_t *pool) { apr_status_t status; const char *fname_apr; /* APR doesn't like "" directories */ if (fname[0] == '\0') fname = "."; SVN_ERR(cstring_from_utf8(&fname_apr, fname, pool)); /* Quoting APR: On NT this request is incredibly expensive, but accurate. */ wanted &= ~SVN__APR_FINFO_MASK_OUT; status = apr_stat(finfo, fname_apr, wanted, pool); if (status) return svn_error_wrap_apr(status, _("Can't stat '%s'"), svn_dirent_local_style(fname, pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_file_rename(const char *from_path, const char *to_path, apr_pool_t *pool) { apr_status_t status = APR_SUCCESS; const char *from_path_apr, *to_path_apr; SVN_ERR(cstring_from_utf8(&from_path_apr, from_path, pool)); SVN_ERR(cstring_from_utf8(&to_path_apr, to_path, pool)); status = apr_file_rename(from_path_apr, to_path_apr, pool); #if defined(WIN32) || defined(__OS2__) /* If the target file is read only NTFS reports EACCESS and FAT/FAT32 reports EEXIST */ if (APR_STATUS_IS_EACCES(status) || APR_STATUS_IS_EEXIST(status)) { /* Set the destination file writable because Windows will not allow us to rename when to_path is read-only, but will allow renaming when from_path is read only. */ SVN_ERR(svn_io_set_file_read_write(to_path, TRUE, pool)); status = apr_file_rename(from_path_apr, to_path_apr, pool); } WIN32_RETRY_LOOP(status, apr_file_rename(from_path_apr, to_path_apr, pool)); #endif /* WIN32 || __OS2__ */ if (status) return svn_error_wrap_apr(status, _("Can't move '%s' to '%s'"), svn_dirent_local_style(from_path, pool), svn_dirent_local_style(to_path, pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_file_move(const char *from_path, const char *to_path, apr_pool_t *pool) { svn_error_t *err = svn_io_file_rename(from_path, to_path, pool); if (err && APR_STATUS_IS_EXDEV(err->apr_err)) { const char *tmp_to_path; svn_error_clear(err); SVN_ERR(svn_io_open_unique_file3(NULL, &tmp_to_path, svn_dirent_dirname(to_path, pool), svn_io_file_del_none, pool, pool)); err = svn_io_copy_file(from_path, tmp_to_path, TRUE, pool); if (err) goto failed_tmp; err = svn_io_file_rename(tmp_to_path, to_path, pool); if (err) goto failed_tmp; err = svn_io_remove_file2(from_path, FALSE, pool); if (! err) return SVN_NO_ERROR; svn_error_clear(svn_io_remove_file2(to_path, FALSE, pool)); return err; failed_tmp: svn_error_clear(svn_io_remove_file2(tmp_to_path, FALSE, pool)); } return err; } /* Common implementation of svn_io_dir_make and svn_io_dir_make_hidden. HIDDEN determines if the hidden attribute should be set on the newly created directory. */ static svn_error_t * dir_make(const char *path, apr_fileperms_t perm, svn_boolean_t hidden, svn_boolean_t sgid, apr_pool_t *pool) { apr_status_t status; const char *path_apr; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); /* APR doesn't like "" directories */ if (path_apr[0] == '\0') path_apr = "."; #if (APR_OS_DEFAULT & APR_WSTICKY) /* The APR shipped with httpd 2.0.50 contains a bug where APR_OS_DEFAULT encompasses the setuid, setgid, and sticky bits. There is a special case for file creation, but not directory creation, so directories wind up getting created with the sticky bit set. (There is no such thing as a setuid directory, and the setgid bit is apparently ignored at mkdir() time.) If we detect this problem, work around it by unsetting those bits if we are passed APR_OS_DEFAULT. */ if (perm == APR_OS_DEFAULT) perm &= ~(APR_USETID | APR_GSETID | APR_WSTICKY); #endif status = apr_dir_make(path_apr, perm, pool); #ifdef WIN32 /* Don't retry on ERROR_ACCESS_DENIED, as that typically signals a permanent error */ if (status == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION)) WIN32_RETRY_LOOP(status, apr_dir_make(path_apr, perm, pool)); #endif if (status) return svn_error_wrap_apr(status, _("Can't create directory '%s'"), svn_dirent_local_style(path, pool)); #ifdef APR_FILE_ATTR_HIDDEN if (hidden) { #ifndef WIN32 status = apr_file_attrs_set(path_apr, APR_FILE_ATTR_HIDDEN, APR_FILE_ATTR_HIDDEN, pool); if (status) return svn_error_wrap_apr(status, _("Can't hide directory '%s'"), svn_dirent_local_style(path, pool)); #else /* on Windows, use our wrapper so we can also set the FILE_ATTRIBUTE_NOT_CONTENT_INDEXED attribute */ svn_error_t *err = io_win_file_attrs_set(path_apr, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, pool); if (err) return svn_error_createf(err->apr_err, err, _("Can't hide directory '%s'"), svn_dirent_local_style(path, pool)); #endif /* WIN32 */ } #endif /* APR_FILE_ATTR_HIDDEN */ /* Windows does not implement sgid. Skip here because retrieving the file permissions via APR_FINFO_PROT | APR_FINFO_OWNER is documented to be 'incredibly expensive'. */ #ifndef WIN32 if (sgid) { apr_finfo_t finfo; /* Per our contract, don't do error-checking. Some filesystems * don't support the sgid bit, and that's okay. */ status = apr_stat(&finfo, path_apr, APR_FINFO_PROT, pool); if (!status) apr_file_perms_set(path_apr, finfo.protection | APR_GSETID); } #endif return SVN_NO_ERROR; } svn_error_t * svn_io_dir_make(const char *path, apr_fileperms_t perm, apr_pool_t *pool) { return dir_make(path, perm, FALSE, FALSE, pool); } svn_error_t * svn_io_dir_make_hidden(const char *path, apr_fileperms_t perm, apr_pool_t *pool) { return dir_make(path, perm, TRUE, FALSE, pool); } svn_error_t * svn_io_dir_make_sgid(const char *path, apr_fileperms_t perm, apr_pool_t *pool) { return dir_make(path, perm, FALSE, TRUE, pool); } svn_error_t * svn_io_dir_open(apr_dir_t **new_dir, const char *dirname, apr_pool_t *pool) { apr_status_t status; const char *dirname_apr; /* APR doesn't like "" directories */ if (dirname[0] == '\0') dirname = "."; SVN_ERR(cstring_from_utf8(&dirname_apr, dirname, pool)); status = apr_dir_open(new_dir, dirname_apr, pool); if (status) return svn_error_wrap_apr(status, _("Can't open directory '%s'"), svn_dirent_local_style(dirname, pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_dir_remove_nonrecursive(const char *dirname, apr_pool_t *pool) { apr_status_t status; const char *dirname_apr; SVN_ERR(cstring_from_utf8(&dirname_apr, dirname, pool)); status = apr_dir_remove(dirname_apr, pool); #ifdef WIN32 { svn_boolean_t retry = TRUE; if (APR_TO_OS_ERROR(status) == ERROR_DIR_NOT_EMPTY) { apr_status_t empty_status = dir_is_empty(dirname_apr, pool); if (APR_STATUS_IS_ENOTEMPTY(empty_status)) retry = FALSE; } if (retry) { WIN32_RETRY_LOOP(status, apr_dir_remove(dirname_apr, pool)); } } #endif if (status) return svn_error_wrap_apr(status, _("Can't remove directory '%s'"), svn_dirent_local_style(dirname, pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_dir_t *thedir, apr_pool_t *pool) { apr_status_t status; status = apr_dir_read(finfo, wanted, thedir); if (status) return svn_error_wrap_apr(status, _("Can't read directory")); /* It would be nice to use entry_name_to_utf8() below, but can we get the dir's path out of an apr_dir_t? I don't see a reliable way to do it. */ if (finfo->fname) SVN_ERR(svn_path_cstring_to_utf8(&finfo->fname, finfo->fname, pool)); if (finfo->name) SVN_ERR(svn_path_cstring_to_utf8(&finfo->name, finfo->name, pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_dir_close(apr_dir_t *thedir) { apr_status_t apr_err = apr_dir_close(thedir); if (apr_err) return svn_error_wrap_apr(apr_err, _("Error closing directory")); return SVN_NO_ERROR; } svn_error_t * svn_io_dir_walk2(const char *dirname, apr_int32_t wanted, svn_io_walk_func_t walk_func, void *walk_baton, apr_pool_t *pool) { apr_status_t apr_err; apr_dir_t *handle; apr_pool_t *subpool; const char *dirname_apr; apr_finfo_t finfo; wanted |= APR_FINFO_TYPE | APR_FINFO_NAME; /* Quoting APR: On NT this request is incredibly expensive, but accurate. */ wanted &= ~SVN__APR_FINFO_MASK_OUT; /* The documentation for apr_dir_read used to state that "." and ".." will be returned as the first two files, but it doesn't work that way in practice, in particular ext3 on Linux-2.6 doesn't follow the rules. For details see http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=56666 If APR ever does implement "dot-first" then it would be possible to remove the svn_io_stat and walk_func calls and use the walk_func inside the loop. Note: apr_stat doesn't handle FINFO_NAME but svn_io_dir_walk is documented to provide it, so we have to do a bit extra. */ SVN_ERR(svn_io_stat(&finfo, dirname, wanted & ~APR_FINFO_NAME, pool)); SVN_ERR(cstring_from_utf8(&finfo.name, svn_dirent_basename(dirname, pool), pool)); finfo.valid |= APR_FINFO_NAME; SVN_ERR((*walk_func)(walk_baton, dirname, &finfo, pool)); SVN_ERR(cstring_from_utf8(&dirname_apr, dirname, pool)); /* APR doesn't like "" directories */ if (dirname_apr[0] == '\0') dirname_apr = "."; apr_err = apr_dir_open(&handle, dirname_apr, pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't open directory '%s'"), svn_dirent_local_style(dirname, pool)); /* iteration subpool */ subpool = svn_pool_create(pool); while (1) { const char *name_utf8; const char *full_path; svn_pool_clear(subpool); apr_err = apr_dir_read(&finfo, wanted, handle); if (APR_STATUS_IS_ENOENT(apr_err)) break; else if (apr_err) { return svn_error_wrap_apr(apr_err, _("Can't read directory entry in '%s'"), svn_dirent_local_style(dirname, pool)); } if (finfo.filetype == APR_DIR) { if (finfo.name[0] == '.' && (finfo.name[1] == '\0' || (finfo.name[1] == '.' && finfo.name[2] == '\0'))) /* skip "." and ".." */ continue; /* some other directory. recurse. it will be passed to the callback inside the recursion. */ SVN_ERR(entry_name_to_utf8(&name_utf8, finfo.name, dirname, subpool)); full_path = svn_dirent_join(dirname, name_utf8, subpool); SVN_ERR(svn_io_dir_walk2(full_path, wanted, walk_func, walk_baton, subpool)); } else if (finfo.filetype == APR_REG || finfo.filetype == APR_LNK) { /* some other directory. pass it to the callback. */ SVN_ERR(entry_name_to_utf8(&name_utf8, finfo.name, dirname, subpool)); full_path = svn_dirent_join(dirname, name_utf8, subpool); SVN_ERR((*walk_func)(walk_baton, full_path, &finfo, subpool)); } /* else: Some other type of file; skip it for now. We've reserved the right to expand our coverage here in the future, though, without revving this API. */ } svn_pool_destroy(subpool); apr_err = apr_dir_close(handle); if (apr_err) return svn_error_wrap_apr(apr_err, _("Error closing directory '%s'"), svn_dirent_local_style(dirname, pool)); return SVN_NO_ERROR; } /** * Determine if a directory is empty or not. * @param Return APR_SUCCESS if the dir is empty, else APR_ENOTEMPTY if not. * @param path The directory. * @param pool Used for temporary allocation. * @remark If path is not a directory, or some other error occurs, * then return the appropriate apr status code. * * (This function is written in APR style, in anticipation of * perhaps someday being moved to APR as 'apr_dir_is_empty'.) */ static apr_status_t dir_is_empty(const char *dir, apr_pool_t *pool) { apr_status_t apr_err; apr_dir_t *dir_handle; apr_finfo_t finfo; apr_status_t retval = APR_SUCCESS; /* APR doesn't like "" directories */ if (dir[0] == '\0') dir = "."; apr_err = apr_dir_open(&dir_handle, dir, pool); if (apr_err != APR_SUCCESS) return apr_err; for (apr_err = apr_dir_read(&finfo, APR_FINFO_NAME, dir_handle); apr_err == APR_SUCCESS; apr_err = apr_dir_read(&finfo, APR_FINFO_NAME, dir_handle)) { /* Ignore entries for this dir and its parent, robustly. (APR promises that they'll come first, so technically this guard could be moved outside the loop. But Ryan Bloom says he doesn't believe it, and I believe him. */ if (! (finfo.name[0] == '.' && (finfo.name[1] == '\0' || (finfo.name[1] == '.' && finfo.name[2] == '\0')))) { retval = APR_ENOTEMPTY; break; } } /* Make sure we broke out of the loop for the right reason. */ if (apr_err && ! APR_STATUS_IS_ENOENT(apr_err)) return apr_err; apr_err = apr_dir_close(dir_handle); if (apr_err != APR_SUCCESS) return apr_err; return retval; } svn_error_t * svn_io_dir_empty(svn_boolean_t *is_empty_p, const char *path, apr_pool_t *pool) { apr_status_t status; const char *path_apr; SVN_ERR(cstring_from_utf8(&path_apr, path, pool)); status = dir_is_empty(path_apr, pool); if (!status) *is_empty_p = TRUE; else if (APR_STATUS_IS_ENOTEMPTY(status)) *is_empty_p = FALSE; else return svn_error_wrap_apr(status, _("Can't check directory '%s'"), svn_dirent_local_style(path, pool)); return SVN_NO_ERROR; } /*** Version/format files ***/ svn_error_t * svn_io_write_version_file(const char *path, int version, apr_pool_t *pool) { const char *path_tmp; const char *format_contents = apr_psprintf(pool, "%d\n", version); SVN_ERR_ASSERT(version >= 0); SVN_ERR(svn_io_write_unique(&path_tmp, svn_dirent_dirname(path, pool), format_contents, strlen(format_contents), svn_io_file_del_none, pool)); #if defined(WIN32) || defined(__OS2__) /* make the destination writable, but only on Windows, because Windows does not let us replace read-only files. */ SVN_ERR(svn_io_set_file_read_write(path, TRUE, pool)); #endif /* WIN32 || __OS2__ */ /* rename the temp file as the real destination */ SVN_ERR(svn_io_file_rename(path_tmp, path, pool)); /* And finally remove the perms to make it read only */ return svn_io_set_file_read_only(path, FALSE, pool); } svn_error_t * svn_io_read_version_file(int *version, const char *path, apr_pool_t *pool) { apr_file_t *format_file; char buf[80]; apr_size_t len; svn_error_t *err; /* Read a chunk of data from PATH */ SVN_ERR(svn_io_file_open(&format_file, path, APR_READ, APR_OS_DEFAULT, pool)); len = sizeof(buf); err = svn_io_file_read(format_file, buf, &len, pool); /* Close the file. */ SVN_ERR(svn_error_compose_create(err, svn_io_file_close(format_file, pool))); /* If there was no data in PATH, return an error. */ if (len == 0) return svn_error_createf(SVN_ERR_STREAM_UNEXPECTED_EOF, NULL, _("Reading '%s'"), svn_dirent_local_style(path, pool)); /* Check that the first line contains only digits. */ { apr_size_t i; for (i = 0; i < len; ++i) { char c = buf[i]; if (i > 0 && (c == '\r' || c == '\n')) { buf[i] = '\0'; break; } if (! svn_ctype_isdigit(c)) return svn_error_createf (SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL, _("First line of '%s' contains non-digit"), svn_dirent_local_style(path, pool)); } } /* Convert to integer. */ SVN_ERR(svn_cstring_atoi(version, buf)); return SVN_NO_ERROR; } /* Do a byte-for-byte comparison of FILE1 and FILE2. */ static svn_error_t * contents_identical_p(svn_boolean_t *identical_p, const char *file1, const char *file2, apr_pool_t *pool) { svn_error_t *err; apr_size_t bytes_read1, bytes_read2; char *buf1 = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE); char *buf2 = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE); apr_file_t *file1_h; apr_file_t *file2_h; svn_boolean_t eof1 = FALSE; svn_boolean_t eof2 = FALSE; SVN_ERR(svn_io_file_open(&file1_h, file1, APR_READ, APR_OS_DEFAULT, pool)); err = svn_io_file_open(&file2_h, file2, APR_READ, APR_OS_DEFAULT, pool); if (err) return svn_error_trace( svn_error_compose_create(err, svn_io_file_close(file1_h, pool))); *identical_p = TRUE; /* assume TRUE, until disproved below */ while (!err && !eof1 && !eof2) { err = svn_io_file_read_full2(file1_h, buf1, SVN__STREAM_CHUNK_SIZE, &bytes_read1, &eof1, pool); if (err) break; err = svn_io_file_read_full2(file2_h, buf2, SVN__STREAM_CHUNK_SIZE, &bytes_read2, &eof2, pool); if (err) break; if ((bytes_read1 != bytes_read2) || memcmp(buf1, buf2, bytes_read1)) { *identical_p = FALSE; break; } } /* Special case: one file being a prefix of the other and the shorter * file's size is a multiple of SVN__STREAM_CHUNK_SIZE. */ if (!err && (eof1 != eof2)) *identical_p = FALSE; return svn_error_trace( svn_error_compose_create( err, svn_error_compose_create(svn_io_file_close(file1_h, pool), svn_io_file_close(file2_h, pool)))); } /* Do a byte-for-byte comparison of FILE1, FILE2 and FILE3. */ static svn_error_t * contents_three_identical_p(svn_boolean_t *identical_p12, svn_boolean_t *identical_p23, svn_boolean_t *identical_p13, const char *file1, const char *file2, const char *file3, apr_pool_t *scratch_pool) { svn_error_t *err; char *buf1 = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE); char *buf2 = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE); char *buf3 = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE); apr_file_t *file1_h; apr_file_t *file2_h; apr_file_t *file3_h; svn_boolean_t eof1 = FALSE; svn_boolean_t eof2 = FALSE; svn_boolean_t eof3 = FALSE; SVN_ERR(svn_io_file_open(&file1_h, file1, APR_READ, APR_OS_DEFAULT, scratch_pool)); err = svn_io_file_open(&file2_h, file2, APR_READ, APR_OS_DEFAULT, scratch_pool); if (err) return svn_error_trace( svn_error_compose_create(err, svn_io_file_close(file1_h, scratch_pool))); err = svn_io_file_open(&file3_h, file3, APR_READ, APR_OS_DEFAULT, scratch_pool); if (err) return svn_error_trace( svn_error_compose_create( err, svn_error_compose_create(svn_io_file_close(file1_h, scratch_pool), svn_io_file_close(file2_h, scratch_pool)))); /* assume TRUE, until disproved below */ *identical_p12 = *identical_p23 = *identical_p13 = TRUE; /* We need to read as long as no error occurs, and as long as one of the * flags could still change due to a read operation */ while (!err && ((*identical_p12 && !eof1 && !eof2) || (*identical_p23 && !eof2 && !eof3) || (*identical_p13 && !eof1 && !eof3))) { apr_size_t bytes_read1, bytes_read2, bytes_read3; svn_boolean_t read_1, read_2, read_3; read_1 = read_2 = read_3 = FALSE; /* As long as a file is not at the end yet, and it is still * potentially identical to another file, we read the next chunk.*/ if (!eof1 && (*identical_p12 || *identical_p13)) { err = svn_io_file_read_full2(file1_h, buf1, SVN__STREAM_CHUNK_SIZE, &bytes_read1, &eof1, scratch_pool); if (err) break; read_1 = TRUE; } if (!eof2 && (*identical_p12 || *identical_p23)) { err = svn_io_file_read_full2(file2_h, buf2, SVN__STREAM_CHUNK_SIZE, &bytes_read2, &eof2, scratch_pool); if (err) break; read_2 = TRUE; } if (!eof3 && (*identical_p13 || *identical_p23)) { err = svn_io_file_read_full2(file3_h, buf3, SVN__STREAM_CHUNK_SIZE, &bytes_read3, &eof3, scratch_pool); if (err) break; read_3 = TRUE; } /* If the files are still marked identical, and at least one of them * is not at the end of file, we check whether they differ, and set * their flag to false then. */ if (*identical_p12 && (read_1 || read_2) && ((eof1 != eof2) || (bytes_read1 != bytes_read2) || memcmp(buf1, buf2, bytes_read1))) { *identical_p12 = FALSE; } if (*identical_p23 && (read_2 || read_3) && ((eof2 != eof3) || (bytes_read2 != bytes_read3) || memcmp(buf2, buf3, bytes_read2))) { *identical_p23 = FALSE; } if (*identical_p13 && (read_1 || read_3) && ((eof1 != eof3) || (bytes_read1 != bytes_read3) || memcmp(buf1, buf3, bytes_read3))) { *identical_p13 = FALSE; } } return svn_error_trace( svn_error_compose_create( err, svn_error_compose_create( svn_io_file_close(file1_h, scratch_pool), svn_error_compose_create( svn_io_file_close(file2_h, scratch_pool), svn_io_file_close(file3_h, scratch_pool))))); } svn_error_t * svn_io_files_contents_same_p(svn_boolean_t *same, const char *file1, const char *file2, apr_pool_t *pool) { svn_boolean_t q; SVN_ERR(svn_io_filesizes_different_p(&q, file1, file2, pool)); if (q) { *same = FALSE; return SVN_NO_ERROR; } SVN_ERR(contents_identical_p(&q, file1, file2, pool)); if (q) *same = TRUE; else *same = FALSE; return SVN_NO_ERROR; } svn_error_t * svn_io_files_contents_three_same_p(svn_boolean_t *same12, svn_boolean_t *same23, svn_boolean_t *same13, const char *file1, const char *file2, const char *file3, apr_pool_t *scratch_pool) { svn_boolean_t diff_size12, diff_size23, diff_size13; SVN_ERR(svn_io_filesizes_three_different_p(&diff_size12, &diff_size23, &diff_size13, file1, file2, file3, scratch_pool)); if (diff_size12 && diff_size23 && diff_size13) { *same12 = *same23 = *same13 = FALSE; } else if (diff_size12 && diff_size23) { *same12 = *same23 = FALSE; SVN_ERR(contents_identical_p(same13, file1, file3, scratch_pool)); } else if (diff_size23 && diff_size13) { *same23 = *same13 = FALSE; SVN_ERR(contents_identical_p(same12, file1, file2, scratch_pool)); } else if (diff_size12 && diff_size13) { *same12 = *same13 = FALSE; SVN_ERR(contents_identical_p(same23, file2, file3, scratch_pool)); } else { SVN_ERR_ASSERT(!diff_size12 && !diff_size23 && !diff_size13); SVN_ERR(contents_three_identical_p(same12, same23, same13, file1, file2, file3, scratch_pool)); } return SVN_NO_ERROR; } #ifdef WIN32 /* Counter value of file_mktemp request (used in a threadsafe way), to make sure that a single process normally never generates the same tempname twice */ static volatile apr_uint32_t tempname_counter = 0; #endif /* Creates a new temporary file in DIRECTORY with apr flags FLAGS. Set *NEW_FILE to the file handle and *NEW_FILE_NAME to its name. Perform temporary allocations in SCRATCH_POOL and the result in RESULT_POOL. */ static svn_error_t * temp_file_create(apr_file_t **new_file, const char **new_file_name, const char *directory, apr_int32_t flags, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { #ifndef WIN32 const char *templ = svn_dirent_join(directory, "svn-XXXXXX", scratch_pool); const char *templ_apr; apr_status_t status; SVN_ERR(svn_path_cstring_from_utf8(&templ_apr, templ, scratch_pool)); /* ### svn_path_cstring_from_utf8() guarantees to make a copy of the data available in POOL and we need a non-const pointer here, as apr changes the template to return the new filename. */ status = apr_file_mktemp(new_file, (char *)templ_apr, flags, result_pool); if (status) return svn_error_wrap_apr(status, _("Can't create temporary file from " "template '%s'"), templ); /* Translate the returned path back to utf-8 before returning it */ return svn_error_trace(svn_path_cstring_to_utf8(new_file_name, templ_apr, result_pool)); #else /* The Windows implementation of apr_file_mktemp doesn't handle access denied errors correctly. Therefore we implement our own temp file creation function here. */ /* ### Most of this is borrowed from the svn_io_open_uniquely_named(), ### the function we used before. But we try to guess a more unique ### name before trying if it exists. */ /* Offset by some time value and a unique request nr to make the number +- unique for both this process and on the computer */ int baseNr = (GetTickCount() << 11) + 7 * svn_atomic_inc(&tempname_counter) + GetCurrentProcessId(); int i; /* ### Maybe use an iterpool? */ for (i = 0; i <= 99999; i++) { apr_uint32_t unique_nr; const char *unique_name; const char *unique_name_apr; apr_file_t *try_file; apr_status_t apr_err; /* Generate a number that should be unique for this application and usually for the entire computer to reduce the number of cycles through this loop. (A bit of calculation is much cheaper then disk io) */ unique_nr = baseNr + 3 * i; unique_name = svn_dirent_join(directory, apr_psprintf(scratch_pool, "svn-%X", unique_nr), scratch_pool); SVN_ERR(cstring_from_utf8(&unique_name_apr, unique_name, scratch_pool)); apr_err = file_open(&try_file, unique_name_apr, flags, APR_OS_DEFAULT, FALSE, scratch_pool); if (APR_STATUS_IS_EEXIST(apr_err)) continue; else if (apr_err) { /* On Win32, CreateFile fails with an "Access Denied" error code, rather than "File Already Exists", if the colliding name belongs to a directory. */ if (APR_STATUS_IS_EACCES(apr_err)) { apr_finfo_t finfo; apr_status_t apr_err_2 = apr_stat(&finfo, unique_name_apr, APR_FINFO_TYPE, scratch_pool); if (!apr_err_2 && finfo.filetype == APR_DIR) continue; apr_err_2 = APR_TO_OS_ERROR(apr_err); if (apr_err_2 == ERROR_ACCESS_DENIED || apr_err_2 == ERROR_SHARING_VIOLATION) { /* The file is in use by another process or is hidden; create a new name, but don't do this 99999 times in case the folder is not writable */ i += 797; continue; } /* Else fall through and return the original error. */ } return svn_error_wrap_apr(apr_err, _("Can't open '%s'"), svn_dirent_local_style(unique_name, scratch_pool)); } else { /* Move file to the right pool */ apr_err = apr_file_setaside(new_file, try_file, result_pool); if (apr_err) return svn_error_wrap_apr(apr_err, _("Can't set aside '%s'"), svn_dirent_local_style(unique_name, scratch_pool)); *new_file_name = apr_pstrdup(result_pool, unique_name); return SVN_NO_ERROR; } } return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED, NULL, _("Unable to make name in '%s'"), svn_dirent_local_style(directory, scratch_pool)); #endif } /* Wrapper for apr_file_name_get(), passing out a UTF8-encoded filename. */ svn_error_t * svn_io_file_name_get(const char **filename, apr_file_t *file, apr_pool_t *pool) { const char *fname_apr; apr_status_t status; status = apr_file_name_get(&fname_apr, file); if (status) return svn_error_wrap_apr(status, _("Can't get file name")); if (fname_apr) SVN_ERR(svn_path_cstring_to_utf8(filename, fname_apr, pool)); else *filename = NULL; return SVN_NO_ERROR; } svn_error_t * svn_io_open_unique_file3(apr_file_t **file, const char **unique_path, const char *dirpath, svn_io_file_del_t delete_when, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { apr_file_t *tempfile; const char *tempname; struct temp_file_cleanup_s *baton = NULL; apr_int32_t flags = (APR_READ | APR_WRITE | APR_CREATE | APR_EXCL | APR_BUFFERED | APR_BINARY); #if !defined(WIN32) && !defined(__OS2__) apr_fileperms_t perms; svn_boolean_t using_system_temp_dir = FALSE; #endif SVN_ERR_ASSERT(file || unique_path); if (file) *file = NULL; if (unique_path) *unique_path = NULL; if (dirpath == NULL) { #if !defined(WIN32) && !defined(__OS2__) using_system_temp_dir = TRUE; #endif SVN_ERR(svn_io_temp_dir(&dirpath, scratch_pool)); } switch (delete_when) { case svn_io_file_del_on_pool_cleanup: baton = apr_palloc(result_pool, sizeof(*baton)); baton->pool = result_pool; baton->fname_apr = NULL; /* Because cleanups are run LIFO, we need to make sure to register our cleanup before the apr_file_close cleanup: On Windows, you can't remove an open file. */ apr_pool_cleanup_register(result_pool, baton, temp_file_plain_cleanup_handler, temp_file_child_cleanup_handler); break; case svn_io_file_del_on_close: flags |= APR_DELONCLOSE; break; default: break; } SVN_ERR(temp_file_create(&tempfile, &tempname, dirpath, flags, result_pool, scratch_pool)); #if !defined(WIN32) && !defined(__OS2__) /* apr_file_mktemp() creates files with mode 0600. * This is appropriate if we're using a system temp dir since we don't * want to leak sensitive data into temp files other users can read. * If we're not using a system temp dir we're probably using the * .svn/tmp area and it's likely that the tempfile will end up being * copied or renamed into the working copy. * This would cause working files having mode 0600 while users might * expect to see 0644 or 0664. So we tweak perms of the tempfile in this * case, but only if the umask allows it. */ if (!using_system_temp_dir) { svn_error_t *err; SVN_ERR(merge_default_file_perms(tempfile, &perms, scratch_pool)); err = file_perms_set2(tempfile, perms, scratch_pool); if (err) { if (APR_STATUS_IS_INCOMPLETE(err->apr_err) || APR_STATUS_IS_ENOTIMPL(err->apr_err)) svn_error_clear(err); else { return svn_error_quick_wrapf( err, _("Can't set permissions on '%s'"), svn_dirent_local_style(tempname, scratch_pool)); } } } #endif if (file) *file = tempfile; else SVN_ERR(svn_io_file_close(tempfile, scratch_pool)); if (unique_path) *unique_path = tempname; /* Was allocated in result_pool */ if (baton) SVN_ERR(cstring_from_utf8(&baton->fname_apr, tempname, result_pool)); return SVN_NO_ERROR; } svn_error_t * svn_io_file_readline(apr_file_t *file, svn_stringbuf_t **stringbuf, const char **eol, svn_boolean_t *eof, apr_size_t max_len, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_stringbuf_t *str; const char *eol_str; apr_size_t numbytes; char c; apr_size_t len; svn_boolean_t found_eof; str = svn_stringbuf_create_ensure(80, result_pool); /* Read bytes into STR up to and including, but not storing, * the next EOL sequence. */ eol_str = NULL; numbytes = 1; len = 0; found_eof = FALSE; while (!found_eof) { if (len < max_len) SVN_ERR(svn_io_file_read_full2(file, &c, sizeof(c), &numbytes, &found_eof, scratch_pool)); len++; if (numbytes != 1 || len > max_len) { found_eof = TRUE; break; } if (c == '\n') { eol_str = "\n"; } else if (c == '\r') { eol_str = "\r"; if (!found_eof && len < max_len) { apr_off_t pos; /* Check for "\r\n" by peeking at the next byte. */ pos = 0; SVN_ERR(svn_io_file_seek(file, APR_CUR, &pos, scratch_pool)); SVN_ERR(svn_io_file_read_full2(file, &c, sizeof(c), &numbytes, &found_eof, scratch_pool)); if (numbytes == 1 && c == '\n') { eol_str = "\r\n"; len++; } else { /* Pretend we never peeked. */ SVN_ERR(svn_io_file_seek(file, APR_SET, &pos, scratch_pool)); found_eof = FALSE; numbytes = 1; } } } else svn_stringbuf_appendbyte(str, c); if (eol_str) break; } if (eol) *eol = eol_str; if (eof) *eof = found_eof; *stringbuf = str; return SVN_NO_ERROR; } Index: stable/11/contrib/subversion/subversion/libsvn_subr/version.c =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_subr/version.c (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_subr/version.c (revision 322442) @@ -1,298 +1,298 @@ /* * version.c: library version number and utilities * * ==================================================================== * 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_error.h" #include "svn_version.h" #include "sysinfo.h" #include "svn_private_config.h" #include "private/svn_subr_private.h" const svn_version_t * svn_subr_version(void) { SVN_VERSION_BODY; } svn_boolean_t svn_ver_compatible(const svn_version_t *my_version, const svn_version_t *lib_version) { /* With normal development builds the matching rules are strict, to avoid inadvertantly using the wrong libraries. For backward compatibility testing use --disable-full-version-match to configure 1.7 and then the libraries that get built can be used to replace those in 1.6 or earlier builds. */ #ifndef SVN_DISABLE_FULL_VERSION_MATCH if (lib_version->tag[0] != '\0') /* Development library; require exact match. */ return svn_ver_equal(my_version, lib_version); else if (my_version->tag[0] != '\0') /* Development client; must be newer than the library and have the same major and minor version. */ return (my_version->major == lib_version->major && my_version->minor == lib_version->minor && my_version->patch > lib_version->patch); #endif /* General compatibility rules for released versions. */ return (my_version->major == lib_version->major && my_version->minor <= lib_version->minor); } svn_boolean_t svn_ver_equal(const svn_version_t *my_version, const svn_version_t *lib_version) { return (my_version->major == lib_version->major && my_version->minor == lib_version->minor && my_version->patch == lib_version->patch && 0 == strcmp(my_version->tag, lib_version->tag)); } 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 *)) { svn_error_t *err = SVN_NO_ERROR; int i; for (i = 0; checklist[i].label != NULL; ++i) { const svn_version_t *lib_version = checklist[i].version_query(); if (!comparator(my_version, lib_version)) err = svn_error_createf(SVN_ERR_VERSION_MISMATCH, err, _("Version mismatch in '%s'%s:" " found %d.%d.%d%s," " expected %d.%d.%d%s"), checklist[i].label, comparator == svn_ver_equal ? _(" (expecting equality)") : comparator == svn_ver_compatible ? _(" (expecting compatibility)") : "", lib_version->major, lib_version->minor, lib_version->patch, lib_version->tag, my_version->major, my_version->minor, my_version->patch, my_version->tag); } return err; } struct svn_version_extended_t { const char *build_date; /* Compilation date */ const char *build_time; /* Compilation time */ const char *build_host; /* Build canonical host name */ const char *copyright; /* Copyright notice (localized) */ const char *runtime_host; /* Runtime canonical host name */ const char *runtime_osname; /* Running OS release name */ /* Array of svn_version_ext_linked_lib_t describing dependent libraries. */ const apr_array_header_t *linked_libs; /* Array of svn_version_ext_loaded_lib_t describing loaded shared libraries. */ const apr_array_header_t *loaded_libs; }; const svn_version_extended_t * svn_version_extended(svn_boolean_t verbose, apr_pool_t *pool) { svn_version_extended_t *info = apr_pcalloc(pool, sizeof(*info)); info->build_date = NULL; info->build_time = NULL; info->build_host = SVN_BUILD_HOST; info->copyright = apr_pstrdup - (pool, _("Copyright (C) 2016 The Apache Software Foundation.\n" + (pool, _("Copyright (C) 2017 The Apache Software Foundation.\n" "This software consists of contributions made by many people;\n" "see the NOTICE file for more information.\n" "Subversion is open source software, see " "http://subversion.apache.org/\n")); if (verbose) { info->runtime_host = svn_sysinfo__canonical_host(pool); info->runtime_osname = svn_sysinfo__release_name(pool); info->linked_libs = svn_sysinfo__linked_libs(pool); info->loaded_libs = svn_sysinfo__loaded_libs(pool); } return info; } const char * svn_version_ext_build_date(const svn_version_extended_t *ext_info) { return ext_info->build_date; } const char * svn_version_ext_build_time(const svn_version_extended_t *ext_info) { return ext_info->build_time; } const char * svn_version_ext_build_host(const svn_version_extended_t *ext_info) { return ext_info->build_host; } const char * svn_version_ext_copyright(const svn_version_extended_t *ext_info) { return ext_info->copyright; } const char * svn_version_ext_runtime_host(const svn_version_extended_t *ext_info) { return ext_info->runtime_host; } const char * svn_version_ext_runtime_osname(const svn_version_extended_t *ext_info) { return ext_info->runtime_osname; } const apr_array_header_t * svn_version_ext_linked_libs(const svn_version_extended_t *ext_info) { return ext_info->linked_libs; } const apr_array_header_t * svn_version_ext_loaded_libs(const svn_version_extended_t *ext_info) { return ext_info->loaded_libs; } svn_error_t * svn_version__parse_version_string(svn_version_t **version_p, const char *version_string, apr_pool_t *result_pool) { svn_error_t *err; svn_version_t *version; apr_array_header_t *pieces = svn_cstring_split(version_string, ".", FALSE, result_pool); if ((pieces->nelts < 2) || (pieces->nelts > 3)) return svn_error_createf(SVN_ERR_MALFORMED_VERSION_STRING, NULL, _("Failed to parse version number string '%s'"), version_string); version = apr_pcalloc(result_pool, sizeof(*version)); version->tag = ""; /* Parse the major and minor integers strictly. */ err = svn_cstring_atoi(&(version->major), APR_ARRAY_IDX(pieces, 0, const char *)); if (err) return svn_error_createf(SVN_ERR_MALFORMED_VERSION_STRING, err, _("Failed to parse version number string '%s'"), version_string); err = svn_cstring_atoi(&(version->minor), APR_ARRAY_IDX(pieces, 1, const char *)); if (err) return svn_error_createf(SVN_ERR_MALFORMED_VERSION_STRING, err, _("Failed to parse version number string '%s'"), version_string); /* If there's a third component, we'll parse it, too. But we don't require that it be present. */ if (pieces->nelts == 3) { const char *piece = APR_ARRAY_IDX(pieces, 2, const char *); char *hyphen = strchr(piece, '-'); if (hyphen) { version->tag = apr_pstrdup(result_pool, hyphen + 1); *hyphen = '\0'; } err = svn_cstring_atoi(&(version->patch), piece); if (err) return svn_error_createf(SVN_ERR_MALFORMED_VERSION_STRING, err, _("Failed to parse version number string '%s'" ), version_string); } if (version->major < 0 || version->minor < 0 || version->patch < 0) return svn_error_createf(SVN_ERR_MALFORMED_VERSION_STRING, err, _("Failed to parse version number string '%s'"), version_string); *version_p = version; return SVN_NO_ERROR; } svn_boolean_t svn_version__at_least(svn_version_t *version, int major, int minor, int patch) { /* Compare major versions. */ if (version->major < major) return FALSE; if (version->major > major) return TRUE; /* Major versions are the same. Compare minor versions. */ if (version->minor < minor) return FALSE; if (version->minor > minor) return TRUE; /* Major and minor versions are the same. Compare patch versions. */ if (version->patch < patch) return FALSE; if (version->patch > patch) return TRUE; /* Major, minor, and patch versions are identical matches. But tags in our schema are always used for versions not yet quite at the given patch level. */ if (version->tag && version->tag[0]) return FALSE; return TRUE; } Index: stable/11/contrib/subversion/subversion/libsvn_wc/wc-checks.h =================================================================== --- stable/11/contrib/subversion/subversion/libsvn_wc/wc-checks.h (revision 322441) +++ stable/11/contrib/subversion/subversion/libsvn_wc/wc-checks.h (revision 322442) @@ -1,230 +1,230 @@ -/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h. +/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.7/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 322441) +++ stable/11/contrib/subversion/subversion/libsvn_wc/wc-metadata.h (revision 322442) @@ -1,545 +1,545 @@ -/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h. +/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.7/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 322441) +++ stable/11/contrib/subversion/subversion/libsvn_wc/wc-queries.h (revision 322442) @@ -1,3417 +1,3417 @@ -/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h. +/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.7/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/svnadmin/svnadmin.c =================================================================== --- stable/11/contrib/subversion/subversion/svnadmin/svnadmin.c (revision 322441) +++ stable/11/contrib/subversion/subversion/svnadmin/svnadmin.c (revision 322442) @@ -1,2857 +1,2858 @@ /* * svnadmin.c: Subversion server administration tool main file. * * ==================================================================== * 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 #include #include "svn_hash.h" #include "svn_pools.h" #include "svn_cmdline.h" #include "svn_error.h" #include "svn_opt.h" #include "svn_utf.h" #include "svn_subst.h" #include "svn_dirent_uri.h" #include "svn_path.h" #include "svn_config.h" #include "svn_repos.h" #include "svn_cache_config.h" #include "svn_version.h" #include "svn_props.h" #include "svn_sorts.h" #include "svn_time.h" #include "svn_user.h" #include "svn_xml.h" #include "private/svn_cmdline_private.h" #include "private/svn_opt_private.h" #include "private/svn_sorts_private.h" #include "private/svn_subr_private.h" #include "svn_private_config.h" /*** Code. ***/ /* FSFS format 7's "block-read" feature performs poorly with small caches. * Enable it only if caches above this threshold have been configured. * The current threshold is 64MB. */ #define BLOCK_READ_CACHE_THRESHOLD (0x40 * 0x100000) /* A flag to see if we've been cancelled by the client or not. */ static volatile sig_atomic_t cancelled = FALSE; /* A signal handler to support cancellation. */ static void signal_handler(int signum) { apr_signal(signum, SIG_IGN); cancelled = TRUE; } /* A helper to set up the cancellation signal handlers. */ static void setup_cancellation_signals(void (*handler)(int signum)) { apr_signal(SIGINT, handler); #ifdef SIGBREAK /* SIGBREAK is a Win32 specific signal generated by ctrl-break. */ apr_signal(SIGBREAK, handler); #endif #ifdef SIGHUP apr_signal(SIGHUP, handler); #endif #ifdef SIGTERM apr_signal(SIGTERM, handler); #endif } /* Our cancellation callback. */ static svn_error_t * check_cancel(void *baton) { if (cancelled) return svn_error_create(SVN_ERR_CANCELLED, NULL, _("Caught signal")); else return SVN_NO_ERROR; } /* Custom filesystem warning function. */ static void warning_func(void *baton, svn_error_t *err) { if (! err) return; svn_handle_warning2(stderr, err, "svnadmin: "); } /* Helper to open a repository and set a warning func (so we don't * SEGFAULT when libsvn_fs's default handler gets run). */ static svn_error_t * open_repos(svn_repos_t **repos, const char *path, apr_pool_t *pool) { /* Enable the "block-read" feature (where it applies)? */ svn_boolean_t use_block_read = svn_cache_config_get()->cache_size > BLOCK_READ_CACHE_THRESHOLD; /* construct FS configuration parameters: enable caches for r/o data */ apr_hash_t *fs_config = apr_hash_make(pool); svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS, "1"); svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS, "1"); svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, "2"); svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS, svn_uuid_generate(pool)); svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ, use_block_read ? "1" : "0"); /* now, open the requested repository */ SVN_ERR(svn_repos_open3(repos, path, fs_config, pool, pool)); svn_fs_set_warning_func(svn_repos_fs(*repos), warning_func, NULL); return SVN_NO_ERROR; } /* Version compatibility check */ static svn_error_t * check_lib_versions(void) { static const svn_version_checklist_t checklist[] = { { "svn_subr", svn_subr_version }, { "svn_repos", svn_repos_version }, { "svn_fs", svn_fs_version }, { "svn_delta", svn_delta_version }, { NULL, NULL } }; SVN_VERSION_DEFINE(my_version); return svn_ver_check_list2(&my_version, checklist, svn_ver_equal); } /** Subcommands. **/ static svn_opt_subcommand_t subcommand_crashtest, subcommand_create, subcommand_delrevprop, subcommand_deltify, subcommand_dump, subcommand_freeze, subcommand_help, subcommand_hotcopy, subcommand_info, subcommand_load, subcommand_list_dblogs, subcommand_list_unused_dblogs, subcommand_lock, subcommand_lslocks, subcommand_lstxns, subcommand_pack, subcommand_recover, subcommand_rmlocks, subcommand_rmtxns, subcommand_setlog, subcommand_setrevprop, subcommand_setuuid, subcommand_unlock, subcommand_upgrade, subcommand_verify; enum svnadmin__cmdline_options_t { svnadmin__version = SVN_OPT_FIRST_LONGOPT_ID, svnadmin__incremental, svnadmin__keep_going, svnadmin__deltas, svnadmin__ignore_uuid, svnadmin__force_uuid, svnadmin__fs_type, svnadmin__parent_dir, svnadmin__bdb_txn_nosync, svnadmin__bdb_log_keep, svnadmin__config_dir, svnadmin__bypass_hooks, svnadmin__bypass_prop_validation, svnadmin__ignore_dates, svnadmin__use_pre_commit_hook, svnadmin__use_post_commit_hook, svnadmin__use_pre_revprop_change_hook, svnadmin__use_post_revprop_change_hook, svnadmin__clean_logs, svnadmin__wait, svnadmin__pre_1_4_compatible, svnadmin__pre_1_5_compatible, svnadmin__pre_1_6_compatible, svnadmin__compatible_version, svnadmin__check_normalization, svnadmin__metadata_only }; /* Option codes and descriptions. * * The entire list must be terminated with an entry of nulls. */ static const apr_getopt_option_t options_table[] = { {"help", 'h', 0, N_("show help on a subcommand")}, {NULL, '?', 0, N_("show help on a subcommand")}, {"version", svnadmin__version, 0, N_("show program version information")}, {"revision", 'r', 1, N_("specify revision number ARG (or X:Y range)")}, {"transaction", 't', 1, N_("specify transaction name ARG")}, {"incremental", svnadmin__incremental, 0, N_("dump or hotcopy incrementally")}, {"deltas", svnadmin__deltas, 0, N_("use deltas in dump output")}, {"bypass-hooks", svnadmin__bypass_hooks, 0, N_("bypass the repository hook system")}, {"bypass-prop-validation", svnadmin__bypass_prop_validation, 0, N_("bypass property validation logic")}, {"ignore-dates", svnadmin__ignore_dates, 0, N_("ignore revision datestamps found in the stream")}, {"quiet", 'q', 0, N_("no progress (only errors to stderr)")}, {"ignore-uuid", svnadmin__ignore_uuid, 0, N_("ignore any repos UUID found in the stream")}, {"force-uuid", svnadmin__force_uuid, 0, N_("set repos UUID to that found in stream, if any")}, {"fs-type", svnadmin__fs_type, 1, N_("type of repository:\n" " 'fsfs' (default), 'bdb' or 'fsx'\n" " CAUTION: FSX is for EXPERIMENTAL use only!")}, {"parent-dir", svnadmin__parent_dir, 1, N_("load at specified directory in repository")}, {"bdb-txn-nosync", svnadmin__bdb_txn_nosync, 0, N_("disable fsync at transaction commit [Berkeley DB]")}, {"bdb-log-keep", svnadmin__bdb_log_keep, 0, N_("disable automatic log file removal [Berkeley DB]")}, {"config-dir", svnadmin__config_dir, 1, N_("read user configuration files from directory ARG")}, {"clean-logs", svnadmin__clean_logs, 0, N_("remove redundant Berkeley DB log files\n" " from source repository [Berkeley DB]")}, {"use-pre-commit-hook", svnadmin__use_pre_commit_hook, 0, N_("call pre-commit hook before committing revisions")}, {"use-post-commit-hook", svnadmin__use_post_commit_hook, 0, N_("call post-commit hook after committing revisions")}, {"use-pre-revprop-change-hook", svnadmin__use_pre_revprop_change_hook, 0, N_("call hook before changing revision property")}, {"use-post-revprop-change-hook", svnadmin__use_post_revprop_change_hook, 0, N_("call hook after changing revision property")}, {"wait", svnadmin__wait, 0, N_("wait instead of exit if the repository is in\n" " use by another process")}, {"pre-1.4-compatible", svnadmin__pre_1_4_compatible, 0, N_("deprecated; see --compatible-version")}, {"pre-1.5-compatible", svnadmin__pre_1_5_compatible, 0, N_("deprecated; see --compatible-version")}, {"pre-1.6-compatible", svnadmin__pre_1_6_compatible, 0, N_("deprecated; see --compatible-version")}, {"keep-going", svnadmin__keep_going, 0, N_("continue verification after detecting a corruption")}, {"memory-cache-size", 'M', 1, N_("size of the extra in-memory cache in MB used to\n" " minimize redundant operations. Default: 16.\n" " [used for FSFS repositories only]")}, {"compatible-version", svnadmin__compatible_version, 1, N_("use repository format compatible with Subversion\n" " version ARG (\"1.5.5\", \"1.7\", etc.)")}, {"file", 'F', 1, N_("read repository paths from file ARG")}, {"check-normalization", svnadmin__check_normalization, 0, N_("report any names within the same directory or\n" " svn:mergeinfo property value that differ only\n" " in character representation, but are otherwise\n" " identical")}, {"metadata-only", svnadmin__metadata_only, 0, N_("verify metadata only (ignored for BDB),\n" " checking against external corruption in\n" " Subversion 1.9+ format repositories.\n")}, {NULL} }; /* Array of available subcommands. * The entire list must be terminated with an entry of nulls. */ static const svn_opt_subcommand_desc2_t cmd_table[] = { {"crashtest", subcommand_crashtest, {0}, N_ ("usage: svnadmin crashtest REPOS_PATH\n\n" "Open the repository at REPOS_PATH, then abort, thus simulating\n" "a process that crashes while holding an open repository handle.\n"), {0} }, {"create", subcommand_create, {0}, N_ ("usage: svnadmin create REPOS_PATH\n\n" "Create a new, empty repository at REPOS_PATH.\n"), {svnadmin__bdb_txn_nosync, svnadmin__bdb_log_keep, svnadmin__config_dir, svnadmin__fs_type, svnadmin__compatible_version, svnadmin__pre_1_4_compatible, svnadmin__pre_1_5_compatible, svnadmin__pre_1_6_compatible } }, {"delrevprop", subcommand_delrevprop, {0}, N_ ("usage: 1. svnadmin delrevprop REPOS_PATH -r REVISION NAME\n" " 2. svnadmin delrevprop REPO_PATH -t TXN NAME\n\n" "1. Delete the property NAME on revision REVISION.\n\n" "Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n" "trigger the revision property-related hooks (for example, if you want\n" "an email notification sent from your post-revprop-change hook).\n\n" "NOTE: Revision properties are not versioned, so this command will\n" "irreversibly destroy the previous value of the property.\n\n" "2. Delete the property NAME on transaction TXN.\n"), {'r', 't', svnadmin__use_pre_revprop_change_hook, svnadmin__use_post_revprop_change_hook} }, {"deltify", subcommand_deltify, {0}, N_ ("usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n\n" "Run over the requested revision range, performing predecessor delti-\n" "fication on the paths changed in those revisions. Deltification in\n" "essence compresses the repository by only storing the differences or\n" "delta from the preceding revision. If no revisions are specified,\n" "this will simply deltify the HEAD revision.\n"), {'r', 'q', 'M'} }, {"dump", subcommand_dump, {0}, N_ ("usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]\n\n" "Dump the contents of filesystem to stdout in a 'dumpfile'\n" "portable format, sending feedback to stderr. Dump revisions\n" "LOWER rev through UPPER rev. If no revisions are given, dump all\n" "revision trees. If only LOWER is given, dump that one revision tree.\n" "If --incremental is passed, the first revision dumped will describe\n" "only the paths changed in that revision; otherwise it will describe\n" "every path present in the repository as of that revision. (In either\n" "case, the second and subsequent revisions, if any, describe only paths\n" "changed in those revisions.)\n"), {'r', svnadmin__incremental, svnadmin__deltas, 'q', 'M'} }, {"freeze", subcommand_freeze, {0}, N_ ("usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n" " 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n\n" "1. Run PROGRAM passing ARGS while holding a write-lock on REPOS_PATH.\n" + " Allows safe use of third-party backup tools on a live repository.\n" "\n" "2. Like 1 except all repositories listed in FILE are locked. The file\n" " format is repository paths separated by newlines. Repositories are\n" " locked in the same order as they are listed in the file.\n"), {'F'} }, {"help", subcommand_help, {"?", "h"}, N_ ("usage: svnadmin help [SUBCOMMAND...]\n\n" "Describe the usage of this program or its subcommands.\n"), {0} }, {"hotcopy", subcommand_hotcopy, {0}, N_ ("usage: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH\n\n" "Make a hot copy of a repository.\n" "If --incremental is passed, data which already exists at the destination\n" "is not copied again. Incremental mode is implemented for FSFS repositories.\n"), {svnadmin__clean_logs, svnadmin__incremental, 'q'} }, {"info", subcommand_info, {0}, N_ ("usage: svnadmin info REPOS_PATH\n\n" "Print information about the repository at REPOS_PATH.\n"), {0} }, {"list-dblogs", subcommand_list_dblogs, {0}, N_ ("usage: svnadmin list-dblogs REPOS_PATH\n\n" "List all Berkeley DB log files.\n\n" "WARNING: Modifying or deleting logfiles which are still in use\n" "will cause your repository to be corrupted.\n"), {0} }, {"list-unused-dblogs", subcommand_list_unused_dblogs, {0}, N_ ("usage: svnadmin list-unused-dblogs REPOS_PATH\n\n" "List unused Berkeley DB log files.\n\n"), {0} }, {"load", subcommand_load, {0}, N_ ("usage: svnadmin load REPOS_PATH\n\n" "Read a 'dumpfile'-formatted stream from stdin, committing\n" "new revisions into the repository's filesystem. If the repository\n" "was previously empty, its UUID will, by default, be changed to the\n" "one specified in the stream. Progress feedback is sent to stdout.\n" "If --revision is specified, limit the loaded revisions to only those\n" "in the dump stream whose revision numbers match the specified range.\n"), {'q', 'r', svnadmin__ignore_uuid, svnadmin__force_uuid, svnadmin__ignore_dates, svnadmin__use_pre_commit_hook, svnadmin__use_post_commit_hook, svnadmin__parent_dir, svnadmin__bypass_prop_validation, 'M'} }, {"lock", subcommand_lock, {0}, N_ ("usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n\n" "Lock PATH by USERNAME setting comments from COMMENT-FILE.\n" "If provided, use TOKEN as lock token. Use --bypass-hooks to avoid\n" "triggering the pre-lock and post-lock hook scripts.\n"), {svnadmin__bypass_hooks} }, {"lslocks", subcommand_lslocks, {0}, N_ ("usage: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n\n" "Print descriptions of all locks on or under PATH-IN-REPOS (which,\n" "if not provided, is the root of the repository).\n"), {0} }, {"lstxns", subcommand_lstxns, {0}, N_ ("usage: svnadmin lstxns REPOS_PATH\n\n" "Print the names of all uncommitted transactions.\n"), {0} }, {"pack", subcommand_pack, {0}, N_ ("usage: svnadmin pack REPOS_PATH\n\n" "Possibly compact the repository into a more efficient storage model.\n" "This may not apply to all repositories, in which case, exit.\n"), {'q', 'M'} }, {"recover", subcommand_recover, {0}, N_ ("usage: svnadmin recover REPOS_PATH\n\n" "Run the recovery procedure on a repository. Do this if you've\n" "been getting errors indicating that recovery ought to be run.\n" "Berkeley DB recovery requires exclusive access and will\n" "exit if the repository is in use by another process.\n"), {svnadmin__wait} }, {"rmlocks", subcommand_rmlocks, {0}, N_ ("usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n\n" "Unconditionally remove lock from each LOCKED_PATH.\n"), {0} }, {"rmtxns", subcommand_rmtxns, {0}, N_ ("usage: svnadmin rmtxns REPOS_PATH TXN_NAME...\n\n" "Delete the named transaction(s).\n"), {'q'} }, {"setlog", subcommand_setlog, {0}, N_ ("usage: svnadmin setlog REPOS_PATH -r REVISION FILE\n\n" "Set the log-message on revision REVISION to the contents of FILE. Use\n" "--bypass-hooks to avoid triggering the revision-property-related hooks\n" "(for example, if you do not want an email notification sent\n" "from your post-revprop-change hook, or because the modification of\n" "revision properties has not been enabled in the pre-revprop-change\n" "hook).\n\n" "NOTE: Revision properties are not versioned, so this command will\n" "overwrite the previous log message.\n"), {'r', svnadmin__bypass_hooks} }, {"setrevprop", subcommand_setrevprop, {0}, N_ ("usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n" " 2. svnadmin setrevprop REPOS_PATH -t TXN NAME FILE\n\n" "1. Set the property NAME on revision REVISION to the contents of FILE.\n\n" "Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n" "trigger the revision property-related hooks (for example, if you want\n" "an email notification sent from your post-revprop-change hook).\n\n" "NOTE: Revision properties are not versioned, so this command will\n" "overwrite the previous value of the property.\n\n" "2. Set the property NAME on transaction TXN to the contents of FILE.\n"), {'r', 't', svnadmin__use_pre_revprop_change_hook, svnadmin__use_post_revprop_change_hook} }, {"setuuid", subcommand_setuuid, {0}, N_ ("usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n\n" "Reset the repository UUID for the repository located at REPOS_PATH. If\n" "NEW_UUID is provided, use that as the new repository UUID; otherwise,\n" "generate a brand new UUID for the repository.\n"), {0} }, {"unlock", subcommand_unlock, {0}, N_ ("usage: svnadmin unlock REPOS_PATH LOCKED_PATH USERNAME TOKEN\n\n" "Unlock LOCKED_PATH (as USERNAME) after verifying that the token\n" "associated with the lock matches TOKEN. Use --bypass-hooks to avoid\n" "triggering the pre-unlock and post-unlock hook scripts.\n"), {svnadmin__bypass_hooks} }, {"upgrade", subcommand_upgrade, {0}, N_ ("usage: svnadmin upgrade REPOS_PATH\n\n" "Upgrade the repository located at REPOS_PATH to the latest supported\n" "schema version.\n\n" "This functionality is provided as a convenience for repository\n" "administrators who wish to make use of new Subversion functionality\n" "without having to undertake a potentially costly full repository dump\n" "and load operation. As such, the upgrade performs only the minimum\n" "amount of work needed to accomplish this while still maintaining the\n" "integrity of the repository. It does not guarantee the most optimized\n" "repository state as a dump and subsequent load would.\n"), {0} }, {"verify", subcommand_verify, {0}, N_ ("usage: svnadmin verify REPOS_PATH\n\n" "Verify the data stored in the repository.\n"), {'t', 'r', 'q', svnadmin__keep_going, 'M', svnadmin__check_normalization, svnadmin__metadata_only} }, { NULL, NULL, {0}, NULL, {0} } }; /* Baton for passing option/argument state to a subcommand function. */ struct svnadmin_opt_state { const char *repository_path; const char *fs_type; /* --fs-type */ svn_version_t *compatible_version; /* --compatible-version */ svn_opt_revision_t start_revision, end_revision; /* -r X[:Y] */ const char *txn_id; /* -t TXN */ svn_boolean_t help; /* --help or -? */ svn_boolean_t version; /* --version */ svn_boolean_t incremental; /* --incremental */ svn_boolean_t use_deltas; /* --deltas */ svn_boolean_t use_pre_commit_hook; /* --use-pre-commit-hook */ svn_boolean_t use_post_commit_hook; /* --use-post-commit-hook */ svn_boolean_t use_pre_revprop_change_hook; /* --use-pre-revprop-change-hook */ svn_boolean_t use_post_revprop_change_hook; /* --use-post-revprop-change-hook */ svn_boolean_t quiet; /* --quiet */ svn_boolean_t bdb_txn_nosync; /* --bdb-txn-nosync */ svn_boolean_t bdb_log_keep; /* --bdb-log-keep */ svn_boolean_t clean_logs; /* --clean-logs */ svn_boolean_t bypass_hooks; /* --bypass-hooks */ svn_boolean_t wait; /* --wait */ svn_boolean_t keep_going; /* --keep-going */ svn_boolean_t check_normalization; /* --check-normalization */ svn_boolean_t metadata_only; /* --metadata-only */ svn_boolean_t bypass_prop_validation; /* --bypass-prop-validation */ svn_boolean_t ignore_dates; /* --ignore-dates */ enum svn_repos_load_uuid uuid_action; /* --ignore-uuid, --force-uuid */ apr_uint64_t memory_cache_size; /* --memory-cache-size M */ const char *parent_dir; /* --parent-dir */ svn_stringbuf_t *filedata; /* --file */ const char *config_dir; /* Overriding Configuration Directory */ }; /* Set *REVNUM to the revision specified by REVISION (or to SVN_INVALID_REVNUM if that has the type 'unspecified'), possibly making use of the YOUNGEST revision number in REPOS. */ static svn_error_t * get_revnum(svn_revnum_t *revnum, const svn_opt_revision_t *revision, svn_revnum_t youngest, svn_repos_t *repos, apr_pool_t *pool) { if (revision->kind == svn_opt_revision_number) *revnum = revision->value.number; else if (revision->kind == svn_opt_revision_head) *revnum = youngest; else if (revision->kind == svn_opt_revision_date) SVN_ERR(svn_repos_dated_revision(revnum, repos, revision->value.date, pool)); else if (revision->kind == svn_opt_revision_unspecified) *revnum = SVN_INVALID_REVNUM; else return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Invalid revision specifier")); if (*revnum > youngest) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Revisions must not be greater than the youngest revision (%ld)"), youngest); return SVN_NO_ERROR; } /* Set *PATH to an internal-style, UTF8-encoded, local dirent path allocated from POOL and parsed from raw command-line argument ARG. */ static svn_error_t * target_arg_to_dirent(const char **dirent, const char *arg, apr_pool_t *pool) { const char *path; SVN_ERR(svn_utf_cstring_to_utf8(&path, arg, pool)); if (svn_path_is_url(path)) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Path '%s' is not a local path"), path); *dirent = svn_dirent_internal_style(path, pool); return SVN_NO_ERROR; } /* Parse the remaining command-line arguments from OS, returning them in a new array *ARGS (allocated from POOL) and optionally verifying that we got the expected number thereof. If MIN_EXPECTED is not negative, return an error if the function would return fewer than MIN_EXPECTED arguments. If MAX_EXPECTED is not negative, return an error if the function would return more than MAX_EXPECTED arguments. As a special case, when MIN_EXPECTED and MAX_EXPECTED are both 0, allow ARGS to be NULL. */ static svn_error_t * parse_args(apr_array_header_t **args, apr_getopt_t *os, int min_expected, int max_expected, apr_pool_t *pool) { int num_args = os ? (os->argc - os->ind) : 0; if (min_expected || max_expected) SVN_ERR_ASSERT(args); if ((min_expected >= 0) && (num_args < min_expected)) return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, _("Not enough arguments")); if ((max_expected >= 0) && (num_args > max_expected)) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, _("Too many arguments")); if (args) { *args = apr_array_make(pool, num_args, sizeof(const char *)); if (num_args) while (os->ind < os->argc) APR_ARRAY_PUSH(*args, const char *) = apr_pstrdup(pool, os->argv[os->ind++]); } return SVN_NO_ERROR; } /* This implements 'svn_error_malfunction_handler_t. */ static svn_error_t * crashtest_malfunction_handler(svn_boolean_t can_return, const char *file, int line, const char *expr) { abort(); return SVN_NO_ERROR; /* Not reached. */ } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_crashtest(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; (void)svn_error_set_malfunction_handler(crashtest_malfunction_handler); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); SVN_ERR(svn_cmdline_printf(pool, _("Successfully opened repository '%s'.\n" "Will now crash to simulate a crashing " "server process.\n"), svn_dirent_local_style(opt_state->repository_path, pool))); SVN_ERR_MALFUNCTION(); /* merely silence a compiler warning (this will never be executed) */ return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_create(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; apr_hash_t *fs_config = apr_hash_make(pool); /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); svn_hash_sets(fs_config, SVN_FS_CONFIG_BDB_TXN_NOSYNC, (opt_state->bdb_txn_nosync ? "1" :"0")); svn_hash_sets(fs_config, SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE, (opt_state->bdb_log_keep ? "0" :"1")); if (opt_state->fs_type) { /* With 1.8 we are announcing that BDB is deprecated. No support * has been removed and it will continue to work until some future * date. The purpose here is to discourage people from creating * new BDB repositories which they will need to dump/load into * FSFS or some new FS type in the future. */ if (0 == strcmp(opt_state->fs_type, SVN_FS_TYPE_BDB)) { SVN_ERR(svn_cmdline_fprintf( stderr, pool, _("%swarning:" " The \"%s\" repository back-end is deprecated," " consider using \"%s\" instead.\n"), "svnadmin: ", SVN_FS_TYPE_BDB, SVN_FS_TYPE_FSFS)); fflush(stderr); } svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, opt_state->fs_type); } if (opt_state->compatible_version) { if (! svn_version__at_least(opt_state->compatible_version, 1, 4, 0)) svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE, "1"); if (! svn_version__at_least(opt_state->compatible_version, 1, 5, 0)) svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_5_COMPATIBLE, "1"); if (! svn_version__at_least(opt_state->compatible_version, 1, 6, 0)) svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE, "1"); if (! svn_version__at_least(opt_state->compatible_version, 1, 8, 0)) svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_8_COMPATIBLE, "1"); /* In 1.9, we figured out that we didn't have to keep extending this madness indefinitely. */ svn_hash_sets(fs_config, SVN_FS_CONFIG_COMPATIBLE_VERSION, apr_psprintf(pool, "%d.%d.%d%s%s", opt_state->compatible_version->major, opt_state->compatible_version->minor, opt_state->compatible_version->patch, opt_state->compatible_version->tag ? "-" : "", opt_state->compatible_version->tag ? opt_state->compatible_version->tag : "")); } if (opt_state->compatible_version) { if (! svn_version__at_least(opt_state->compatible_version, 1, 1, 0) /* ### TODO: this NULL check hard-codes knowledge of the library's default fs-type value */ && (opt_state->fs_type == NULL || !strcmp(opt_state->fs_type, SVN_FS_TYPE_FSFS))) { return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Repositories compatible with 1.0.x must " "use --fs-type=bdb")); } if (! svn_version__at_least(opt_state->compatible_version, 1, 9, 0) && opt_state->fs_type && !strcmp(opt_state->fs_type, SVN_FS_TYPE_FSX)) { return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Repositories compatible with 1.8.x or " "earlier cannot use --fs-type=%s"), SVN_FS_TYPE_FSX); } } SVN_ERR(svn_repos_create(&repos, opt_state->repository_path, NULL, NULL, NULL, fs_config, pool)); svn_fs_set_warning_func(svn_repos_fs(repos), warning_func, NULL); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_deltify(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t start = SVN_INVALID_REVNUM, end = SVN_INVALID_REVNUM; svn_revnum_t youngest, revision; apr_pool_t *subpool = svn_pool_create(pool); /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); /* Find the revision numbers at which to start and end. */ SVN_ERR(get_revnum(&start, &opt_state->start_revision, youngest, repos, pool)); SVN_ERR(get_revnum(&end, &opt_state->end_revision, youngest, repos, pool)); /* Fill in implied revisions if necessary. */ if (start == SVN_INVALID_REVNUM) start = youngest; if (end == SVN_INVALID_REVNUM) end = start; if (start > end) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("First revision cannot be higher than second")); /* Loop over the requested revision range, performing the predecessor deltification on paths changed in each. */ for (revision = start; revision <= end; revision++) { svn_pool_clear(subpool); SVN_ERR(check_cancel(NULL)); if (! opt_state->quiet) SVN_ERR(svn_cmdline_printf(subpool, _("Deltifying revision %ld..."), revision)); SVN_ERR(svn_fs_deltify_revision(fs, revision, subpool)); if (! opt_state->quiet) SVN_ERR(svn_cmdline_printf(subpool, _("done.\n"))); } svn_pool_destroy(subpool); return SVN_NO_ERROR; } /* Structure for errors encountered during 'svnadmin verify --keep-going'. */ struct verification_error { svn_revnum_t rev; svn_error_t *err; }; /* Pool cleanup function to clear an svn_error_t *. */ static apr_status_t err_cleanup(void *data) { svn_error_t *err = data; svn_error_clear(err); return APR_SUCCESS; } struct repos_verify_callback_baton { /* Should we continue after receiving a first verification error? */ svn_boolean_t keep_going; /* List of errors encountered during 'svnadmin verify --keep-going'. */ apr_array_header_t *error_summary; /* Pool for data collected during callback invocations. */ apr_pool_t *result_pool; }; /* Implementation of svn_repos_verify_callback_t to handle errors coming from svn_repos_verify_fs3(). */ static svn_error_t * repos_verify_callback(void *baton, svn_revnum_t revision, svn_error_t *verify_err, apr_pool_t *scratch_pool) { struct repos_verify_callback_baton *b = baton; if (revision == SVN_INVALID_REVNUM) { SVN_ERR(svn_cmdline_fputs(_("* Error verifying repository metadata.\n"), stderr, scratch_pool)); } else { SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, _("* Error verifying revision %ld.\n"), revision)); } if (b->keep_going) { struct verification_error *verr; svn_handle_error2(verify_err, stderr, FALSE, "svnadmin: "); /* Remember the error in B->ERROR_SUMMARY. */ verr = apr_palloc(b->result_pool, sizeof(*verr)); verr->rev = revision; verr->err = svn_error_dup(verify_err); apr_pool_cleanup_register(b->result_pool, verr->err, err_cleanup, apr_pool_cleanup_null); APR_ARRAY_PUSH(b->error_summary, struct verification_error *) = verr; return SVN_NO_ERROR; } else return svn_error_trace(svn_error_dup(verify_err)); } /* Implementation of svn_repos_notify_func_t to wrap the output to a response stream for svn_repos_dump_fs2(), svn_repos_verify_fs(), svn_repos_hotcopy3() and others. */ static void repos_notify_handler(void *baton, const svn_repos_notify_t *notify, apr_pool_t *scratch_pool) { svn_stream_t *feedback_stream = baton; switch (notify->action) { case svn_repos_notify_warning: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, "WARNING 0x%04x: %s\n", notify->warning, notify->warning_str)); return; case svn_repos_notify_dump_rev_end: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("* Dumped revision %ld.\n"), notify->revision)); return; case svn_repos_notify_verify_rev_end: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("* Verified revision %ld.\n"), notify->revision)); return; case svn_repos_notify_verify_rev_structure: if (notify->revision == SVN_INVALID_REVNUM) svn_error_clear(svn_stream_puts(feedback_stream, _("* Verifying repository metadata ...\n"))); else svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("* Verifying metadata at revision %ld ...\n"), notify->revision)); return; case svn_repos_notify_pack_shard_start: { const char *shardstr = apr_psprintf(scratch_pool, "%" APR_INT64_T_FMT, notify->shard); svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("Packing revisions in shard %s..."), shardstr)); } return; case svn_repos_notify_pack_shard_end: svn_error_clear(svn_stream_puts(feedback_stream, _("done.\n"))); return; case svn_repos_notify_pack_shard_start_revprop: { const char *shardstr = apr_psprintf(scratch_pool, "%" APR_INT64_T_FMT, notify->shard); svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("Packing revprops in shard %s..."), shardstr)); } return; case svn_repos_notify_pack_shard_end_revprop: svn_error_clear(svn_stream_puts(feedback_stream, _("done.\n"))); return; case svn_repos_notify_load_txn_committed: if (notify->old_revision == SVN_INVALID_REVNUM) { svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("\n------- Committed revision %ld >>>\n\n"), notify->new_revision)); } else { svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("\n------- Committed new rev %ld" " (loaded from original rev %ld" ") >>>\n\n"), notify->new_revision, notify->old_revision)); } return; case svn_repos_notify_load_node_start: { switch (notify->node_action) { case svn_node_action_change: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _(" * editing path : %s ..."), notify->path)); break; case svn_node_action_delete: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _(" * deleting path : %s ..."), notify->path)); break; case svn_node_action_add: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _(" * adding path : %s ..."), notify->path)); break; case svn_node_action_replace: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _(" * replacing path : %s ..."), notify->path)); break; } } return; case svn_repos_notify_load_node_done: svn_error_clear(svn_stream_puts(feedback_stream, _(" done.\n"))); return; case svn_repos_notify_load_copied_node: svn_error_clear(svn_stream_puts(feedback_stream, "COPIED...")); return; case svn_repos_notify_load_txn_start: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("<<< Started new transaction, based on " "original revision %ld\n"), notify->old_revision)); return; case svn_repos_notify_load_skipped_rev: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("<<< Skipped original revision %ld\n"), notify->old_revision)); return; case svn_repos_notify_load_normalized_mergeinfo: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _(" removing '\\r' from %s ..."), SVN_PROP_MERGEINFO)); return; case svn_repos_notify_mutex_acquired: /* Enable cancellation signal handlers. */ setup_cancellation_signals(signal_handler); return; case svn_repos_notify_recover_start: svn_error_clear(svn_stream_puts(feedback_stream, _("Repository lock acquired.\n" "Please wait; recovering the" " repository may take some time...\n"))); return; case svn_repos_notify_upgrade_start: svn_error_clear(svn_stream_puts(feedback_stream, _("Repository lock acquired.\n" "Please wait; upgrading the" " repository may take some time...\n"))); return; case svn_repos_notify_pack_revprops: { const char *shardstr = apr_psprintf(scratch_pool, "%" APR_INT64_T_FMT, notify->shard); svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("Packed revision properties in shard %s\n"), shardstr)); return; } case svn_repos_notify_cleanup_revprops: { const char *shardstr = apr_psprintf(scratch_pool, "%" APR_INT64_T_FMT, notify->shard); svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("Removed non-packed revision properties" " in shard %s\n"), shardstr)); return; } case svn_repos_notify_format_bumped: svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("Bumped repository format to %ld\n"), notify->revision)); return; case svn_repos_notify_hotcopy_rev_range: if (notify->start_revision == notify->end_revision) { svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("* Copied revision %ld.\n"), notify->start_revision)); } else { svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool, _("* Copied revisions from %ld to %ld.\n"), notify->start_revision, notify->end_revision)); } default: return; } } /* Baton for recode_write(). */ struct recode_write_baton { apr_pool_t *pool; FILE *out; }; /* This implements the 'svn_write_fn_t' interface. Write DATA to ((struct recode_write_baton *) BATON)->out, in the console encoding, using svn_cmdline_fprintf(). DATA is a UTF8-encoded C string, therefore ignore LEN. ### This recoding mechanism might want to be abstracted into ### svn_io.h or svn_cmdline.h, if it proves useful elsewhere. */ static svn_error_t *recode_write(void *baton, const char *data, apr_size_t *len) { struct recode_write_baton *rwb = baton; svn_pool_clear(rwb->pool); return svn_cmdline_fputs(data, rwb->out, rwb->pool); } /* Create a stream, to write to STD_STREAM, that uses recode_write() to perform UTF-8 to console encoding translation. */ static svn_stream_t * recode_stream_create(FILE *std_stream, apr_pool_t *pool) { struct recode_write_baton *std_stream_rwb = apr_palloc(pool, sizeof(struct recode_write_baton)); svn_stream_t *rw_stream = svn_stream_create(std_stream_rwb, pool); std_stream_rwb->pool = svn_pool_create(pool); std_stream_rwb->out = std_stream; svn_stream_set_write(rw_stream, recode_write); return rw_stream; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_dump(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_stream_t *stdout_stream; svn_revnum_t lower = SVN_INVALID_REVNUM, upper = SVN_INVALID_REVNUM; svn_revnum_t youngest; svn_stream_t *feedback_stream = NULL; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); /* Find the revision numbers at which to start and end. */ SVN_ERR(get_revnum(&lower, &opt_state->start_revision, youngest, repos, pool)); SVN_ERR(get_revnum(&upper, &opt_state->end_revision, youngest, repos, pool)); /* Fill in implied revisions if necessary. */ if (lower == SVN_INVALID_REVNUM) { lower = 0; upper = youngest; } else if (upper == SVN_INVALID_REVNUM) { upper = lower; } if (lower > upper) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("First revision cannot be higher than second")); SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool)); /* Progress feedback goes to STDERR, unless they asked to suppress it. */ if (! opt_state->quiet) feedback_stream = recode_stream_create(stderr, pool); SVN_ERR(svn_repos_dump_fs3(repos, stdout_stream, lower, upper, opt_state->incremental, opt_state->use_deltas, !opt_state->quiet ? repos_notify_handler : NULL, feedback_stream, check_cancel, NULL, pool)); return SVN_NO_ERROR; } struct freeze_baton_t { const char *command; const char **args; int status; }; /* Implements svn_repos_freeze_func_t */ static svn_error_t * freeze_body(void *baton, apr_pool_t *pool) { struct freeze_baton_t *b = baton; apr_status_t apr_err; apr_file_t *infile, *outfile, *errfile; apr_err = apr_file_open_stdin(&infile, pool); if (apr_err) return svn_error_wrap_apr(apr_err, "Can't open stdin"); apr_err = apr_file_open_stdout(&outfile, pool); if (apr_err) return svn_error_wrap_apr(apr_err, "Can't open stdout"); apr_err = apr_file_open_stderr(&errfile, pool); if (apr_err) return svn_error_wrap_apr(apr_err, "Can't open stderr"); SVN_ERR(svn_io_run_cmd(NULL, b->command, b->args, &b->status, NULL, TRUE, infile, outfile, errfile, pool)); return SVN_NO_ERROR; } static svn_error_t * subcommand_freeze(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *paths; apr_array_header_t *args; int i; struct freeze_baton_t b; SVN_ERR(svn_opt_parse_all_args(&args, os, pool)); if (!args->nelts) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, _("No program provided")); if (!opt_state->filedata) { /* One repository on the command line. */ paths = apr_array_make(pool, 1, sizeof(const char *)); APR_ARRAY_PUSH(paths, const char *) = opt_state->repository_path; } else { const char *utf8; /* All repositories in filedata. */ SVN_ERR(svn_utf_cstring_to_utf8(&utf8, opt_state->filedata->data, pool)); paths = svn_cstring_split(utf8, "\r\n", FALSE, pool); } b.command = APR_ARRAY_IDX(args, 0, const char *); b.args = apr_palloc(pool, sizeof(char *) * (args->nelts + 1)); for (i = 0; i < args->nelts; ++i) b.args[i] = APR_ARRAY_IDX(args, i, const char *); b.args[args->nelts] = NULL; SVN_ERR(svn_repos_freeze(paths, freeze_body, &b, pool)); /* Make any non-zero status visible to the user. */ if (b.status) exit(b.status); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_help(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; const char *header = _("general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n" "Subversion repository administration tool.\n" "Type 'svnadmin help ' for help on a specific subcommand.\n" "Type 'svnadmin --version' to see the program version and FS modules.\n" "\n" "Available subcommands:\n"); const char *fs_desc_start = _("The following repository back-end (FS) modules are available:\n\n"); svn_stringbuf_t *version_footer; version_footer = svn_stringbuf_create(fs_desc_start, pool); SVN_ERR(svn_fs_print_modules(version_footer, pool)); SVN_ERR(svn_opt_print_help4(os, "svnadmin", opt_state ? opt_state->version : FALSE, opt_state ? opt_state->quiet : FALSE, /*###opt_state ? opt_state->verbose :*/ FALSE, version_footer->data, header, cmd_table, options_table, NULL, NULL, pool)); return SVN_NO_ERROR; } /* Set *REVNUM to the revision number of a numeric REV, or to SVN_INVALID_REVNUM if REV is unspecified. */ static svn_error_t * optrev_to_revnum(svn_revnum_t *revnum, const svn_opt_revision_t *opt_rev) { if (opt_rev->kind == svn_opt_revision_number) { *revnum = opt_rev->value.number; if (! SVN_IS_VALID_REVNUM(*revnum)) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Invalid revision number (%ld) specified"), *revnum); } else if (opt_rev->kind == svn_opt_revision_unspecified) { *revnum = SVN_INVALID_REVNUM; } else { return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Non-numeric revision specified")); } return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_load(apr_getopt_t *os, void *baton, apr_pool_t *pool) { svn_error_t *err; struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_revnum_t lower = SVN_INVALID_REVNUM, upper = SVN_INVALID_REVNUM; svn_stream_t *stdin_stream; svn_stream_t *feedback_stream = NULL; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); /* Find the revision numbers at which to start and end. We only support a limited set of revision kinds: number and unspecified. */ SVN_ERR(optrev_to_revnum(&lower, &opt_state->start_revision)); SVN_ERR(optrev_to_revnum(&upper, &opt_state->end_revision)); /* Fill in implied revisions if necessary. */ if ((upper == SVN_INVALID_REVNUM) && (lower != SVN_INVALID_REVNUM)) { upper = lower; } else if ((upper != SVN_INVALID_REVNUM) && (lower == SVN_INVALID_REVNUM)) { lower = upper; } /* Ensure correct range ordering. */ if (lower > upper) { return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("First revision cannot be higher than second")); } SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); /* Read the stream from STDIN. Users can redirect a file. */ SVN_ERR(svn_stream_for_stdin(&stdin_stream, pool)); /* Progress feedback goes to STDOUT, unless they asked to suppress it. */ if (! opt_state->quiet) feedback_stream = recode_stream_create(stdout, pool); err = svn_repos_load_fs5(repos, stdin_stream, lower, upper, opt_state->uuid_action, opt_state->parent_dir, opt_state->use_pre_commit_hook, opt_state->use_post_commit_hook, !opt_state->bypass_prop_validation, opt_state->ignore_dates, opt_state->quiet ? NULL : repos_notify_handler, feedback_stream, check_cancel, NULL, pool); if (err && err->apr_err == SVN_ERR_BAD_PROPERTY_VALUE) return svn_error_quick_wrap(err, _("Invalid property value found in " "dumpstream; consider repairing the source " "or using --bypass-prop-validation while " "loading.")); return err; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_lstxns(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; apr_array_header_t *txns; int i; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_fs_list_transactions(&txns, fs, pool)); /* Loop, printing revisions. */ for (i = 0; i < txns->nelts; i++) { SVN_ERR(svn_cmdline_printf(pool, "%s\n", APR_ARRAY_IDX(txns, i, const char *))); } return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_recover(apr_getopt_t *os, void *baton, apr_pool_t *pool) { svn_revnum_t youngest_rev; svn_repos_t *repos; svn_error_t *err; struct svnadmin_opt_state *opt_state = baton; svn_stream_t *feedback_stream = NULL; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(svn_stream_for_stdout(&feedback_stream, pool)); /* Restore default signal handlers until after we have acquired the * exclusive lock so that the user interrupt before we actually * touch the repository. */ setup_cancellation_signals(SIG_DFL); err = svn_repos_recover4(opt_state->repository_path, TRUE, repos_notify_handler, feedback_stream, check_cancel, NULL, pool); if (err) { if (! APR_STATUS_IS_EAGAIN(err->apr_err)) return err; svn_error_clear(err); if (! opt_state->wait) return svn_error_create(SVN_ERR_REPOS_LOCKED, NULL, _("Failed to get exclusive repository " "access; perhaps another process\n" "such as httpd, svnserve or svn " "has it open?")); SVN_ERR(svn_cmdline_printf(pool, _("Waiting on repository lock; perhaps" " another process has it open?\n"))); SVN_ERR(svn_cmdline_fflush(stdout)); SVN_ERR(svn_repos_recover4(opt_state->repository_path, FALSE, repos_notify_handler, feedback_stream, check_cancel, NULL, pool)); } SVN_ERR(svn_cmdline_printf(pool, _("\nRecovery completed.\n"))); /* Since db transactions may have been replayed, it's nice to tell people what the latest revision is. It also proves that the recovery actually worked. */ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); SVN_ERR(svn_fs_youngest_rev(&youngest_rev, svn_repos_fs(repos), pool)); SVN_ERR(svn_cmdline_printf(pool, _("The latest repos revision is %ld.\n"), youngest_rev)); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * list_dblogs(apr_getopt_t *os, void *baton, svn_boolean_t only_unused, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *logfiles; int i; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(svn_repos_db_logfiles(&logfiles, opt_state->repository_path, only_unused, pool)); /* Loop, printing log files. We append the log paths to the repository path, making sure to return everything to the native style before printing. */ for (i = 0; i < logfiles->nelts; i++) { const char *log_utf8; log_utf8 = svn_dirent_join(opt_state->repository_path, APR_ARRAY_IDX(logfiles, i, const char *), pool); log_utf8 = svn_dirent_local_style(log_utf8, pool); SVN_ERR(svn_cmdline_printf(pool, "%s\n", log_utf8)); } return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_list_dblogs(apr_getopt_t *os, void *baton, apr_pool_t *pool) { SVN_ERR(list_dblogs(os, baton, FALSE, pool)); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_list_unused_dblogs(apr_getopt_t *os, void *baton, apr_pool_t *pool) { /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(list_dblogs(os, baton, TRUE, pool)); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_rmtxns(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_fs_txn_t *txn; apr_array_header_t *args; int i; apr_pool_t *subpool = svn_pool_create(pool); SVN_ERR(svn_opt_parse_all_args(&args, os, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); /* All the rest of the arguments are transaction names. */ for (i = 0; i < args->nelts; i++) { const char *txn_name = APR_ARRAY_IDX(args, i, const char *); const char *txn_name_utf8; svn_error_t *err; svn_pool_clear(subpool); SVN_ERR(svn_utf_cstring_to_utf8(&txn_name_utf8, txn_name, subpool)); /* Try to open the txn. If that succeeds, try to abort it. */ err = svn_fs_open_txn(&txn, fs, txn_name_utf8, subpool); if (! err) err = svn_fs_abort_txn(txn, subpool); /* If either the open or the abort of the txn fails because that transaction is dead, just try to purge the thing. Else, there was either an error worth reporting, or not error at all. */ if (err && (err->apr_err == SVN_ERR_FS_TRANSACTION_DEAD)) { svn_error_clear(err); err = svn_fs_purge_txn(fs, txn_name_utf8, subpool); } /* If we had a real from the txn open, abort, or purge, we clear that error and just report to the user that we had an issue with this particular txn. */ if (err) { svn_handle_error2(err, stderr, FALSE /* non-fatal */, "svnadmin: "); svn_error_clear(err); } else if (! opt_state->quiet) { SVN_ERR(svn_cmdline_printf(subpool, _("Transaction '%s' removed.\n"), txn_name)); } } svn_pool_destroy(subpool); return SVN_NO_ERROR; } /* A helper for the 'setrevprop' and 'setlog' commands. Expects OPT_STATE->txn_id, OPT_STATE->use_pre_revprop_change_hook and OPT_STATE->use_post_revprop_change_hook to be set appropriately. If FILENAME is NULL, delete property PROP_NAME. */ static svn_error_t * set_revprop(const char *prop_name, const char *filename, struct svnadmin_opt_state *opt_state, apr_pool_t *pool) { svn_repos_t *repos; svn_string_t *prop_value; if (filename) { svn_stringbuf_t *file_contents; SVN_ERR(svn_stringbuf_from_file2(&file_contents, filename, pool)); prop_value = svn_string_create_empty(pool); prop_value->data = file_contents->data; prop_value->len = file_contents->len; SVN_ERR(svn_subst_translate_string2(&prop_value, NULL, NULL, prop_value, NULL, FALSE, pool, pool)); } else { prop_value = NULL; } /* Open the filesystem */ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); if (opt_state->txn_id) { svn_fs_t *fs = svn_repos_fs(repos); svn_fs_txn_t *txn; SVN_ERR(svn_fs_open_txn(&txn, fs, opt_state->txn_id, pool)); SVN_ERR(svn_fs_change_txn_prop(txn, prop_name, prop_value, pool)); } else SVN_ERR(svn_repos_fs_change_rev_prop4( repos, opt_state->start_revision.value.number, NULL, prop_name, NULL, prop_value, opt_state->use_pre_revprop_change_hook, opt_state->use_post_revprop_change_hook, NULL, NULL, pool)); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_setrevprop(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *args; const char *prop_name, *filename; /* Expect two more arguments: NAME FILE */ SVN_ERR(parse_args(&args, os, 2, 2, pool)); prop_name = APR_ARRAY_IDX(args, 0, const char *); filename = APR_ARRAY_IDX(args, 1, const char *); SVN_ERR(target_arg_to_dirent(&filename, filename, pool)); if (opt_state->txn_id) { if (opt_state->start_revision.kind != svn_opt_revision_unspecified || opt_state->end_revision.kind != svn_opt_revision_unspecified) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("--revision (-r) and --transaction (-t) " "are mutually exclusive")); if (opt_state->use_pre_revprop_change_hook || opt_state->use_post_revprop_change_hook) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Calling hooks is incompatible with " "--transaction (-t)")); } else if (opt_state->start_revision.kind != svn_opt_revision_number) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Missing revision")); else if (opt_state->end_revision.kind != svn_opt_revision_unspecified) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Only one revision allowed")); return set_revprop(prop_name, filename, opt_state, pool); } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_setuuid(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *args; svn_repos_t *repos; svn_fs_t *fs; const char *uuid = NULL; /* Expect zero or one more arguments: [UUID] */ SVN_ERR(parse_args(&args, os, 0, 1, pool)); if (args->nelts == 1) uuid = APR_ARRAY_IDX(args, 0, const char *); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); return svn_fs_set_uuid(fs, uuid, pool); } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_setlog(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *args; const char *filename; /* Expect one more argument: FILE */ SVN_ERR(parse_args(&args, os, 1, 1, pool)); filename = APR_ARRAY_IDX(args, 0, const char *); SVN_ERR(target_arg_to_dirent(&filename, filename, pool)); if (opt_state->start_revision.kind != svn_opt_revision_number) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Missing revision")); else if (opt_state->end_revision.kind != svn_opt_revision_unspecified) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Only one revision allowed")); /* set_revprop() responds only to pre-/post-revprop-change opts. */ if (!opt_state->bypass_hooks) { opt_state->use_pre_revprop_change_hook = TRUE; opt_state->use_post_revprop_change_hook = TRUE; } return set_revprop(SVN_PROP_REVISION_LOG, filename, opt_state, pool); } /* This implements 'svn_opt_subcommand_t'. */ static svn_error_t * subcommand_pack(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_stream_t *feedback_stream = NULL; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); /* Progress feedback goes to STDOUT, unless they asked to suppress it. */ if (! opt_state->quiet) feedback_stream = recode_stream_create(stdout, pool); return svn_error_trace( svn_repos_fs_pack2(repos, !opt_state->quiet ? repos_notify_handler : NULL, feedback_stream, check_cancel, NULL, pool)); } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_verify(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t youngest, lower, upper; svn_stream_t *feedback_stream = NULL; struct repos_verify_callback_baton verify_baton = { 0 }; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); if (opt_state->txn_id && (opt_state->start_revision.kind != svn_opt_revision_unspecified || opt_state->end_revision.kind != svn_opt_revision_unspecified)) { return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("--revision (-r) and --transaction (-t) " "are mutually exclusive")); } SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); /* Usage 2. */ if (opt_state->txn_id) { svn_fs_txn_t *txn; svn_fs_root_t *root; SVN_ERR(svn_fs_open_txn(&txn, fs, opt_state->txn_id, pool)); SVN_ERR(svn_fs_txn_root(&root, txn, pool)); SVN_ERR(svn_fs_verify_root(root, pool)); return SVN_NO_ERROR; } else /* Usage 1. */ ; /* Find the revision numbers at which to start and end. */ SVN_ERR(get_revnum(&lower, &opt_state->start_revision, youngest, repos, pool)); SVN_ERR(get_revnum(&upper, &opt_state->end_revision, youngest, repos, pool)); if (upper == SVN_INVALID_REVNUM) { upper = lower; } if (!opt_state->quiet) feedback_stream = recode_stream_create(stdout, pool); verify_baton.keep_going = opt_state->keep_going; verify_baton.error_summary = apr_array_make(pool, 0, sizeof(struct verification_error *)); verify_baton.result_pool = pool; SVN_ERR(svn_repos_verify_fs3(repos, lower, upper, opt_state->check_normalization, opt_state->metadata_only, !opt_state->quiet ? repos_notify_handler : NULL, feedback_stream, repos_verify_callback, &verify_baton, check_cancel, NULL, pool)); /* Show the --keep-going error summary. */ if (!opt_state->quiet && opt_state->keep_going && verify_baton.error_summary->nelts > 0) { int rev_maxlength; svn_revnum_t end_revnum; apr_pool_t *iterpool; int i; svn_error_clear( svn_stream_puts(feedback_stream, _("\n-----Summary of corrupt revisions-----\n"))); /* The standard column width for the revision number is 6 characters. If the revision number can potentially be larger (i.e. if end_revnum is larger than 1000000), we increase the column width as needed. */ rev_maxlength = 6; end_revnum = APR_ARRAY_IDX(verify_baton.error_summary, verify_baton.error_summary->nelts - 1, struct verification_error *)->rev; while (end_revnum >= 1000000) { rev_maxlength++; end_revnum = end_revnum / 10; } iterpool = svn_pool_create(pool); for (i = 0; i < verify_baton.error_summary->nelts; i++) { struct verification_error *verr; svn_error_t *err; const char *rev_str; svn_pool_clear(iterpool); verr = APR_ARRAY_IDX(verify_baton.error_summary, i, struct verification_error *); if (verr->rev != SVN_INVALID_REVNUM) { rev_str = apr_psprintf(iterpool, "r%ld", verr->rev); rev_str = apr_psprintf(iterpool, "%*s", rev_maxlength, rev_str); for (err = svn_error_purge_tracing(verr->err); err != SVN_NO_ERROR; err = err->child) { char buf[512]; const char *message; message = svn_err_best_message(err, buf, sizeof(buf)); svn_error_clear(svn_stream_printf(feedback_stream, iterpool, "%s: E%06d: %s\n", rev_str, err->apr_err, message)); } } } svn_pool_destroy(iterpool); } if (verify_baton.error_summary->nelts > 0) { return svn_error_createf(SVN_ERR_CL_REPOS_VERIFY_FAILED, NULL, _("Failed to verify repository '%s'"), svn_dirent_local_style( opt_state->repository_path, pool)); } return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ svn_error_t * subcommand_hotcopy(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_stream_t *feedback_stream = NULL; apr_array_header_t *targets; const char *new_repos_path; /* Expect one more argument: NEW_REPOS_PATH */ SVN_ERR(parse_args(&targets, os, 1, 1, pool)); new_repos_path = APR_ARRAY_IDX(targets, 0, const char *); SVN_ERR(target_arg_to_dirent(&new_repos_path, new_repos_path, pool)); /* Progress feedback goes to STDOUT, unless they asked to suppress it. */ if (! opt_state->quiet) feedback_stream = recode_stream_create(stdout, pool); return svn_repos_hotcopy3(opt_state->repository_path, new_repos_path, opt_state->clean_logs, opt_state->incremental, !opt_state->quiet ? repos_notify_handler : NULL, feedback_stream, check_cancel, NULL, pool); } svn_error_t * subcommand_info(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; int fs_format; const char *uuid; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"), svn_dirent_local_style(svn_repos_path(repos, pool), pool))); SVN_ERR(svn_fs_get_uuid(fs, &uuid, pool)); SVN_ERR(svn_cmdline_printf(pool, _("UUID: %s\n"), uuid)); { int repos_format, minor; svn_version_t *repos_version, *fs_version; SVN_ERR(svn_repos_info_format(&repos_format, &repos_version, repos, pool, pool)); SVN_ERR(svn_cmdline_printf(pool, _("Repository Format: %d\n"), repos_format)); SVN_ERR(svn_fs_info_format(&fs_format, &fs_version, fs, pool, pool)); /* fs_format will be printed later. */ SVN_ERR_ASSERT(repos_version->major == SVN_VER_MAJOR); SVN_ERR_ASSERT(fs_version->major == SVN_VER_MAJOR); SVN_ERR_ASSERT(repos_version->patch == 0); SVN_ERR_ASSERT(fs_version->patch == 0); minor = (repos_version->minor > fs_version->minor) ? repos_version->minor : fs_version->minor; SVN_ERR(svn_cmdline_printf(pool, _("Compatible With Version: %d.%d.0\n"), SVN_VER_MAJOR, minor)); } { apr_hash_t *capabilities_set; apr_array_header_t *capabilities; int i; SVN_ERR(svn_repos_capabilities(&capabilities_set, repos, pool, pool)); capabilities = svn_sort__hash(capabilities_set, svn_sort_compare_items_lexically, pool); for (i = 0; i < capabilities->nelts; i++) { svn_sort__item_t *item = &APR_ARRAY_IDX(capabilities, i, svn_sort__item_t); const char *capability = item->key; SVN_ERR(svn_cmdline_printf(pool, _("Repository Capability: %s\n"), capability)); } } { const svn_fs_info_placeholder_t *info; SVN_ERR(svn_fs_info(&info, fs, pool, pool)); SVN_ERR(svn_cmdline_printf(pool, _("Filesystem Type: %s\n"), info->fs_type)); SVN_ERR(svn_cmdline_printf(pool, _("Filesystem Format: %d\n"), fs_format)); if (!strcmp(info->fs_type, SVN_FS_TYPE_FSFS)) { const svn_fs_fsfs_info_t *fsfs_info = (const void *)info; svn_revnum_t youngest; SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); if (fsfs_info->shard_size) SVN_ERR(svn_cmdline_printf(pool, _("FSFS Sharded: yes\n"))); else SVN_ERR(svn_cmdline_printf(pool, _("FSFS Sharded: no\n"))); if (fsfs_info->shard_size) SVN_ERR(svn_cmdline_printf(pool, _("FSFS Shard Size: %d\n"), fsfs_info->shard_size)); /* Print packing statistics, if enabled on the FS. */ if (fsfs_info->shard_size) { const int shard_size = fsfs_info->shard_size; const long shards_packed = fsfs_info->min_unpacked_rev / shard_size; const long shards_full = (youngest + 1) / shard_size; SVN_ERR(svn_cmdline_printf(pool, _("FSFS Shards Packed: %ld/%ld\n"), shards_packed, shards_full)); } if (fsfs_info->log_addressing) SVN_ERR(svn_cmdline_printf(pool, _("FSFS Logical Addressing: yes\n"))); else SVN_ERR(svn_cmdline_printf(pool, _("FSFS Logical Addressing: no\n"))); } } { apr_array_header_t *files; int i; SVN_ERR(svn_fs_info_config_files(&files, fs, pool, pool)); for (i = 0; i < files->nelts; i++) SVN_ERR(svn_cmdline_printf(pool, _("Configuration File: %s\n"), svn_dirent_local_style( APR_ARRAY_IDX(files, i, const char *), pool))); } /* 'svn info' prints an extra newline here, to support multiple targets. We'll do the same. */ SVN_ERR(svn_cmdline_printf(pool, "\n")); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_lock(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_fs_access_t *access; apr_array_header_t *args; const char *username; const char *lock_path; const char *comment_file_name; svn_stringbuf_t *file_contents; const char *lock_path_utf8; svn_lock_t *lock; const char *lock_token = NULL; /* Expect three more arguments: PATH USERNAME COMMENT-FILE */ SVN_ERR(parse_args(&args, os, 3, 4, pool)); lock_path = APR_ARRAY_IDX(args, 0, const char *); username = APR_ARRAY_IDX(args, 1, const char *); comment_file_name = APR_ARRAY_IDX(args, 2, const char *); /* Expect one more optional argument: TOKEN */ if (args->nelts == 4) lock_token = APR_ARRAY_IDX(args, 3, const char *); SVN_ERR(target_arg_to_dirent(&comment_file_name, comment_file_name, pool)); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); /* Create an access context describing the user. */ SVN_ERR(svn_fs_create_access(&access, username, pool)); /* Attach the access context to the filesystem. */ SVN_ERR(svn_fs_set_access(fs, access)); SVN_ERR(svn_stringbuf_from_file2(&file_contents, comment_file_name, pool)); SVN_ERR(svn_utf_cstring_to_utf8(&lock_path_utf8, lock_path, pool)); if (opt_state->bypass_hooks) SVN_ERR(svn_fs_lock(&lock, fs, lock_path_utf8, lock_token, file_contents->data, /* comment */ 0, /* is_dav_comment */ 0, /* no expiration time. */ SVN_INVALID_REVNUM, FALSE, pool)); else SVN_ERR(svn_repos_fs_lock(&lock, repos, lock_path_utf8, lock_token, file_contents->data, /* comment */ 0, /* is_dav_comment */ 0, /* no expiration time. */ SVN_INVALID_REVNUM, FALSE, pool)); SVN_ERR(svn_cmdline_printf(pool, _("'%s' locked by user '%s'.\n"), lock_path, username)); return SVN_NO_ERROR; } static svn_error_t * subcommand_lslocks(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *targets; svn_repos_t *repos; const char *fs_path = "/"; apr_hash_t *locks; apr_hash_index_t *hi; apr_pool_t *iterpool = svn_pool_create(pool); SVN_ERR(svn_opt__args_to_target_array(&targets, os, apr_array_make(pool, 0, sizeof(const char *)), pool)); if (targets->nelts > 1) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, _("Too many arguments given")); if (targets->nelts) fs_path = APR_ARRAY_IDX(targets, 0, const char *); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); /* Fetch all locks on or below the root directory. */ SVN_ERR(svn_repos_fs_get_locks2(&locks, repos, fs_path, svn_depth_infinity, NULL, NULL, pool)); for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi)) { const char *cr_date, *exp_date = ""; const char *path = apr_hash_this_key(hi); svn_lock_t *lock = apr_hash_this_val(hi); int comment_lines = 0; svn_pool_clear(iterpool); SVN_ERR(check_cancel(NULL)); cr_date = svn_time_to_human_cstring(lock->creation_date, iterpool); if (lock->expiration_date) exp_date = svn_time_to_human_cstring(lock->expiration_date, iterpool); if (lock->comment) comment_lines = svn_cstring_count_newlines(lock->comment) + 1; SVN_ERR(svn_cmdline_printf(iterpool, _("Path: %s\n"), path)); SVN_ERR(svn_cmdline_printf(iterpool, _("UUID Token: %s\n"), lock->token)); SVN_ERR(svn_cmdline_printf(iterpool, _("Owner: %s\n"), lock->owner)); SVN_ERR(svn_cmdline_printf(iterpool, _("Created: %s\n"), cr_date)); SVN_ERR(svn_cmdline_printf(iterpool, _("Expires: %s\n"), exp_date)); SVN_ERR(svn_cmdline_printf(iterpool, Q_("Comment (%i line):\n%s\n\n", "Comment (%i lines):\n%s\n\n", comment_lines), comment_lines, lock->comment ? lock->comment : "")); } svn_pool_destroy(iterpool); return SVN_NO_ERROR; } static svn_error_t * subcommand_rmlocks(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_fs_access_t *access; svn_error_t *err; apr_array_header_t *args; int i; const char *username; apr_pool_t *subpool = svn_pool_create(pool); SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); /* svn_fs_unlock() demands that some username be associated with the filesystem, so just use the UID of the person running 'svnadmin'.*/ username = svn_user_get_name(pool); if (! username) username = "administrator"; /* Create an access context describing the current user. */ SVN_ERR(svn_fs_create_access(&access, username, pool)); /* Attach the access context to the filesystem. */ SVN_ERR(svn_fs_set_access(fs, access)); /* Parse out any options. */ SVN_ERR(svn_opt_parse_all_args(&args, os, pool)); /* Our usage requires at least one FS path. */ if (args->nelts == 0) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, _("No paths to unlock provided")); /* All the rest of the arguments are paths from which to remove locks. */ for (i = 0; i < args->nelts; i++) { const char *lock_path = APR_ARRAY_IDX(args, i, const char *); const char *lock_path_utf8; svn_lock_t *lock; SVN_ERR(svn_utf_cstring_to_utf8(&lock_path_utf8, lock_path, subpool)); /* Fetch the path's svn_lock_t. */ err = svn_fs_get_lock(&lock, fs, lock_path_utf8, subpool); if (err) goto move_on; if (! lock) { SVN_ERR(svn_cmdline_printf(subpool, _("Path '%s' isn't locked.\n"), lock_path)); continue; } /* Now forcibly destroy the lock. */ err = svn_fs_unlock(fs, lock_path_utf8, lock->token, 1 /* force */, subpool); if (err) goto move_on; SVN_ERR(svn_cmdline_printf(subpool, _("Removed lock on '%s'.\n"), lock->path)); move_on: if (err) { /* Print the error, but move on to the next lock. */ svn_handle_error2(err, stderr, FALSE /* non-fatal */, "svnadmin: "); svn_error_clear(err); } svn_pool_clear(subpool); } svn_pool_destroy(subpool); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_unlock(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; svn_repos_t *repos; svn_fs_t *fs; svn_fs_access_t *access; apr_array_header_t *args; const char *username; const char *lock_path; const char *lock_path_utf8; const char *lock_token = NULL; /* Expect three more arguments: PATH USERNAME TOKEN */ SVN_ERR(parse_args(&args, os, 3, 3, pool)); lock_path = APR_ARRAY_IDX(args, 0, const char *); username = APR_ARRAY_IDX(args, 1, const char *); lock_token = APR_ARRAY_IDX(args, 2, const char *); /* Open the repos/FS, and associate an access context containing USERNAME. */ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool)); fs = svn_repos_fs(repos); SVN_ERR(svn_fs_create_access(&access, username, pool)); SVN_ERR(svn_fs_set_access(fs, access)); SVN_ERR(svn_utf_cstring_to_utf8(&lock_path_utf8, lock_path, pool)); if (opt_state->bypass_hooks) SVN_ERR(svn_fs_unlock(fs, lock_path_utf8, lock_token, FALSE, pool)); else SVN_ERR(svn_repos_fs_unlock(repos, lock_path_utf8, lock_token, FALSE, pool)); SVN_ERR(svn_cmdline_printf(pool, _("'%s' unlocked by user '%s'.\n"), lock_path, username)); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_upgrade(apr_getopt_t *os, void *baton, apr_pool_t *pool) { svn_error_t *err; struct svnadmin_opt_state *opt_state = baton; svn_stream_t *feedback_stream = NULL; /* Expect no more arguments. */ SVN_ERR(parse_args(NULL, os, 0, 0, pool)); SVN_ERR(svn_stream_for_stdout(&feedback_stream, pool)); /* Restore default signal handlers. */ setup_cancellation_signals(SIG_DFL); err = svn_repos_upgrade2(opt_state->repository_path, TRUE, repos_notify_handler, feedback_stream, pool); if (err) { if (APR_STATUS_IS_EAGAIN(err->apr_err)) { svn_error_clear(err); err = SVN_NO_ERROR; if (! opt_state->wait) return svn_error_create(SVN_ERR_REPOS_LOCKED, NULL, _("Failed to get exclusive repository " "access; perhaps another process\n" "such as httpd, svnserve or svn " "has it open?")); SVN_ERR(svn_cmdline_printf(pool, _("Waiting on repository lock; perhaps" " another process has it open?\n"))); SVN_ERR(svn_cmdline_fflush(stdout)); SVN_ERR(svn_repos_upgrade2(opt_state->repository_path, FALSE, repos_notify_handler, feedback_stream, pool)); } else if (err->apr_err == SVN_ERR_FS_UNSUPPORTED_UPGRADE) { return svn_error_quick_wrap(err, _("Upgrade of this repository's underlying versioned " "filesystem is not supported; consider " "dumping and loading the data elsewhere")); } else if (err->apr_err == SVN_ERR_REPOS_UNSUPPORTED_UPGRADE) { return svn_error_quick_wrap(err, _("Upgrade of this repository is not supported; consider " "dumping and loading the data elsewhere")); } } SVN_ERR(err); SVN_ERR(svn_cmdline_printf(pool, _("\nUpgrade completed.\n"))); return SVN_NO_ERROR; } /* This implements `svn_opt_subcommand_t'. */ static svn_error_t * subcommand_delrevprop(apr_getopt_t *os, void *baton, apr_pool_t *pool) { struct svnadmin_opt_state *opt_state = baton; apr_array_header_t *args; const char *prop_name; /* Expect one more argument: NAME */ SVN_ERR(parse_args(&args, os, 1, 1, pool)); prop_name = APR_ARRAY_IDX(args, 0, const char *); if (opt_state->txn_id) { if (opt_state->start_revision.kind != svn_opt_revision_unspecified || opt_state->end_revision.kind != svn_opt_revision_unspecified) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("--revision (-r) and --transaction (-t) " "are mutually exclusive")); if (opt_state->use_pre_revprop_change_hook || opt_state->use_post_revprop_change_hook) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Calling hooks is incompatible with " "--transaction (-t)")); } else if (opt_state->start_revision.kind != svn_opt_revision_number) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Missing revision")); else if (opt_state->end_revision.kind != svn_opt_revision_unspecified) return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Only one revision allowed")); return set_revprop(prop_name, NULL, opt_state, pool); } /** Main. **/ /* * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error, * either return an error to be displayed, or set *EXIT_CODE to non-zero and * return SVN_NO_ERROR. */ static svn_error_t * sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool) { svn_error_t *err; apr_status_t apr_err; const svn_opt_subcommand_desc2_t *subcommand = NULL; struct svnadmin_opt_state opt_state = { 0 }; apr_getopt_t *os; int opt_id; apr_array_header_t *received_opts; int i; svn_boolean_t dash_F_arg = FALSE; received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int)); /* Check library versions */ SVN_ERR(check_lib_versions()); /* Initialize the FS library. */ SVN_ERR(svn_fs_initialize(pool)); if (argc <= 1) { SVN_ERR(subcommand_help(NULL, NULL, pool)); *exit_code = EXIT_FAILURE; return SVN_NO_ERROR; } /* Initialize opt_state. */ opt_state.start_revision.kind = svn_opt_revision_unspecified; opt_state.end_revision.kind = svn_opt_revision_unspecified; opt_state.memory_cache_size = svn_cache_config_get()->cache_size; /* Parse options. */ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool)); os->interleave = 1; while (1) { const char *opt_arg; const char *utf8_opt_arg; /* Parse the next option. */ apr_err = apr_getopt_long(os, options_table, &opt_id, &opt_arg); if (APR_STATUS_IS_EOF(apr_err)) break; else if (apr_err) { SVN_ERR(subcommand_help(NULL, NULL, pool)); *exit_code = EXIT_FAILURE; return SVN_NO_ERROR; } /* Stash the option code in an array before parsing it. */ APR_ARRAY_PUSH(received_opts, int) = opt_id; switch (opt_id) { case 'r': { if (opt_state.start_revision.kind != svn_opt_revision_unspecified) { return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Multiple revision arguments encountered; " "try '-r N:M' instead of '-r N -r M'")); } if (svn_opt_parse_revision(&(opt_state.start_revision), &(opt_state.end_revision), opt_arg, pool) != 0) { SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Syntax error in revision argument '%s'"), utf8_opt_arg); } } break; case 't': opt_state.txn_id = opt_arg; break; case 'q': opt_state.quiet = TRUE; break; case 'h': case '?': opt_state.help = TRUE; break; case 'M': opt_state.memory_cache_size = 0x100000 * apr_strtoi64(opt_arg, NULL, 0); break; case 'F': SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); SVN_ERR(svn_stringbuf_from_file2(&(opt_state.filedata), utf8_opt_arg, pool)); dash_F_arg = TRUE; case svnadmin__version: opt_state.version = TRUE; break; case svnadmin__incremental: opt_state.incremental = TRUE; break; case svnadmin__deltas: opt_state.use_deltas = TRUE; break; case svnadmin__ignore_uuid: opt_state.uuid_action = svn_repos_load_uuid_ignore; break; case svnadmin__force_uuid: opt_state.uuid_action = svn_repos_load_uuid_force; break; case svnadmin__pre_1_4_compatible: opt_state.compatible_version = apr_pcalloc(pool, sizeof(svn_version_t)); opt_state.compatible_version->major = 1; opt_state.compatible_version->minor = 3; break; case svnadmin__pre_1_5_compatible: opt_state.compatible_version = apr_pcalloc(pool, sizeof(svn_version_t)); opt_state.compatible_version->major = 1; opt_state.compatible_version->minor = 4; break; case svnadmin__pre_1_6_compatible: opt_state.compatible_version = apr_pcalloc(pool, sizeof(svn_version_t)); opt_state.compatible_version->major = 1; opt_state.compatible_version->minor = 5; break; case svnadmin__compatible_version: { svn_version_t latest = { SVN_VER_MAJOR, SVN_VER_MINOR, SVN_VER_PATCH, NULL }; svn_version_t *compatible_version; /* Parse the version string which carries our target compatibility. */ SVN_ERR(svn_version__parse_version_string(&compatible_version, opt_arg, pool)); /* We can't create repository with a version older than 1.0.0. */ if (! svn_version__at_least(compatible_version, 1, 0, 0)) { return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Cannot create pre-1.0-compatible " "repositories")); } /* We can't create repository with a version newer than what the running version of Subversion supports. */ if (! svn_version__at_least(&latest, compatible_version->major, compatible_version->minor, compatible_version->patch)) { return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL, _("Cannot guarantee compatibility " "beyond the current running version " "(%s)"), SVN_VER_NUM); } opt_state.compatible_version = compatible_version; } break; case svnadmin__keep_going: opt_state.keep_going = TRUE; break; case svnadmin__check_normalization: opt_state.check_normalization = TRUE; break; case svnadmin__metadata_only: opt_state.metadata_only = TRUE; break; case svnadmin__fs_type: SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.fs_type, opt_arg, pool)); break; case svnadmin__parent_dir: SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.parent_dir, opt_arg, pool)); opt_state.parent_dir = svn_dirent_internal_style(opt_state.parent_dir, pool); break; case svnadmin__use_pre_commit_hook: opt_state.use_pre_commit_hook = TRUE; break; case svnadmin__use_post_commit_hook: opt_state.use_post_commit_hook = TRUE; break; case svnadmin__use_pre_revprop_change_hook: opt_state.use_pre_revprop_change_hook = TRUE; break; case svnadmin__use_post_revprop_change_hook: opt_state.use_post_revprop_change_hook = TRUE; break; case svnadmin__bdb_txn_nosync: opt_state.bdb_txn_nosync = TRUE; break; case svnadmin__bdb_log_keep: opt_state.bdb_log_keep = TRUE; break; case svnadmin__bypass_hooks: opt_state.bypass_hooks = TRUE; break; case svnadmin__bypass_prop_validation: opt_state.bypass_prop_validation = TRUE; break; case svnadmin__ignore_dates: opt_state.ignore_dates = TRUE; break; case svnadmin__clean_logs: opt_state.clean_logs = TRUE; break; case svnadmin__config_dir: SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); opt_state.config_dir = apr_pstrdup(pool, svn_dirent_canonicalize(utf8_opt_arg, pool)); break; case svnadmin__wait: opt_state.wait = TRUE; break; default: { SVN_ERR(subcommand_help(NULL, NULL, pool)); *exit_code = EXIT_FAILURE; return SVN_NO_ERROR; } } /* close `switch' */ } /* close `while' */ /* If the user asked for help, then the rest of the arguments are the names of subcommands to get help on (if any), or else they're just typos/mistakes. Whatever the case, the subcommand to actually run is subcommand_help(). */ if (opt_state.help) subcommand = svn_opt_get_canonical_subcommand2(cmd_table, "help"); /* If we're not running the `help' subcommand, then look for a subcommand in the first argument. */ if (subcommand == NULL) { if (os->ind >= os->argc) { if (opt_state.version) { /* Use the "help" subcommand to handle the "--version" option. */ static const svn_opt_subcommand_desc2_t pseudo_cmd = { "--version", subcommand_help, {0}, "", {svnadmin__version, /* must accept its own option */ 'q', /* --quiet */ } }; subcommand = &pseudo_cmd; } else { svn_error_clear(svn_cmdline_fprintf(stderr, pool, _("subcommand argument required\n"))); SVN_ERR(subcommand_help(NULL, NULL, pool)); *exit_code = EXIT_FAILURE; return SVN_NO_ERROR; } } else { const char *first_arg = os->argv[os->ind++]; subcommand = svn_opt_get_canonical_subcommand2(cmd_table, first_arg); if (subcommand == NULL) { const char *first_arg_utf8; SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg, pool)); svn_error_clear( svn_cmdline_fprintf(stderr, pool, _("Unknown subcommand: '%s'\n"), first_arg_utf8)); SVN_ERR(subcommand_help(NULL, NULL, pool)); *exit_code = EXIT_FAILURE; return SVN_NO_ERROR; } } } /* Every subcommand except `help' and `freeze' with '-F' require a second argument -- the repository path. Parse it out here and store it in opt_state. */ if (!(subcommand->cmd_func == subcommand_help || (subcommand->cmd_func == subcommand_freeze && dash_F_arg))) { const char *repos_path = NULL; if (os->ind >= os->argc) { return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("Repository argument required")); } SVN_ERR(svn_utf_cstring_to_utf8(&repos_path, os->argv[os->ind++], pool)); if (svn_path_is_url(repos_path)) { return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("'%s' is a URL when it should be a " "local path"), repos_path); } opt_state.repository_path = svn_dirent_internal_style(repos_path, pool); } /* Check that the subcommand wasn't passed any inappropriate options. */ for (i = 0; i < received_opts->nelts; i++) { opt_id = APR_ARRAY_IDX(received_opts, i, int); /* All commands implicitly accept --help, so just skip over this when we see it. Note that we don't want to include this option in their "accepted options" list because it would be awfully redundant to display it in every commands' help text. */ if (opt_id == 'h' || opt_id == '?') continue; if (! svn_opt_subcommand_takes_option3(subcommand, opt_id, NULL)) { const char *optstr; const apr_getopt_option_t *badopt = svn_opt_get_option_from_code2(opt_id, options_table, subcommand, pool); svn_opt_format_option(&optstr, badopt, FALSE, pool); if (subcommand->name[0] == '-') SVN_ERR(subcommand_help(NULL, NULL, pool)); else svn_error_clear(svn_cmdline_fprintf(stderr, pool , _("Subcommand '%s' doesn't accept option '%s'\n" "Type 'svnadmin help %s' for usage.\n"), subcommand->name, optstr, subcommand->name)); *exit_code = EXIT_FAILURE; return SVN_NO_ERROR; } } /* Set up our cancellation support. */ setup_cancellation_signals(signal_handler); #ifdef SIGPIPE /* Disable SIGPIPE generation for the platforms that have it. */ apr_signal(SIGPIPE, SIG_IGN); #endif #ifdef SIGXFSZ /* Disable SIGXFSZ generation for the platforms that have it, otherwise * working with large files when compiled against an APR that doesn't have * large file support will crash the program, which is uncool. */ apr_signal(SIGXFSZ, SIG_IGN); #endif /* Configure FSFS caches for maximum efficiency with svnadmin. * Also, apply the respective command line parameters, if given. */ { svn_cache_config_t settings = *svn_cache_config_get(); settings.cache_size = opt_state.memory_cache_size; settings.single_threaded = TRUE; svn_cache_config_set(&settings); } /* Run the subcommand. */ err = (*subcommand->cmd_func)(os, &opt_state, pool); if (err) { /* For argument-related problems, suggest using the 'help' subcommand. */ if (err->apr_err == SVN_ERR_CL_INSUFFICIENT_ARGS || err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR) { err = svn_error_quick_wrap(err, _("Try 'svnadmin help' for more info")); } return err; } return SVN_NO_ERROR; } int main(int argc, const char *argv[]) { apr_pool_t *pool; int exit_code = EXIT_SUCCESS; svn_error_t *err; /* Initialize the app. */ if (svn_cmdline_init("svnadmin", stderr) != EXIT_SUCCESS) return EXIT_FAILURE; /* Create our top-level pool. Use a separate mutexless allocator, * given this application is single threaded. */ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE)); err = sub_main(&exit_code, argc, argv, pool); /* Flush stdout and report if it fails. It would be flushed on exit anyway but this makes sure that output is not silently lost if it fails. */ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout)); if (err) { exit_code = EXIT_FAILURE; svn_cmdline_handle_exit_error(err, NULL, "svnadmin: "); } svn_pool_destroy(pool); return exit_code; } Index: stable/11/contrib/subversion/win-tests.py =================================================================== --- stable/11/contrib/subversion/win-tests.py (revision 322441) +++ stable/11/contrib/subversion/win-tests.py (revision 322442) @@ -1,1171 +1,1171 @@ # # # 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. # # """ Driver for running the tests on Windows. For a list of options, run this script with the --help option. """ -# $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $ +# $HeadURL: https://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $ # $LastChangedRevision: 1718291 $ import os, sys, subprocess import filecmp import shutil import traceback import logging try: # Python >=3.0 import configparser except ImportError: # Python <3.0 import ConfigParser as configparser import string import random import getopt try: my_getopt = getopt.gnu_getopt except AttributeError: my_getopt = getopt.getopt def _usage_exit(): "print usage, exit the script" print("Driver for running the tests on Windows.") print("Usage: python win-tests.py [option] [test-path]") print("") print("Valid options:") print(" -r, --release : test the Release configuration") print(" -d, --debug : test the Debug configuration (default)") print(" --bin=PATH : use the svn binaries installed in PATH") print(" -u URL, --url=URL : run ra_dav or ra_svn tests against URL;") print(" will start svnserve for ra_svn tests") print(" -v, --verbose : talk more") print(" -f, --fs-type=type : filesystem type to use (fsfs is default)") print(" -c, --cleanup : cleanup after running a test") print(" -t, --test=TEST : Run the TEST test (all is default); use") print(" TEST#n to run a particular test number,") print(" multiples also accepted e.g. '2,4-7'") print(" --log-level=LEVEL : Set log level to LEVEL (E.g. DEBUG)") print(" --log-to-stdout : Write log results to stdout") print(" --svnserve-args=list : comma-separated list of arguments for") print(" svnserve") print(" default is '-d,-r,'") print(" --asp.net-hack : use '_svn' instead of '.svn' for the admin") print(" dir name") print(" --httpd-dir : location where Apache HTTPD is installed") print(" --httpd-port : port for Apache HTTPD; random port number") print(" will be used, if not specified") print(" --httpd-daemon : Run Apache httpd as daemon") print(" --httpd-service : Run Apache httpd as Windows service (default)") print(" --httpd-no-log : Disable httpd logging") print(" --http-short-circuit : Use SVNPathAuthz short_circuit on HTTP server") print(" --disable-http-v2 : Do not advertise support for HTTPv2 on server") print(" --disable-bulk-updates : Disable bulk updates on HTTP server") print(" --ssl-cert : Path to SSL server certificate to trust.") print(" --javahl : Run the javahl tests instead of the normal tests") print(" --swig=language : Run the swig perl/python/ruby tests instead of") print(" the normal tests") print(" --list : print test doc strings only") print(" --milestone-filter=RE : RE is a regular expression pattern that (when") print(" used with --list) limits the tests listed to") print(" those with an associated issue in the tracker") print(" which has a target milestone that matches RE.") print(" --mode-filter=TYPE : limit tests to expected TYPE = XFAIL, SKIP, PASS,") print(" or 'ALL' (default)") print(" --enable-sasl : enable Cyrus SASL authentication for") print(" svnserve") print(" -p, --parallel : run multiple tests in parallel") print(" --server-minor-version : the minor version of the server being") print(" tested") print(" --config-file : Configuration file for tests") print(" --fsfs-sharding : Specify shard size (for fsfs)") print(" --fsfs-packing : Run 'svnadmin pack' automatically") print(" -q, --quiet : Deprecated; this is the default.") print(" Use --set-log-level instead.") sys.exit(0) CMDLINE_TEST_SCRIPT_PATH = 'subversion/tests/cmdline/' CMDLINE_TEST_SCRIPT_NATIVE_PATH = CMDLINE_TEST_SCRIPT_PATH.replace('/', os.sep) sys.path.insert(0, os.path.join('build', 'generator')) sys.path.insert(1, 'build') import gen_win_dependencies import gen_base version_header = os.path.join('subversion', 'include', 'svn_version.h') cp = configparser.ConfigParser() cp.read('gen-make.opts') gen_obj = gen_win_dependencies.GenDependenciesBase('build.conf', version_header, cp.items('options')) opts, args = my_getopt(sys.argv[1:], 'hrdvqct:pu:f:', ['release', 'debug', 'verbose', 'quiet', 'cleanup', 'test=', 'url=', 'svnserve-args=', 'fs-type=', 'asp.net-hack', 'httpd-dir=', 'httpd-port=', 'httpd-daemon', 'httpd-server', 'http-short-circuit', 'httpd-no-log', 'disable-http-v2', 'disable-bulk-updates', 'help', 'fsfs-packing', 'fsfs-sharding=', 'javahl', 'swig=', 'list', 'enable-sasl', 'bin=', 'parallel', 'config-file=', 'server-minor-version=', 'log-level=', 'log-to-stdout', 'mode-filter=', 'milestone-filter=', 'ssl-cert=']) if len(args) > 1: print('Warning: non-option arguments after the first one will be ignored') # Interpret the options and set parameters base_url, fs_type, verbose, cleanup = None, None, None, None repo_loc = 'local repository.' objdir = 'Debug' log = 'tests.log' faillog = 'fails.log' run_svnserve = None svnserve_args = None run_httpd = None httpd_port = None httpd_service = None httpd_no_log = None http_short_circuit = False advertise_httpv2 = True http_bulk_updates = True list_tests = None milestone_filter = None test_javahl = None test_swig = None enable_sasl = None svn_bin = None parallel = None fsfs_sharding = None fsfs_packing = None server_minor_version = None config_file = None log_to_stdout = None mode_filter=None tests_to_run = [] log_level = None ssl_cert = None for opt, val in opts: if opt in ('-h', '--help'): _usage_exit() elif opt in ('-u', '--url'): base_url = val elif opt in ('-f', '--fs-type'): fs_type = val elif opt in ('-v', '--verbose'): verbose = 1 log_level = logging.DEBUG elif opt in ('-c', '--cleanup'): cleanup = 1 elif opt in ('-t', '--test'): tests_to_run.append(val) elif opt in ['-r', '--release']: objdir = 'Release' elif opt in ['-d', '--debug']: objdir = 'Debug' elif opt == '--svnserve-args': svnserve_args = val.split(',') run_svnserve = 1 elif opt == '--asp.net-hack': os.environ['SVN_ASP_DOT_NET_HACK'] = opt elif opt == '--httpd-dir': abs_httpd_dir = os.path.abspath(val) run_httpd = 1 elif opt == '--httpd-port': httpd_port = int(val) elif opt == '--httpd-daemon': httpd_service = 0 elif opt == '--httpd-service': httpd_service = 1 elif opt == '--httpd-no-log': httpd_no_log = 1 elif opt == '--http-short-circuit': http_short_circuit = True elif opt == '--disable-http-v2': advertise_httpv2 = False elif opt == '--disable-bulk-updates': http_bulk_updates = False elif opt == '--fsfs-sharding': fsfs_sharding = int(val) elif opt == '--fsfs-packing': fsfs_packing = 1 elif opt == '--javahl': test_javahl = 1 elif opt == '--swig': if val not in ['perl', 'python', 'ruby']: sys.stderr.write('Running \'%s\' swig tests not supported (yet).\n' % (val,)) test_swig = val elif opt == '--list': list_tests = 1 elif opt == '--milestone-filter': milestone_filter = val elif opt == '--mode-filter': mode_filter = val elif opt == '--enable-sasl': enable_sasl = 1 base_url = "svn://localhost/" elif opt == '--server-minor-version': server_minor_version = int(val) elif opt == '--bin': svn_bin = val elif opt in ('-p', '--parallel'): parallel = 1 elif opt in ('--config-file'): config_file = val elif opt == '--log-to-stdout': log_to_stdout = 1 elif opt == '--log-level': log_level = getattr(logging, val, None) or int(val) elif opt == '--ssl-cert': ssl_cert = val # Calculate the source and test directory names abs_srcdir = os.path.abspath("") abs_objdir = os.path.join(abs_srcdir, objdir) if len(args) == 0: abs_builddir = abs_objdir create_dirs = 0 else: abs_builddir = os.path.abspath(args[0]) create_dirs = 1 # Default to fsfs explicitly if not fs_type: fs_type = 'fsfs' if fs_type == 'bdb': all_tests = gen_obj.test_progs + gen_obj.bdb_test_progs \ + gen_obj.scripts + gen_obj.bdb_scripts else: all_tests = gen_obj.test_progs + gen_obj.scripts client_tests = [x for x in all_tests if x.startswith(CMDLINE_TEST_SCRIPT_PATH)] if run_httpd: if not httpd_port: httpd_port = random.randrange(1024, 30000) if not base_url: base_url = 'http://localhost:' + str(httpd_port) if base_url: repo_loc = 'remote repository ' + base_url + '.' if base_url[:4] == 'http': log = 'dav-tests.log' faillog = 'dav-fails.log' elif base_url[:3] == 'svn': log = 'svn-tests.log' faillog = 'svn-fails.log' run_svnserve = 1 else: # Don't know this scheme, but who're we to judge whether it's # correct or not? log = 'url-tests.log' faillog = 'url-fails.log' # Have to move the executables where the tests expect them to be copied_execs = [] # Store copied exec files to avoid the final dir scan def create_target_dir(dirname): tgt_dir = os.path.join(abs_builddir, dirname) if not os.path.exists(tgt_dir): if verbose: print("mkdir: %s" % tgt_dir) os.makedirs(tgt_dir) def copy_changed_file(src, tgt=None, to_dir=None, cleanup=True): if not os.path.isfile(src): print('Could not find ' + src) sys.exit(1) if to_dir and not tgt: tgt = os.path.join(to_dir, os.path.basename(src)) elif not tgt or (tgt and to_dir): raise RuntimeError("Using 'tgt' *or* 'to_dir' is required" % (tgt,)) elif tgt and os.path.isdir(tgt): raise RuntimeError("'%s' is a directory. Use to_dir=" % (tgt,)) if os.path.exists(tgt): assert os.path.isfile(tgt) if filecmp.cmp(src, tgt): if verbose: print("same: %s" % src) print(" and: %s" % tgt) return 0 if verbose: print("copy: %s" % src) print(" to: %s" % tgt) shutil.copy(src, tgt) if cleanup: copied_execs.append(tgt) def locate_libs(): "Move DLLs to a known location and set env vars" debug = (objdir == 'Debug') for lib in gen_obj._libraries.values(): if debug: name, dir = lib.debug_dll_name, lib.debug_dll_dir else: name, dir = lib.dll_name, lib.dll_dir if name and dir: src = os.path.join(dir, name) if os.path.exists(src): copy_changed_file(src, to_dir=abs_builddir, cleanup=False) for name in lib.extra_bin: src = os.path.join(dir, name) copy_changed_file(src, to_dir=abs_builddir) # Copy the Subversion library DLLs for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): if isinstance(i, gen_base.TargetLib) and i.msvc_export: src = os.path.join(abs_objdir, i.filename) if os.path.isfile(src): copy_changed_file(src, to_dir=abs_builddir, cleanup=False) # Copy the Apache modules if run_httpd and cp.has_option('options', '--with-httpd'): mod_dav_svn_path = os.path.join(abs_objdir, 'subversion', 'mod_dav_svn', 'mod_dav_svn.so') mod_authz_svn_path = os.path.join(abs_objdir, 'subversion', 'mod_authz_svn', 'mod_authz_svn.so') mod_dontdothat_path = os.path.join(abs_objdir, 'tools', 'server-side', 'mod_dontdothat', 'mod_dontdothat.so') copy_changed_file(mod_dav_svn_path, to_dir=abs_builddir, cleanup=False) copy_changed_file(mod_authz_svn_path, to_dir=abs_builddir, cleanup=False) copy_changed_file(mod_dontdothat_path, to_dir=abs_builddir, cleanup=False) os.environ['PATH'] = abs_builddir + os.pathsep + os.environ['PATH'] def fix_case(path): path = os.path.normpath(path) parts = path.split(os.path.sep) drive = parts[0].upper() parts = parts[1:] path = drive + os.path.sep for part in parts: dirs = os.listdir(path) for dir in dirs: if dir.lower() == part.lower(): path = os.path.join(path, dir) break return path class Svnserve: "Run svnserve for ra_svn tests" def __init__(self, svnserve_args, objdir, abs_objdir, abs_builddir): self.args = svnserve_args self.name = 'svnserve.exe' self.kind = objdir self.path = os.path.join(abs_objdir, 'subversion', 'svnserve', self.name) self.root = os.path.join(abs_builddir, CMDLINE_TEST_SCRIPT_NATIVE_PATH) self.proc = None def __del__(self): "Stop svnserve when the object is deleted" self.stop() def _quote(self, arg): if ' ' in arg: return '"' + arg + '"' else: return arg def start(self): if not self.args: args = [self.name, '-d', '-r', self.root] else: args = [self.name] + self.args print('Starting %s %s' % (self.kind, self.name)) self.proc = subprocess.Popen([self.path] + args[1:]) def stop(self): if self.proc is not None: try: print('Stopping %s' % self.name) self.proc.poll(); if self.proc.returncode is None: self.proc.kill(); return except AttributeError: pass print('Svnserve.stop not implemented') class Httpd: "Run httpd for DAV tests" def __init__(self, abs_httpd_dir, abs_objdir, abs_builddir, httpd_port, service, no_log, httpv2, short_circuit, bulk_updates): self.name = 'apache.exe' self.httpd_port = httpd_port self.httpd_dir = abs_httpd_dir if httpv2: self.httpv2_option = 'on' else: self.httpv2_option = 'off' if bulk_updates: self.bulkupdates_option = 'on' else: self.bulkupdates_option = 'off' self.service = service self.proc = None self.path = os.path.join(self.httpd_dir, 'bin', self.name) if short_circuit: self.path_authz_option = 'short_circuit' else: self.path_authz_option = 'on' if not os.path.exists(self.path): self.name = 'httpd.exe' self.path = os.path.join(self.httpd_dir, 'bin', self.name) if not os.path.exists(self.path): raise RuntimeError("Could not find a valid httpd binary!") self.root_dir = os.path.join(CMDLINE_TEST_SCRIPT_NATIVE_PATH, 'httpd') self.root = os.path.join(abs_builddir, self.root_dir) self.authz_file = os.path.join(abs_builddir, CMDLINE_TEST_SCRIPT_NATIVE_PATH, 'svn-test-work', 'authz') self.dontdothat_file = os.path.join(abs_builddir, CMDLINE_TEST_SCRIPT_NATIVE_PATH, 'svn-test-work', 'dontdothat') self.httpd_config = os.path.join(self.root, 'httpd.conf') self.httpd_users = os.path.join(self.root, 'users') self.httpd_mime_types = os.path.join(self.root, 'mime.types') self.httpd_groups = os.path.join(self.root, 'groups') self.abs_builddir = abs_builddir self.abs_objdir = abs_objdir self.service_name = 'svn-test-httpd-' + str(httpd_port) if self.service: self.httpd_args = [self.name, '-n', self._quote(self.service_name), '-f', self._quote(self.httpd_config)] else: self.httpd_args = [self.name, '-f', self._quote(self.httpd_config)] create_target_dir(self.root_dir) self._create_users_file() self._create_groups_file() self._create_mime_types_file() self._create_dontdothat_file() # Obtain version. version_vals = gen_obj._libraries['httpd'].version.split('.') self.httpd_ver = float('%s.%s' % (version_vals[0], version_vals[1])) # Create httpd config file fp = open(self.httpd_config, 'w') # Limit the number of threads (default = 64) fp.write('\n') fp.write('ThreadsPerChild 16\n') fp.write('\n') # Global Environment fp.write('ServerRoot ' + self._quote(self.root) + '\n') fp.write('DocumentRoot ' + self._quote(self.root) + '\n') fp.write('ServerName localhost\n') fp.write('PidFile pid\n') fp.write('ErrorLog log\n') fp.write('Listen ' + str(self.httpd_port) + '\n') if not no_log: fp.write('LogFormat "%h %l %u %t \\"%r\\" %>s %b" common\n') fp.write('Customlog log common\n') fp.write('LogLevel Debug\n') else: fp.write('LogLevel Crit\n') # Write LoadModule for minimal system module fp.write(self._sys_module('dav_module', 'mod_dav.so')) if self.httpd_ver >= 2.3: fp.write(self._sys_module('access_compat_module', 'mod_access_compat.so')) fp.write(self._sys_module('authz_core_module', 'mod_authz_core.so')) fp.write(self._sys_module('authz_user_module', 'mod_authz_user.so')) fp.write(self._sys_module('authn_core_module', 'mod_authn_core.so')) if self.httpd_ver >= 2.2: fp.write(self._sys_module('auth_basic_module', 'mod_auth_basic.so')) fp.write(self._sys_module('authn_file_module', 'mod_authn_file.so')) fp.write(self._sys_module('authz_groupfile_module', 'mod_authz_groupfile.so')) fp.write(self._sys_module('authz_host_module', 'mod_authz_host.so')) else: fp.write(self._sys_module('auth_module', 'mod_auth.so')) fp.write(self._sys_module('alias_module', 'mod_alias.so')) fp.write(self._sys_module('mime_module', 'mod_mime.so')) fp.write(self._sys_module('log_config_module', 'mod_log_config.so')) # Write LoadModule for Subversion modules fp.write(self._svn_module('dav_svn_module', 'mod_dav_svn.so')) fp.write(self._svn_module('authz_svn_module', 'mod_authz_svn.so')) # And for mod_dontdothat fp.write(self._svn_module('dontdothat_module', 'mod_dontdothat.so')) # Don't handle .htaccess, symlinks, etc. fp.write('\n') fp.write('AllowOverride None\n') fp.write('Options None\n') fp.write('\n\n') # Define two locations for repositories fp.write(self._svn_repo('repositories')) fp.write(self._svn_repo('local_tmp')) fp.write(self._svn_authz_repo()) # And two redirects for the redirect tests fp.write('RedirectMatch permanent ^/svn-test-work/repositories/' 'REDIRECT-PERM-(.*)$ /svn-test-work/repositories/$1\n') fp.write('RedirectMatch ^/svn-test-work/repositories/' 'REDIRECT-TEMP-(.*)$ /svn-test-work/repositories/$1\n') fp.write('TypesConfig ' + self._quote(self.httpd_mime_types) + '\n') fp.write('HostNameLookups Off\n') fp.close() def __del__(self): "Stop httpd when the object is deleted" self.stop() def _quote(self, arg): if ' ' in arg: return '"' + arg + '"' else: return arg def _create_users_file(self): "Create users file" htpasswd = os.path.join(self.httpd_dir, 'bin', 'htpasswd.exe') # Create the cheapest to compare password form for our testsuite os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bcp', self.httpd_users, 'jrandom', 'rayjandom']) os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 'jconstant', 'rayjandom']) os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 'JRANDOM', 'rayjandom']) os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 'JCONSTANT', 'rayjandom']) def _create_groups_file(self): "Create groups for mod_authz_svn tests" fp = open(self.httpd_groups, 'w') fp.write('random: jrandom\n') fp.write('constant: jconstant\n') fp.close() def _create_mime_types_file(self): "Create empty mime.types file" fp = open(self.httpd_mime_types, 'w') fp.close() def _create_dontdothat_file(self): "Create empty mime.types file" # If the tests have not previously been run or were cleaned # up, then 'svn-test-work' does not exist yet. parent_dir = os.path.dirname(self.dontdothat_file) if not os.path.exists(parent_dir): os.makedirs(parent_dir) fp = open(self.dontdothat_file, 'w') fp.write('[recursive-actions]\n') fp.write('/ = deny\n') fp.close() def _sys_module(self, name, path): full_path = os.path.join(self.httpd_dir, 'modules', path) return 'LoadModule ' + name + " " + self._quote(full_path) + '\n' def _svn_module(self, name, path): full_path = os.path.join(self.abs_builddir, path) return 'LoadModule ' + name + ' ' + self._quote(full_path) + '\n' def _svn_repo(self, name): path = os.path.join(self.abs_builddir, CMDLINE_TEST_SCRIPT_NATIVE_PATH, 'svn-test-work', name) location = '/svn-test-work/' + name ddt_location = '/ddt-test-work/' + name return \ '\n' \ ' DAV svn\n' \ ' SVNParentPath ' + self._quote(path) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ ' SVNAllowBulkUpdates ' + self.bulkupdates_option + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' AuthType Basic\n' \ ' AuthName "Subversion Repository"\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user\n' \ '\n' \ '\n' \ ' DAV svn\n' \ ' SVNParentPath ' + self._quote(path) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ ' SVNAllowBulkUpdates ' + self.bulkupdates_option + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' AuthType Basic\n' \ ' AuthName "Subversion Repository"\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user\n' \ ' DontDoThatConfigFile ' + self._quote(self.dontdothat_file) + '\n' \ '\n' def _svn_authz_repo(self): local_tmp = os.path.join(self.abs_builddir, CMDLINE_TEST_SCRIPT_NATIVE_PATH, 'svn-test-work', 'local_tmp') return \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' ' + '\n' \ ' Require all granted' + '\n' \ ' ' + '\n' \ ' ' + '\n' \ ' Allow from all' + '\n' \ ' ' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user' + '\n' \ ' Satisfy Any' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user' + '\n' \ ' AuthzSVNNoAuthWhenAnonymousAllowed On' + '\n' \ ' SVNPathAuthz On' + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user' + '\n' \ ' AuthzSVNAnonymous Off' + '\n' \ ' SVNPathAuthz On' + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user' + '\n' \ ' AuthzForceUsernameCase Lower' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' Require valid-user' + '\n' \ ' AuthzForceUsernameCase Lower' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' AuthGroupFile ' + self._quote(self.httpd_groups) + '\n' \ ' Require group random' + '\n' \ ' AuthzSVNAuthoritative Off' + '\n' \ ' SVNPathAuthz On' + '\n' \ '' + '\n' \ '' + '\n' \ '' + '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' AuthzSendForbiddenOnFailure On' + '\n' \ ' Satisfy All' + '\n' \ ' ' + '\n' \ ' Require valid-user' + '\n' \ ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \ ' ' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ ''+ '\n' \ ' DAV svn' + '\n' \ ' SVNParentPath ' + local_tmp + '\n' \ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ ' SVNListParentPath On' + '\n' \ ' AuthType Basic' + '\n' \ ' AuthName "Subversion Repository"' + '\n' \ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ ' AuthzSendForbiddenOnFailure On' + '\n' \ ' Satisfy All' + '\n' \ ' ' + '\n' \ ' Require valid-user' + '\n' \ ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \ '' + '\n' \ ' SVNPathAuthz ' + self.path_authz_option + '\n' \ '' + '\n' \ '' + '\n' \ def start(self): if self.service: self._start_service() else: self._start_daemon() def stop(self): if self.service: self._stop_service() else: self._stop_daemon() def _start_service(self): "Install and start HTTPD service" print('Installing service %s' % self.service_name) os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'install']) print('Starting service %s' % self.service_name) os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'start']) def _stop_service(self): "Stop and uninstall HTTPD service" os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'stop']) os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'uninstall']) def _start_daemon(self): "Start HTTPD as daemon" print('Starting httpd as daemon') print(self.httpd_args) self.proc = subprocess.Popen([self.path] + self.httpd_args[1:]) def _stop_daemon(self): "Stop the HTTPD daemon" if self.proc is not None: try: print('Stopping %s' % self.name) self.proc.poll(); if self.proc.returncode is None: self.proc.kill(); return except AttributeError: pass print('Httpd.stop_daemon not implemented') # Move the binaries to the test directory create_target_dir(abs_builddir) locate_libs() if create_dirs: for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): if isinstance(i, gen_base.TargetExe): src = os.path.join(abs_objdir, i.filename) if os.path.isfile(src): dst = os.path.join(abs_builddir, i.filename) create_target_dir(os.path.dirname(dst)) copy_changed_file(src, dst) # Create the base directory for Python tests create_target_dir(CMDLINE_TEST_SCRIPT_NATIVE_PATH) # Ensure the tests directory is correctly cased abs_builddir = fix_case(abs_builddir) daemon = None # Run the tests # No need to start any servers if we are only listing the tests. if not list_tests: if run_svnserve: daemon = Svnserve(svnserve_args, objdir, abs_objdir, abs_builddir) if run_httpd: daemon = Httpd(abs_httpd_dir, abs_objdir, abs_builddir, httpd_port, httpd_service, httpd_no_log, advertise_httpv2, http_short_circuit, http_bulk_updates) # Start service daemon, if any if daemon: daemon.start() # Find the full path and filename of any test that is specified just by # its base name. if len(tests_to_run) != 0: tests = [] for t in tests_to_run: tns = None if '#' in t: t, tns = t.split('#') test = [x for x in all_tests if x.split('/')[-1] == t] if not test and not (t.endswith('-test.exe') or t.endswith('_tests.py')): # The lengths of '-test.exe' and of '_tests.py' are both 9. test = [x for x in all_tests if x.split('/')[-1][:-9] == t] if not test: print("Skipping test '%s', test not found." % t) elif tns: tests.append('%s#%s' % (test[0], tns)) else: tests.extend(test) tests_to_run = tests else: tests_to_run = all_tests if list_tests: print('Listing %s configuration on %s' % (objdir, repo_loc)) else: print('Testing %s configuration on %s' % (objdir, repo_loc)) sys.path.insert(0, os.path.join(abs_srcdir, 'build')) if not test_javahl and not test_swig: import run_tests if log_to_stdout: log_file = None fail_log_file = None else: log_file = os.path.join(abs_builddir, log) fail_log_file = os.path.join(abs_builddir, faillog) if run_httpd: httpd_version = gen_obj._libraries['httpd'].version else: httpd_version = None opts, args = run_tests.create_parser().parse_args([]) opts.url = base_url opts.fs_type = fs_type opts.http_library = 'serf' opts.server_minor_version = server_minor_version opts.cleanup = cleanup opts.enable_sasl = enable_sasl opts.parallel = parallel opts.config_file = config_file opts.fsfs_sharding = fsfs_sharding opts.fsfs_packing = fsfs_packing opts.list_tests = list_tests opts.svn_bin = svn_bin opts.mode_filter = mode_filter opts.milestone_filter = milestone_filter opts.httpd_version = httpd_version opts.set_log_level = log_level opts.ssl_cert = ssl_cert th = run_tests.TestHarness(abs_srcdir, abs_builddir, log_file, fail_log_file, opts) old_cwd = os.getcwd() try: os.chdir(abs_builddir) failed = th.run(tests_to_run) except: os.chdir(old_cwd) raise else: os.chdir(old_cwd) elif test_javahl: failed = False java_exe = None for path in os.environ["PATH"].split(os.pathsep): if os.path.isfile(os.path.join(path, 'java.exe')): java_exe = os.path.join(path, 'java.exe') break if not java_exe and 'java_sdk' in gen_obj._libraries: jdk = gen_obj._libraries['java_sdk'] if os.path.isfile(os.path.join(jdk.lib_dir, '../bin/java.exe')): java_exe = os.path.join(jdk.lib_dir, '../bin/java.exe') if not java_exe: print('Java not found. Skipping Java tests') else: args = (os.path.abspath(java_exe),) if (objdir == 'Debug'): args = args + ('-Xcheck:jni',) args = args + ( '-Dtest.rootdir=' + os.path.join(abs_builddir, 'javahl'), '-Dtest.srcdir=' + os.path.join(abs_srcdir, 'subversion/bindings/javahl'), '-Dtest.rooturl=', '-Dtest.fstype=' + fs_type , '-Dtest.tests=', '-Djava.library.path=' + os.path.join(abs_objdir, 'subversion/bindings/javahl/native'), '-classpath', os.path.join(abs_srcdir, 'subversion/bindings/javahl/classes') +';' + gen_obj.junit_path ) sys.stderr.flush() print('Running org.apache.subversion tests:') sys.stdout.flush() r = subprocess.call(args + tuple(['org.apache.subversion.javahl.RunTests'])) sys.stdout.flush() sys.stderr.flush() if (r != 0): print('[Test runner reported failure]') failed = True print('Running org.tigris.subversion tests:') sys.stdout.flush() r = subprocess.call(args + tuple(['org.tigris.subversion.javahl.RunTests'])) sys.stdout.flush() sys.stderr.flush() if (r != 0): print('[Test runner reported failure]') failed = True elif test_swig == 'perl': failed = False swig_dir = os.path.join(abs_builddir, 'swig') swig_pl_dir = os.path.join(swig_dir, 'p5lib') swig_pl_svn = os.path.join(swig_pl_dir, 'SVN') swig_pl_auto_svn = os.path.join(swig_pl_dir, 'auto', 'SVN') create_target_dir(swig_pl_svn) for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): if isinstance(i, gen_base.TargetSWIG) and i.lang == 'perl': mod_dir = os.path.join(swig_pl_auto_svn, '_' + i.name[5:].capitalize()) create_target_dir(mod_dir) copy_changed_file(os.path.join(abs_objdir, i.filename), to_dir=mod_dir) elif isinstance(i, gen_base.TargetSWIGLib) and i.lang == 'perl': copy_changed_file(os.path.join(abs_objdir, i.filename), to_dir=abs_builddir) pm_src = os.path.join(abs_srcdir, 'subversion', 'bindings', 'swig', 'perl', 'native') tests = [] for root, dirs, files in os.walk(pm_src): for name in files: if name.endswith('.pm'): fn = os.path.join(root, name) copy_changed_file(fn, to_dir=swig_pl_svn) elif name.endswith('.t'): tests.append(os.path.relpath(os.path.join(root, name), pm_src)) perl5lib = swig_pl_dir if 'PERL5LIB' in os.environ: perl5lib += os.pathsep + os.environ['PERL5LIB'] perl_exe = 'perl.exe' print('-- Running Swig Perl tests --') sys.stdout.flush() old_cwd = os.getcwd() try: os.chdir(pm_src) os.environ['PERL5LIB'] = perl5lib os.environ["SVN_DBG_NO_ABORT_ON_ERROR_LEAK"] = 'YES' r = subprocess.call([ perl_exe, '-MExtUtils::Command::MM', '-e', 'test_harness()' ] + tests) finally: os.chdir(old_cwd) if (r != 0): print('[Test runner reported failure]') failed = True elif test_swig == 'python': failed = False swig_dir = os.path.join(abs_builddir, 'swig') swig_py_dir = os.path.join(swig_dir, 'pylib') swig_py_libsvn = os.path.join(swig_py_dir, 'libsvn') swig_py_svn = os.path.join(swig_py_dir, 'svn') create_target_dir(swig_py_libsvn) create_target_dir(swig_py_svn) for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): if (isinstance(i, gen_base.TargetSWIG) or isinstance(i, gen_base.TargetSWIGLib)) and i.lang == 'python': src = os.path.join(abs_objdir, i.filename) copy_changed_file(src, to_dir=swig_py_libsvn) py_src = os.path.join(abs_srcdir, 'subversion', 'bindings', 'swig', 'python') for py_file in os.listdir(py_src): if py_file.endswith('.py'): copy_changed_file(os.path.join(py_src, py_file), to_dir=swig_py_libsvn) py_src_svn = os.path.join(py_src, 'svn') for py_file in os.listdir(py_src_svn): if py_file.endswith('.py'): copy_changed_file(os.path.join(py_src_svn, py_file), to_dir=swig_py_svn) print('-- Running Swig Python tests --') sys.stdout.flush() pythonpath = swig_py_dir if 'PYTHONPATH' in os.environ: pythonpath += os.pathsep + os.environ['PYTHONPATH'] python_exe = 'python.exe' old_cwd = os.getcwd() try: os.environ['PYTHONPATH'] = pythonpath r = subprocess.call([ python_exe, os.path.join(py_src, 'tests', 'run_all.py') ]) finally: os.chdir(old_cwd) if (r != 0): print('[Test runner reported failure]') failed = True elif test_swig == 'ruby': failed = False if 'ruby' not in gen_obj._libraries: print('Ruby not found. Skipping Ruby tests') else: ruby_lib = gen_obj._libraries['ruby'] ruby_exe = 'ruby.exe' ruby_subdir = os.path.join('subversion', 'bindings', 'swig', 'ruby') ruby_args = [ '-I', os.path.join(abs_srcdir, ruby_subdir), os.path.join(abs_srcdir, ruby_subdir, 'test', 'run-test.rb'), '--verbose' ] print('-- Running Swig Ruby tests --') sys.stdout.flush() old_cwd = os.getcwd() try: os.chdir(ruby_subdir) os.environ["BUILD_TYPE"] = objdir os.environ["SVN_DBG_NO_ABORT_ON_ERROR_LEAK"] = 'YES' r = subprocess.call([ruby_exe] + ruby_args) finally: os.chdir(old_cwd) sys.stdout.flush() sys.stderr.flush() if (r != 0): print('[Test runner reported failure]') failed = True # Stop service daemon, if any if daemon: del daemon # Remove the execs again for tgt in copied_execs: try: if os.path.isfile(tgt): if verbose: print("kill: %s" % tgt) os.unlink(tgt) except: traceback.print_exc(file=sys.stdout) pass if failed: sys.exit(1) Index: stable/11 =================================================================== --- stable/11 (revision 322441) +++ stable/11 (revision 322442) Property changes on: stable/11 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head:r322380