fossil-2.5 0000755 0000000 0000000 00000000000 13236644756 0012174 5 ustar 00nobody nobody fossil-2.5/manifest 0000644 0000000 0000000 00000175336 13236644756 0014023 0 ustar 00nobody nobody C Version\s2.5
D 2018-02-07T18:48:14.863
F .dockerignore 29c5476ae4fb609219ea3f11d60c4b133a037b68
F .fossil-settings/binary-glob 34cc11b3b509fd5064afe327e70765799f314c9a
F .fossil-settings/clean-glob 50327fe7150c88e5daf5150f240dc805398665fb
F .fossil-settings/crlf-glob 2da052c2bd7a53c5e083152cd3ea3cefd6228b17
F .fossil-settings/encoding-glob fe9e7e2a183ce22d107976173b58d2a1255aeb0a
F .fossil-settings/ignore-glob b7b945d48cfceef7fd1000d6a6c6232b7163d5e8
F .project b7b33febfaccfeae87eb1d782cd0c675679b7dc7
F .settings/org.eclipse.core.resources.prefs 6d8a06b0a3395c74037897476eadb764d7f2d22d
F .settings/org.eclipse.core.runtime.prefs 6cc9381da1eff8e6dac0e41121d3cce3f1b4761b
F BUILD.txt 976db410b019ec100c95da8aa977d6209fee9a4e
F COPYRIGHT-BSD2.txt f99187d1905883d3b3cff4c5f97687290b1f3edf
F Dockerfile de98550db1d43a29a17bbd9284308733fb72615f
F Makefile.classic f0e49e92670a94553f0e59764ee3787d85cf81d9
F Makefile.in 54b9af364d262761ac05970f96ea609467109548636807a584565350289d80dc x
F VERSION bd6291c6a65f6ed39074abc5ef32954162961af9ca092dd6cb0b9ba0529c3fb5
F ajax/README 133f25a88f21479a20cc3b20a8dfa0f0fa807ffc
F ajax/cgi-bin/fossil-json.cgi.example 5e1245c336a0666e3777c5ba46ce2bbcd6450619
F ajax/i-test/rhino-shell.js 2b735676d55e3d06d670ffbc643e5d3f748b95ea
F ajax/i-test/rhino-test.js c0e2d874caa424a8cb1628c8d85a4a6b197b8d32
F ajax/index.html f4f8d1b79b51a12dd167f5e16a1e3e6e38f8903e
F ajax/js/fossil-ajaj.js fd8e12d69fc9cd13e29c78030380045843b5de03
F ajax/js/json2.js 2e347546543bf026d364e9d308007b18225c0cba
F ajax/js/whajaj.js 64b3ef7eeef5155fd772b3b28e7901713542db0375342c735ab8d4f68a49a3a1
F ajax/wiki-editor.html 1f630ecf988838dcfe5abd2548b9e5461da77c38
F art/CollRev1.dia 186c7bb7a88c533ab226431bbd7c4835bb6ac2a0
F art/CollRev2.dia 59b1c331a52e19f44f2dcf7c744dd5aaabd2b5cf
F art/CollRev3.dia c9e4b2f61b68592539ec5ff17f6dba0aef45b4d2
F art/CollRev4.dia 59a4919923d1d695cb4e9fb9f29114ea25e35d18
F art/branching.odp 2b21dbbc284413ed7e9a915c6c716e42f6831b1a
F art/concept1.dia 84f4b61b5f22eb62752c4aa04a955d424f9d2a00
F art/concept2.dia 45f46122096e5d29536c7670ec214e9ac478ef43
F art/delta1.dia 1e1461fa6f5d7e5a3d9207d0da8091e85ea3c62d
F art/delta2.dia 5e2acf9cd1e5c75b7f08eac61602b224626a8939
F art/delta3.dia 822f600d80faca38daa35ba10ddee2ef89ee97bf
F art/delta4.dia 7184224cface58098e74c518e1aeb155645fb915
F art/delta5.dia 42c52e3c7c6b853b3eca596b183fa43d75fd841d
F art/delta6.dia 638abaa6b4ca7c348d1a00d96f5d6676231e6e37
F art/encode1.tex bb4fa24df875f09c104ac535727a885ecd1b0126
F art/encode10.dia 5957690e4d2e7e75412247830267678e95634552
F art/encode2.tex 0a86eb21bb6fd8ccec597e6651d5d038aaf07baf
F art/encode3.tex e14430ac5a65400a5c2c4f0fef0274bfe94c69ea
F art/encode4.tex ef19f3297df533c6baa0500dbcda54de333b8830
F art/encode5.tex 8c67f6dc7e52de7d4f46b140627e14466a73a180
F art/encode6.tex 460b9901beab1ec022abe860fc4b494652dad206
F art/encode7.tex 52fdbf5294043369dde8c7859168454d130d449a
F art/encode8.tex 002741146eee8ee5b8a99ddd27246e2b926fbf32
F art/encode9.tex 84df5abf42b007748ec0ea1e3bd4ad2628502335
F auto.def 24d846be89ece11ef4fc047043d6eece63e9f2c6cdf74c3d35c9c969277c73cd
F autosetup/LICENSE 34b2f1d7acba3eeb992e4281307640989cd08d0a
F autosetup/README.autosetup c235af4ce86af9a9b8b331b5a67c822d52ca2c6e
F autosetup/autosetup 564c6ab11d5ab75d1aebc8d90ebc22df8babb01d2f9ada06d7964e5cfb7c38aa x
F autosetup/cc-db.tcl 08642fcb65fb68ee8c523bfae45e67c68c08005d
F autosetup/cc-lib.tcl 75bdc7b1e72b8751bf75dee05dfb4763a9fae40e70bfc25f3d5c7e280a1698a0
F autosetup/cc-shared.tcl 928361fc90669758e5e757e5399cd8258439e911c062bd7590e5363ff265c472
F autosetup/cc.tcl 1ea33bf7c02fd9ec1b3abe2754ccf94a8e2b8bdc9852f93a735f17cfd6764f44
F autosetup/config.guess 947c8873202b420cdd698aa562cd05ee128197f6 x
F autosetup/config.sub 1ed99f2fce4975f55e82b3833baf74fbcd8bdda0 x
F autosetup/default.auto f78163e478676728918cbb7360abddb9c830e882
F autosetup/find-tclsh f973558ad74bd8e4d55b677d9c166cbb35f34186 x
F autosetup/jimsh0.c c31f25b294314ea582cb2acf8fe4aa04de1065060b72f58fa58c5dd5644863cd
F autosetup/local.tcl 60b0633b484a89c87aed299e4c22ac5287803f921ba9b653a04b0c518f699cda
F autosetup/pkg-config.tcl 1d3eb0476a271d7c506aa253a4a189a68344950d726381d2d0417bb31af21b4d
F autosetup/system.tcl 8faf3eeadc63cb1718ada6eccecdb8f631801a6627e1d14c80230f8686d23d86
F autosetup/test-tclsh f197a4c7bfa8bde7672864fc36dcbc7f85bdda6c x
F autosetup/tmake.auto 76789a7eb47bb057c1d230f549dd6cf1cf3ac376
F autosetup/tmake.tcl 585cf569bb5b94a98876615d6b6dd6d6d84c93a9
F compat/tcl-8.6/generic/tcl.h 3e49f8e5404fd60181c69b6d0ad075e12c4fbd4d
F compat/tcl-8.6/generic/tclDecls.h 9f431aa5c9a819efa078fadecf3fb1214137455d
F compat/tcl-8.6/generic/tclPlatDecls.h 05f8965cb99af1c9bb78ff437e991f49a598f7b7
F compat/zlib/CMakeLists.txt ade23b9417a586a0974e48fda589491fceb85c16
F compat/zlib/ChangeLog e59e031b1a8b9f128fefde07c9d596db4a4c50e8
F compat/zlib/FAQ 832bb73adff252fa426a141ee4756daa9b8a4db4
F compat/zlib/INDEX 74611a0f2bcc004caa1fa07bdeb4c44b01f0a5d6
F compat/zlib/Makefile b04f62dd1002b9ca07068c90651432dec60029f3
F compat/zlib/Makefile.in 023e127b48d292316614f604c1bacda043ba3bb5
F compat/zlib/README e1e1b075ae4ad6d628468e7dd40d9ec512ff9d10
F compat/zlib/adler32.c 6c1114794db137af50f9b060aaade1a1a35ed784
F compat/zlib/amiga/Makefile.pup 79461cdcf8eda434edca3c32781982d2082af5fe
F compat/zlib/amiga/Makefile.sas 64787face2d527df6c78ba8754eb54c53dda6ac2
F compat/zlib/compress.c bd40f3ba8567a21560dc307d99c810de6f2d0533
F compat/zlib/configure bdc2fac491ea3431c733cf8be5b8c17ff60207ab x
F compat/zlib/contrib/README.contrib 6b6a2a76495304808f5e13df25face2089124fe6
F compat/zlib/contrib/ada/buffer_demo.adb 1d8fba99362b0973535a759097f7893d4551c4e7
F compat/zlib/contrib/ada/mtest.adb f1c968146ba1a8f07c7070a2af72ab8a84c82e3d
F compat/zlib/contrib/ada/read.adb a5a6682ef169a7429d9bf9f8acbda6ffb756fec4
F compat/zlib/contrib/ada/readme.txt 1fd4ae8ee39ef80117dca454e1951ecaf0d1d290
F compat/zlib/contrib/ada/test.adb 5eebe86bd398dade5340cc4af24685bf02df671f
F compat/zlib/contrib/ada/zlib-streams.adb 70f5981b0c3c5de023ea3485ea7e81231a42ce7f
F compat/zlib/contrib/ada/zlib-streams.ads fadb4623dc2469cc4fd571a9fac302798735c40b
F compat/zlib/contrib/ada/zlib-thin.adb 43c7e58eb582ce078f6ff76aa4f4eb09892ff92b
F compat/zlib/contrib/ada/zlib-thin.ads faf47e35174e1e76edb85ea602779084e535df69
F compat/zlib/contrib/ada/zlib.adb 3961008f51def7ffcd692453df7b0f1d8b680645
F compat/zlib/contrib/ada/zlib.ads 0245a91806d804bf9f0907a3a001a141e9adb61b
F compat/zlib/contrib/ada/zlib.gpr c36c2cf069e930eb81ee0c89bfe70c20c8d0511a
F compat/zlib/contrib/amd64/amd64-match.S 4ac2676fb0393520f0d051965529c39139e7de8c
F compat/zlib/contrib/asm686/README.686 ac08681935257d53b3fd1793788a1406a781ee22
F compat/zlib/contrib/asm686/match.S f1023ae9dab5691291f42b180551bae164086492
F compat/zlib/contrib/blast/Makefile c18cae8b163b2fc351bc59b8efad7a190d1ead78
F compat/zlib/contrib/blast/README 69a33e70f88cc1f3520e2154ed38d3f690ee26e5
F compat/zlib/contrib/blast/blast.c 809a3404b6e9e1bc120ff0313c31c4bd2b776823
F compat/zlib/contrib/blast/blast.h b20eb7c03966462cafbf896c97263632004bd867
F compat/zlib/contrib/blast/test.pk 00d07b4c71bad842d7e04210f966e55977efd9c3
F compat/zlib/contrib/blast/test.txt aed9b9fc86b2b47a4c46053df53feb544ecf31ce
F compat/zlib/contrib/delphi/ZLib.pas 25133131cac8eeed1962e7a9072b06591481a520
F compat/zlib/contrib/delphi/ZLibConst.pas e0ff4d3c14a4dcdbf170692ce0fec86939b500d0
F compat/zlib/contrib/delphi/readme.txt 366e08eaa227cd3d09810c45639aedf4879b7ecf
F compat/zlib/contrib/delphi/zlibd32.mak ddf83b34d4c7d41ace39f96b5cb13fb390c8d2eb
F compat/zlib/contrib/dotzlib/DotZLib.build 6f87ba12d786feca35738d0e9ce1f0f03f292881
F compat/zlib/contrib/dotzlib/DotZLib.chm a1245c21c7e918fa2919fd10bbe5604fc81faf49
F compat/zlib/contrib/dotzlib/DotZLib.sln 4946bdb71b79bff62f9217802b7524010c669408
F compat/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs 9f1db1177b2e9a014f72bb3cd80be17133e06d16
F compat/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs 3807a0e24a57b92ea301559cab7307b8eab52c51
F compat/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs 1e646570737b175729a916da13b23fe88fcbd0e8
F compat/zlib/contrib/dotzlib/DotZLib/CodecBase.cs 2106c80ed4607f10400ceed9aa8f635efdea9345
F compat/zlib/contrib/dotzlib/DotZLib/Deflater.cs 11f6bf695e4b8ddac0d8553640ef303d9b7cab72
F compat/zlib/contrib/dotzlib/DotZLib/DotZLib.cs e9c7c49791d38b49a39aab76f593b2ea229fa940
F compat/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj 99238c2ad633a641687d722e8c80aaa0a8c8bdd2
F compat/zlib/contrib/dotzlib/DotZLib/GZipStream.cs 731206b5721b9a7be5a1cbc98e3cc969bd176b4b
F compat/zlib/contrib/dotzlib/DotZLib/Inflater.cs 25f788ff0015c08fcd74d6e4552e01792c559350
F compat/zlib/contrib/dotzlib/DotZLib/UnitTests.cs 8d35d4a5b28e472f5618185c295d1964c1459d07
F compat/zlib/contrib/dotzlib/LICENSE_1_0.txt 892b34f7865d90a6f949f50d95e49625a10bc7f0
F compat/zlib/contrib/dotzlib/readme.txt b1229b826f0096808628474538cea8fec2922a9b
F compat/zlib/contrib/gcc_gvmat64/gvmat64.S 742603cba1af98a1432cc02efb019b1a5760adf2
F compat/zlib/contrib/infback9/README b3905a8a31f7c61114b5fa6e203682b250e029d6
F compat/zlib/contrib/infback9/infback9.c 17fb362c03755b12f2dda5b12a68cf38162674bd
F compat/zlib/contrib/infback9/infback9.h d0486a32b558dcaceded5f0746fad62e680a4734
F compat/zlib/contrib/infback9/inffix9.h 7a57a5901d920d1d3fcf4f8d6bedf8c9c68b41a7
F compat/zlib/contrib/infback9/inflate9.h c7541490d97f70268010ae1baeb98a10302f3df8
F compat/zlib/contrib/infback9/inftree9.c 2729fd3758fb3eb6e84ec51d1c118bd5888ee874
F compat/zlib/contrib/infback9/inftree9.h cfb5d10e9b79029c758cf0428875f9cffa9d6cdf
F compat/zlib/contrib/inflate86/inffas86.c d9dfc1538fb2bf1daef2fec42e68472ede564abc
F compat/zlib/contrib/inflate86/inffast.S e5c30f2fc07023d7024571c9882383236d2a1cb0
F compat/zlib/contrib/iostream/test.cpp 0074186cc98585f48eb8d18c2be887955238b741
F compat/zlib/contrib/iostream/zfstream.cpp a8f677a8e32a4923a8a57c61e60ecb899eca5cab
F compat/zlib/contrib/iostream/zfstream.h 57f03c37ca952cec5e58c827995365c18c728285
F compat/zlib/contrib/iostream2/zstream.h fca4540d490fff36bb90fd801cf9cd8fc695bb17
F compat/zlib/contrib/iostream2/zstream_test.cpp e18a6d55cbbd8b832f8d795530553467e5c74fcf
F compat/zlib/contrib/iostream3/README d4a3dfd7a48721d6e7d12da226855bab19f6e8c1
F compat/zlib/contrib/iostream3/TODO c40d91b8e4051c4fac646e0213dee173e207bcee
F compat/zlib/contrib/iostream3/test.cc b81342fb774937c210f5718ad5783f1eed13f7a7
F compat/zlib/contrib/iostream3/zfstream.cc 19b83e921e89a638ebf978ca2beea7aefd78f9c2
F compat/zlib/contrib/iostream3/zfstream.h 351a3f5bfb93196701cc86b27db866a18ca54105
F compat/zlib/contrib/masmx64/bld_ml64.bat 1d723acf46ecfb6e16922ea55309cee9c77b9d49
F compat/zlib/contrib/masmx64/gvmat64.asm 3c72c7b7f6c82e72b25a700eebccd0a987e7ba7b
F compat/zlib/contrib/masmx64/inffas8664.c a179f3e1a04b5db58eaf6fcc473567794e0391f8
F compat/zlib/contrib/masmx64/inffasx64.asm 249b0329964e35481e8e6217220f474e3076d35a
F compat/zlib/contrib/masmx64/readme.txt 3f2e049fdd6fc4c914a0d9a099dfe735cd0e3b86
F compat/zlib/contrib/masmx86/bld_ml32.bat d2bcdd2fcb5e43ee260f510c25cf2b98318e9b0c
F compat/zlib/contrib/masmx86/inffas32.asm 6f42ac182d48c31346bb6dc04ab74f85157eb0b9
F compat/zlib/contrib/masmx86/match686.asm 34529073d91211b48f2d8d6cad58202f50cb2047
F compat/zlib/contrib/masmx86/readme.txt 287dd9febd8dc4b56b07ca84e4cfcf90d21dc09d
F compat/zlib/contrib/minizip/Makefile b1b85a0f99bf296c58326a80bc0bf220080778cd
F compat/zlib/contrib/minizip/Makefile.am f978d26b0069ef66a560bcba8fd204ed70026f2a
F compat/zlib/contrib/minizip/MiniZip64_Changes.txt cb10d2af06d59532c6d462ab0dbd2b79c55a5834
F compat/zlib/contrib/minizip/MiniZip64_info.txt e1f5511bbdf9715bb2f18e4d24924cca3275fb24
F compat/zlib/contrib/minizip/configure.ac 9f3a1689b5b848b0b21035783601b97155a0a691
F compat/zlib/contrib/minizip/crypt.h 94f289e1b0403b01289b10c6b32ed7d1471fa0ca
F compat/zlib/contrib/minizip/ioapi.c 2846a21ba725da90aa3a67024d8107daa793f5f7
F compat/zlib/contrib/minizip/ioapi.h e71518ae9f172eab44a2d8f52b3f80b0552070d5
F compat/zlib/contrib/minizip/iowin32.c ca25851a0d1dfc989aceb2461dd2d5ec88649b8d
F compat/zlib/contrib/minizip/iowin32.h 4fedf239afafc20e420c5fec678dba91c1dd0074
F compat/zlib/contrib/minizip/make_vms.com 79d9e7c5d124fbcf79bff4509b51c09600b33a34
F compat/zlib/contrib/minizip/miniunz.c 54e7b5392ee6600c91c9c423561941a571aaf715
F compat/zlib/contrib/minizip/miniunzip.1 e925714d46251f192d3266ef4a4cb64d292eb787
F compat/zlib/contrib/minizip/minizip.1 17a13c717cd030c037a407f59d0d14d2c25e4e05
F compat/zlib/contrib/minizip/minizip.c f47c6866b347bfff1a54c680b6c393d7c02e1d8d
F compat/zlib/contrib/minizip/minizip.pc.in 6a19e706e976d4e7b300d7ae294973fa8278ab14
F compat/zlib/contrib/minizip/mztools.c 0f6dad6443b0f347ac6b17563014f50c7b4fd17f
F compat/zlib/contrib/minizip/mztools.h 907243f7cea46d38ad12f6a6d6e01adb4d74f1b3
F compat/zlib/contrib/minizip/unzip.c 279d344d1b214a74bc98409dffb69047e6887220
F compat/zlib/contrib/minizip/unzip.h 4236476513b299f00f9637f7ad3e3631ebdec2b9
F compat/zlib/contrib/minizip/zip.c 885d9e822859c3b6a6f0656e3d0c8c97af6f6fe7
F compat/zlib/contrib/minizip/zip.h 8cef828db4766401b91bec9b47ca56a3118705fc
F compat/zlib/contrib/pascal/example.pas 51c42c32667ef6fc0b4b51867afac971fe11c15c
F compat/zlib/contrib/pascal/readme.txt c47cc3ccdb450bd0d3d1d0e6f52746a2c0ca8541
F compat/zlib/contrib/pascal/zlibd32.mak ddf83b34d4c7d41ace39f96b5cb13fb390c8d2eb
F compat/zlib/contrib/pascal/zlibpas.pas 6366310dff32cfb18b9e950f8c530304a9fd83fa
F compat/zlib/contrib/puff/Makefile 6c9c12d0e19be923abf86e2584a23a781d81cb06
F compat/zlib/contrib/puff/README 8f68ce02019463af0813a0db20c98bfc8e3c2ef7
F compat/zlib/contrib/puff/puff.c 3c31e70c07929fabd5b3454ad8da39e8492633f6
F compat/zlib/contrib/puff/puff.h ce8b988a404446fc8558b198d3cfeabcad6d16c5
F compat/zlib/contrib/puff/pufftest.c e2318f2de8c7355385dca2c9d9422500f4927fc8
F compat/zlib/contrib/puff/zeros.raw 2477f0a2d20cfc6272b91fa36d45c90dcda386ab
F compat/zlib/contrib/testzlib/testzlib.c 6833222dcd2b5ee1c7241f00efa6edfde4991ffa
F compat/zlib/contrib/testzlib/testzlib.txt 89f8964acc535861273f1f156a24ed2ac4cfa37a
F compat/zlib/contrib/untgz/Makefile b31cf680ad6e873da3c897c6b123a5fde4cd5151
F compat/zlib/contrib/untgz/Makefile.msc 3d3a312c38dd7e3316ddb553e894734f42d28205
F compat/zlib/contrib/untgz/untgz.c 260f16a4110f43071b376af97c4119f5ecf902af
F compat/zlib/contrib/vstudio/readme.txt 066affe7fd1e8a9e54ef08d63abee644bb821c03
F compat/zlib/contrib/vstudio/vc10/miniunz.vcxproj 70048ae1ef9a404d49ae943878fd30ddee54c121
F compat/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters 320d0a38475bbfe13314956d0ac7927cb7d1f975
F compat/zlib/contrib/vstudio/vc10/minizip.vcxproj 530a1f4869bfa4cedf0f878fff4480535bd5b1bf
F compat/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters 21845c87ed7730c73605e936de851eaa23222f30
F compat/zlib/contrib/vstudio/vc10/testzlib.vcxproj da5c9e1922fa655c534811676563df7c31fb36a7
F compat/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters 76e2f85e212116be3a0142703c2d68b09b9b79d3
F compat/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj d3a849fce0bca235516932604c5c9bcbd2fce125
F compat/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters d14872425639811364dc265fce04045bcdb11ead
F compat/zlib/contrib/vstudio/vc10/zlib.rc e67b5d0e28bda140346388d087b2c13cf7680a1f
F compat/zlib/contrib/vstudio/vc10/zlibstat.vcxproj 2dfa4c3f4422c58c7e8d142c7fc9c4c11191f705
F compat/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters e9fa98820edf15ae1eedc2101f30c3cef2d935e8
F compat/zlib/contrib/vstudio/vc10/zlibvc.def e869e83b39cc26f7323352081f777b3e72a53c93
F compat/zlib/contrib/vstudio/vc10/zlibvc.sln 4f2ed833f8ff01bdfb27c65d88de1957aea598d3
F compat/zlib/contrib/vstudio/vc10/zlibvc.vcxproj ae00729a7c8f1041498b6fe354aff1713c7fe325
F compat/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters 79d4ef79d8a67a831264e1542d13070619c6eade
F compat/zlib/contrib/vstudio/vc11/miniunz.vcxproj 1b465b8db5b2651282cc0da57a27f76801a05cbc
F compat/zlib/contrib/vstudio/vc11/minizip.vcxproj eafb9f2fa4f89d876f3819e756799b69cb9b2e1a
F compat/zlib/contrib/vstudio/vc11/testzlib.vcxproj 24acf8bef08c985c250f0eb555ad94f7e2f04846
F compat/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj 9c4618693842092678ae885ff0a44139c1f6a4ac
F compat/zlib/contrib/vstudio/vc11/zlib.rc e67b5d0e28bda140346388d087b2c13cf7680a1f
F compat/zlib/contrib/vstudio/vc11/zlibstat.vcxproj 223df1a7f2b79131c10230eb98d2112c93b9f977
F compat/zlib/contrib/vstudio/vc11/zlibvc.def e869e83b39cc26f7323352081f777b3e72a53c93
F compat/zlib/contrib/vstudio/vc11/zlibvc.sln 7fface057a73d5ad706203d3f6f1e37b59bce3b4
F compat/zlib/contrib/vstudio/vc11/zlibvc.vcxproj 947f29a61b08c158a960687a75b548769a5e1d32
F compat/zlib/contrib/vstudio/vc12/miniunz.vcxproj 78d7b8fa17322e2be5d6e36a6b09515e489ba97e
F compat/zlib/contrib/vstudio/vc12/minizip.vcxproj 701b614bbab070519b0837758c69aa0443804eb7
F compat/zlib/contrib/vstudio/vc12/testzlib.vcxproj fec99dd6b063416ef0a48662adad3a421c1a049a
F compat/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj 0e1bb13edb71d4e1857aa02e1075742fa726490a
F compat/zlib/contrib/vstudio/vc12/zlib.rc 2d3f0ee9f7cc18feff62eb78f064f4b4f45415d9
F compat/zlib/contrib/vstudio/vc12/zlibstat.vcxproj 38e7d39967856e2a95661f9b5758d93085178d3d
F compat/zlib/contrib/vstudio/vc12/zlibvc.def e869e83b39cc26f7323352081f777b3e72a53c93
F compat/zlib/contrib/vstudio/vc12/zlibvc.sln 17e1c07bb0a9d02fc3b1a1ec9c4b1d6c5f2ac0a4
F compat/zlib/contrib/vstudio/vc12/zlibvc.vcxproj eca6032321210ba1df7f8743f9fc41c0ccaa1a02
F compat/zlib/contrib/vstudio/vc14/miniunz.vcxproj 453b68e1108b382b4d755c9b08a5af37f538d3ba
F compat/zlib/contrib/vstudio/vc14/minizip.vcxproj f55c663c7ecaea0aa8c53523f887f680388c2cd1
F compat/zlib/contrib/vstudio/vc14/testzlib.vcxproj 3c61f30ff4ef922fd1c14484bb31c8e52e9b9305
F compat/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj 63b622b44827ded02a631bec50e4d1f772f4b799
F compat/zlib/contrib/vstudio/vc14/zlib.rc 2d3f0ee9f7cc18feff62eb78f064f4b4f45415d9
F compat/zlib/contrib/vstudio/vc14/zlibstat.vcxproj 20ee6f367909b5b555c0d76476049b21ec46c2f5
F compat/zlib/contrib/vstudio/vc14/zlibvc.def e869e83b39cc26f7323352081f777b3e72a53c93
F compat/zlib/contrib/vstudio/vc14/zlibvc.sln 5a492dc0bb0a953753f6cff5dd005b3f17f8ad95
F compat/zlib/contrib/vstudio/vc14/zlibvc.vcxproj 89afb166f7b1e1c5b1f97c495f27e2167b5cc0da
F compat/zlib/contrib/vstudio/vc9/miniunz.vcproj 40de34c1a26fe1fa14efb992d217c84bacea7ef1
F compat/zlib/contrib/vstudio/vc9/minizip.vcproj 88d892514b4afba218dec574ea241904d263e29e
F compat/zlib/contrib/vstudio/vc9/testzlib.vcproj 42b4b89271adf184abb594d092bf4ae4c2431ac9
F compat/zlib/contrib/vstudio/vc9/testzlibdll.vcproj 086ea8214cfcb33f3512a847f3dfde6154a7137d
F compat/zlib/contrib/vstudio/vc9/zlib.rc e67b5d0e28bda140346388d087b2c13cf7680a1f
F compat/zlib/contrib/vstudio/vc9/zlibstat.vcproj 235725a6f6285f12aa3ecc248b0afbcaeaa3367c
F compat/zlib/contrib/vstudio/vc9/zlibvc.def e869e83b39cc26f7323352081f777b3e72a53c93
F compat/zlib/contrib/vstudio/vc9/zlibvc.sln 8b46b3778372dbb718fd0f00ff1ee55266b18892
F compat/zlib/contrib/vstudio/vc9/zlibvc.vcproj 82379594550bf43deb4a5114d938ad8ca06fd763
F compat/zlib/crc32.c 88ea76a1b42bfc247680dd50b450923858f945fe
F compat/zlib/crc32.h db9e88b8332953972c9120c73389fa2ce03dd8f8
F compat/zlib/deflate.c 436dc72ccb798bf1ac3e30cd9b580799f8bbb441
F compat/zlib/deflate.h d54ac3369732bc45463c254851809a0062382b3d
F compat/zlib/examples/README.examples f793f7b378233d7e644754e603695966487576b5
F compat/zlib/examples/enough.c 1bcc3f9743bcfdfb77fb6736ece06c666dd1787e
F compat/zlib/examples/fitblk.c b69d9b6eeadd680fe37ab8ba54d781f46fe80420
F compat/zlib/examples/gun.c 66c4ce6e2e4cc86dbe346a7cc1bc921002335929
F compat/zlib/examples/gzappend.c a22e75fe1bb392ce8516794d6e810fd0dfcf8dca
F compat/zlib/examples/gzjoin.c 9c34287cf18b05b761daf6457fc5efbf501358d2
F compat/zlib/examples/gzlog.c 32d9e430fe8725def0a036f86a526e7b3214eaf0
F compat/zlib/examples/gzlog.h deab1fb6de11e3145dfea71254d0c363a3415e04
F compat/zlib/examples/zlib_how.html 35f85759bc23add6a8507c76d05f73131823a9b3
F compat/zlib/examples/zpipe.c b59f2d5676cc135ac0af040d90c3e7b366fcce93
F compat/zlib/examples/zran.c db2e8f8daa77cf6536bf516f194c422f5db8310d
F compat/zlib/gzclose.c 4698124c166f59728db9ae229f8467459b458ef3
F compat/zlib/gzguts.h 637240f7e6ac7249e161083b450fb9f4e1f2b088
F compat/zlib/gzlib.c 4bd4f2745936d396899a7ba09290d6b17fab4a3c
F compat/zlib/gzread.c dfbd4eef919b6eded7e59ae420642ddf8bc848b8
F compat/zlib/gzwrite.c d2e11857ffe5e792f5d89b927bb47ed726b65031
F compat/zlib/infback.c 6b7d6a93d4429068f1af3c10a11de42ece950edd
F compat/zlib/inffast.c fe2fdfb8f51d9f84881cc453ba64f60e3d7c9cbc
F compat/zlib/inffast.h 4fc803c43a562b2b92a97e22300754ddfe44c603
F compat/zlib/inffixed.h 8770ab43c9050b824c646f6e6cee8b3c0628cbda
F compat/zlib/inflate.c d5cfffd5a037697867a78566d583e73f6d0f91b9
F compat/zlib/inflate.h 628d8395fc7f67e6d7a9a6cecba64f6594d64eb9
F compat/zlib/inftrees.c a152b76b78f9245ca67db2729de72d51ecc234b0
F compat/zlib/inftrees.h 3c63a7707d83991f3e074391c047b3136ff3e558
F compat/zlib/make_vms.com dc817ba3a5335de14bde5b81b1a3365734757625
F compat/zlib/msdos/Makefile.bor 85d42a140e556d3b659f7e26c834b5574ea51754
F compat/zlib/msdos/Makefile.dj2 815d082068e07e22195e446ea8a880a1b03e425a
F compat/zlib/msdos/Makefile.emx 2cf0c4a2b98fc59c63bc5daee5d26e26dc15c81e
F compat/zlib/msdos/Makefile.msc 39f6df7982b02e1c8b72298c6cc58bf02d9d9f77
F compat/zlib/msdos/Makefile.tc 98e97dcbaf0e7da0531f7a0367b052adc382fb29
F compat/zlib/nintendods/Makefile 4b2d315c399a4db63f6380e9172d93ad0f500edf
F compat/zlib/nintendods/README f585a53f8a8d0415cbd7166f8c44a11a802ee39c
F compat/zlib/old/Makefile.emx 821cd8913362531cfd915b4c2bcb0777aa7d2f11
F compat/zlib/old/Makefile.riscos 2a3285389419eb244671143cc8c6333c7cbfdd2c
F compat/zlib/old/README 6967642b887ba82a9041bddce73254c42000d4d9
F compat/zlib/old/descrip.mms 940475beeeb76576feb22c2d8b7b97d493ab3d79
F compat/zlib/old/os2/Makefile.os2 4127401d329a7e421112ae14ec4e7dd995ea6e30
F compat/zlib/old/os2/zlib.def 108527bad780aecce1c75efa9210f4b1173f4139
F compat/zlib/old/visual-basic.txt 1cf5886f7fcee4019ef529f8f19dd8000be01229
F compat/zlib/os400/README400 51d77ab7eeaa1d92a57a2a405b6ff985373bdaaa
F compat/zlib/os400/bndsrc 8b47a80813ee6c9afcad0defe645efa3b5998aa0
F compat/zlib/os400/make.sh c5baf22e2de7d01ca1fea649e832f9d827cf6064
F compat/zlib/os400/zlib.inc a911b361a568f6d0e07024149eaa17e9815c8fef
F compat/zlib/qnx/package.qpg 3f3e8a85343976d3f6115797f7ac9e379a97bf67
F compat/zlib/test/example.c bde9391a495a7b962cc63aaf8288b02159a5f68a
F compat/zlib/test/infcover.c e9ced1a5ecc8badd5bc14cd96ef859cc346ec3dd
F compat/zlib/test/minigzip.c 2ff91a2d1d191233dea5741a1aee5095f577a93e
F compat/zlib/treebuild.xml bdcfc455f66ef2b108b0a10c6dbe7837f54f59b3
F compat/zlib/trees.c ab030a33e399e7284b9ddf9bba64d0dd2730b417
F compat/zlib/trees.h 5d8a9c42f902d2418a7e63b539c0f319373e9400
F compat/zlib/uncompr.c 90f92698d7de79341e85bd3ca411a6b165c58848
F compat/zlib/watcom/watcom_f.mak 1a6af1350f3ffbbff44273a7b661563f095b3234
F compat/zlib/watcom/watcom_l.mak e1deb6874b6162d2607dff14c2fccb7a37ce97b0
F compat/zlib/win32/DLL_FAQ.txt 743c9da800bb73a7a30e7c5ce76b5bafd1256ba8
F compat/zlib/win32/Makefile.bor 23262888e43719d398dea043e2bd09c23a9ba5da
F compat/zlib/win32/Makefile.gcc ea8204bc36bb1d25c28e0176eb777d1174965fc6
F compat/zlib/win32/Makefile.msc cecd3f76cf42bdd53d35578484c3901a49e0fda0f8ec308deaaebf6de14a9256
F compat/zlib/win32/README-WIN32.txt 7fec4ff7048956a2c556c199ac4989b9372250b7
F compat/zlib/win32/VisualC.txt ba666fb015a257ab0182f10bc20409a2ec61169f
F compat/zlib/win32/zlib.def 756d27ffaa18b488fca960ff0797bcbc2ffc811f
F compat/zlib/win32/zlib1.rc c21721e51d162fcc8880290001d9e150d3511dd6
F compat/zlib/zconf.h 0ef05b0d12bf2cfbbf1aa84cff0e8dcf4fc5b731
F compat/zlib/zconf.h.cmakein cbd5ddffb39904669e115e270b23138106bb0ac2
F compat/zlib/zconf.h.in 0ef05b0d12bf2cfbbf1aa84cff0e8dcf4fc5b731
F compat/zlib/zlib.3 8b7c3c050d8cfdd1e8455c98a4767bf98752cb74
F compat/zlib/zlib.3.pdf 8c3040d78eb9dd1bdc83d687f5b601465ff22583
F compat/zlib/zlib.h 473b29ab06e2be461fe4aa74952fcb9bd08d9fa0
F compat/zlib/zlib.map 513816d1574deea0e966ad82ed0d304959a5ad17
F compat/zlib/zlib.pc.cmakein c80d6efe2a2991a1836ee797f75b12c9d60b6783
F compat/zlib/zlib.pc.in 3ebc107b34d82b134e9f5933c2a569eb6e952ce4
F compat/zlib/zlib2ansi e9859eecf47ae66280573d73969c061989615134 x
F compat/zlib/zutil.c 2f1fcc93488ac84acf984415b6ea0bd63c72aa49
F compat/zlib/zutil.h f32dab3880d47eca1b71c308cf6542b32941b23c
F configure 239cde01aca7fc63a2903f85bd2a6414189f1bd4 x
F debian/makedeb.sh a178ffe4795ef9cc3ef3550572c20fe4110c8f87d9368f06526714ff12e33823
F fossil.1 740ad69dfd64430b1e31d22ac799a6086c622ef8
F setup/fossil.iss 57e01e1feb0198de025417c0a98f1d4b1c444f53
F setup/fossil.nsi 806b01761d5d42543d1c90b95b927c0ea8b251bf
F skins/README.md a32271fe6907cc4c0cabb9d24c1dab16b89dbc64
F skins/aht/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/ardoise/README.md b26ddcc8204482ac1deccdf7aff37416858fe887d85368de2ec1d6565a3a1a3d
F skins/ardoise/css.txt b2a400d5de4746ff72b78e0164257f00118fdd85a77a1b554c12d2a3339be240
F skins/ardoise/details.txt 143655ad0389eec5976d4b453ad9a194c72fcc430d647efe7c033c39db28b428
F skins/ardoise/footer.txt 8a8ded401c096c7c3434f29c444d506f4b2f15b25c79ec6373253be6561119fa
F skins/ardoise/header.txt 865aa98f76a9cc1f4d9727eb71279635be1739f11d923fd2f920d8c734fd48f8
F skins/ardoise/images/active.svg b568a0cf2e95b028f0bdeca14e954ae8c8553c0fd1f780c8c7ff927e698cb072
F skins/ardoise/images/addindent.svg 5caa3367aa14e1a782756136a5cbf8ab4c081ad160223ac36ab3bd947ba0fcf0
F skins/ardoise/images/addindent_h.svg 0be1d0c453d17ac69f74d04b489e9c7d15d4e4b48b99e7ff144d0c6b444503c7
F skins/ardoise/images/blist.svg 4fc17498b3faf14ba29a65845e3e1ced9912d22dd0e500732384fdc948b89b0d
F skins/ardoise/images/blist_h.svg 84a008bb4deedfd8015aaaf0f9b7d750a1012e677ea273c219a4e2e7e2ad3fed
F skins/ardoise/images/bold.svg b833d2a3a33b9cec6a3dbcc46eb6112ad45bb0646c209475502a9107946fd456
F skins/ardoise/images/bold_h.svg f5c2024d3a5d5dc975c9997f1ae5495439e371b4e54e8ae99ff3ad79c080b887
F skins/ardoise/images/calign.svg f56baa7849c3e9d2667bd33fdb4b9389f01b14719f64004135fe312940a64336
F skins/ardoise/images/calign_h.svg 74f13e3fb547dc2baf7fd0ac32d78cc29432022c73e5599dd8b3e9776f7cc86e
F skins/ardoise/images/clrfmt.svg a2d862a79c69a337077b9acd3abf11e8b759b3994c55d5c9e6a7b5d8d3eeb8c2
F skins/ardoise/images/clrfmt_h.svg b16d0418cc6c3fbc30455e29e476695e7dd464ceae22583542227a9a7bab1e3b
F skins/ardoise/images/delindent.svg 281ef0c3a547f163ea0b361bf80eae7d8a35ca6affa5bab70d10b417493b727a
F skins/ardoise/images/delindent_h.svg fc49edac3b3f04d797f1f921f759ed450eb14a71cfd9e2b4a0c641610049973c
F skins/ardoise/images/dir.svg 665202d45e5a2d2a35c37fa2a6badb669414e66c0f8be7bea749ac6808ccb47d
F skins/ardoise/images/file.svg fafc1773980623aa7739b3b52c8565551846accddcbd46b33e6096af924d3a13
F skins/ardoise/images/italic.svg adc8853b9d726fe7155628af9b364f85545f0ab853d7de45b88f283233b3bb1a
F skins/ardoise/images/italic_h.svg 6f86459341f48fcf75f9351384eb1c16613d4d951b4ee41ae26d60ca6102a9d5
F skins/ardoise/images/lalign.svg ac170aa3d7bc472c4bfd9fba1d7a856e1fca472a7ed11865d79f2ec3d967fd11
F skins/ardoise/images/lalign_h.svg 06e1907a90b33f07d2c6ed71a38532fb0763f021a23ce89d44fef23649beea78
F skins/ardoise/images/link.svg 391d44002a3c51d325da89bb359ce34a5666e4de31491baada337cb7d2296459
F skins/ardoise/images/link_h.svg 29011423b32c722ef8d212f45a1889f73e3c06e0c3adb18a3fdb0edc6c53f2fe
F skins/ardoise/images/nlist.svg 3bf02d9d5dc980824f1efb4d985c0a2579073c7393122f110aa2b78ce6221185
F skins/ardoise/images/nlist_h.svg fb2b41e2f3f9cac3adaec37a1111f5a2d7533980b0cf3e10adaa15f27d8c9abd
F skins/ardoise/images/quote.svg b11cf09b54a843acd93280470c3d6405c12d68aa0c069365c3040114206ad6cd
F skins/ardoise/images/quote_h.svg d2ef378666da20c31905a11e3d7289825011e37eac1e2da0f9ae21285924d461
F skins/ardoise/images/ralign.svg 99b1cc4b49ee050b3f2616f7ba9a84261bd092de378b10da3d09cf4525b5ca77
F skins/ardoise/images/ralign_h.svg e6189dee3e4ea9fb3e6fc9653ee7b6488323f9d6b07e9874684d3154baec7738
F skins/ardoise/images/redo.svg ffd21528d9b4991a6de95de67ac7af18f1280c5a3a0049ca654b9b7a1715301c
F skins/ardoise/images/redo_h.svg fadf985a2982428f8dccc49cfd0c38bf8d5439d00c74326bcab90befc3557e2e
F skins/ardoise/images/underline.svg 2a27aedc404d8b676c66936a1fae2cc23fcbc42497d5a8d8a416154e22cdce84
F skins/ardoise/images/underline_h.svg 49d3842506a7446877b5b0d5103e6e635ac19a88f4d3e8e308aa4238be6d6163
F skins/ardoise/images/undo.svg 8cfea1df340c45c8eae776a481ca2660e912e927834a908d1be89e92cf9907a1
F skins/ardoise/images/undo_h.svg 38b29b94a0f0682faf7ed5118de5341b3c90cc528a24c108627e96612293b5c9
F skins/black_and_white/css.txt bb0fc1aa0f0c1a78d9ab79c3852d94e706728188
F skins/black_and_white/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/black_and_white/footer.txt b8103a3b864f4f0900825f135256c5a48b5323bc1760cc8378da9304e329066c
F skins/black_and_white/header.txt ec18f3a6c388abe77cd5512f016db0f872d607002577ea9b8513591181509a0f
F skins/blitz/README.md 2b86027936aa1ed69d0ccc413868aa886cacb45f
F skins/blitz/arrow_project.png 2b2958e36ec7fe54836ab50d6c194789461463d0
F skins/blitz/css.txt ac788aa98c0bab31850723017ebacf0f77123eece529a72eb4fde747da96307c
F skins/blitz/details.txt 1260bc474e730cd32e4e86f7a346e22a1268cc8f
F skins/blitz/dir.png 4a210b2afb16584e6093478f77025da7e7b83a57
F skins/blitz/file.png 0d20b3bee95152a6358e1878a9bb07cc6a0f975d
F skins/blitz/footer.txt 011e6ad3f5e427d093653db114b3326d009a8d6e19a35b4a95dc7a0bf2dbd2aa
F skins/blitz/fossil_100.png fa1dca72090a10f4caac3e6bbb6fe5ca6f776fc7
F skins/blitz/fossil_80_reversed_darkcyan.png c053b47fc8bd5e525ecefc69307ce66b6316fb7e
F skins/blitz/fossil_80_reversed_darkcyan_text.png ea0c0176d0dd3d3e372befc160d0f081e1817a34
F skins/blitz/header.txt 0e923740c0adc3695d8a51c8a4972c8015bbb2b0d62ea26a062c1fa64b5251d5
F skins/blitz/rss_20.png 7d659cf7e4378d16198ddd4e984b4073e1fac901
F skins/blitz/ticket.txt b35ac95d03bb2da2f10634bb16cb7bdc67062b2b
F skins/blitz_no_logo/README.md 24829897e941d1cef4f8b8d6291c86d9cfe17cd7
F skins/blitz_no_logo/css.txt d5850faf375f498f6469b8ff306a858069c9d19230c2c0f1f0abca4cedeff4aa
F skins/blitz_no_logo/details.txt 1260bc474e730cd32e4e86f7a346e22a1268cc8f
F skins/blitz_no_logo/footer.txt 011e6ad3f5e427d093653db114b3326d009a8d6e19a35b4a95dc7a0bf2dbd2aa
F skins/blitz_no_logo/header.txt 457ec1cc8d021b32a0a94510b8a7a08624ddc4cdedb5cc4c73b42c96316dd6ee
F skins/blitz_no_logo/ticket.txt b35ac95d03bb2da2f10634bb16cb7bdc67062b2b
F skins/bootstrap/css.txt fa5b97ea68c3a1e285504a60a937c0086309fd26da3464cab47a2ac0ae3b2c31
F skins/bootstrap/details.txt 916a4c696f0865d103980df3ae8425297d70af09
F skins/bootstrap/footer.txt 91521fa28ee8968f29126cf43746045934a17c234ca9961e4db03eed5a19bdbe
F skins/bootstrap/header.txt 720093d7f53b6ffc28a17105d59d0f2cd666bc3cefbd65ad1d41cc8589974af9
F skins/default/README.md 5914478ee55d86877ac6342bf704ffa5f87fc354
F skins/default/css.txt fc48018f2e87f3f7d868154400b50a5cfb5fcafab81b93b16af3786722e096e4
F skins/default/details.txt 916a4c696f0865d103980df3ae8425297d70af09
F skins/default/footer.txt 7dd553d65672572ea94a53ba3f858f3dcaf3f771889987a73d81c149cf7e9c52
F skins/default/header.txt 04e7e5b1fd362db83176d0e7439150e82c8619bcb5bc78abf68fdc5a9bcb160d
F skins/eagle/README.md d6b7398b43bb8756316431d51d7efc8c3239c913
F skins/eagle/css.txt 60f4ee7478d4bda978f3547d58cdbe69aa54e4e1c50d892e3cf7a07f30a15cfa
F skins/eagle/details.txt 9515535a2768af2990a6a3aa0fbbcb628a36670b
F skins/eagle/footer.txt 24b5c3e7fc83baa7360455f251de275a4bf98a73a0d0d0bd8ebc93eff0e40814
F skins/eagle/header.txt 3165161ccf7cab7a1bf1b30af260dd7c3db6ee317005e828661825683d9bbc3f
F skins/enhanced1/css.txt e7c642d607fb6a1972e61b6c02e830f72af3c8b9
F skins/enhanced1/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/enhanced1/footer.txt 24b5c3e7fc83baa7360455f251de275a4bf98a73a0d0d0bd8ebc93eff0e40814
F skins/enhanced1/header.txt ba7b0b422e5bdb89ec9d982e7898236d28864de8e9855d96615dee8058d959ce
F skins/khaki/css.txt fe1d5a7fa33fb49986825bf2eddba5c42ab6c636
F skins/khaki/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/khaki/footer.txt b8103a3b864f4f0900825f135256c5a48b5323bc1760cc8378da9304e329066c
F skins/khaki/header.txt 60236c503da04b2feebaf29670d73cc5f4c4874d787a38473a57e70cc20f683b
F skins/original/css.txt e7c642d607fb6a1972e61b6c02e830f72af3c8b9
F skins/original/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/original/footer.txt 7dd553d65672572ea94a53ba3f858f3dcaf3f771889987a73d81c149cf7e9c52
F skins/original/header.txt 125c69e193a1d3648f458421dea9aba5f1cebdced9ddc899db6386d3ef61e0be
F skins/plain_gray/css.txt a1a70c6c0fadd1ccd0f47c953c4ecb90ec66c355
F skins/plain_gray/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/plain_gray/footer.txt b8103a3b864f4f0900825f135256c5a48b5323bc1760cc8378da9304e329066c
F skins/plain_gray/header.txt 2fa4da404e8086d4de59c71e1e803766bd00d772c6e0d8b2bd7b108521c1f07b
F skins/rounded1/css.txt 280f19dfec8424ac18ab6cc6c55532dfb7d533f6
F skins/rounded1/details.txt cb5c331f05a6a2f242eb14ea2bc6c48d6a32cf197f12d6aed0b4031f45aa745e
F skins/rounded1/footer.txt b8103a3b864f4f0900825f135256c5a48b5323bc1760cc8378da9304e329066c
F skins/rounded1/header.txt 2a26f9c8a90f2614ea7ab46af1ae878db9720e19ec925f9012b20d0a3961c3be
F skins/xekri/README.md 4acf7362d3bae2959b35f0d07694128a081f7049
F skins/xekri/css.txt f0f6c6e8788205465fd2a980ee92aea1de3ccfca2a8a73b1a433f9cfacd97c8d
F skins/xekri/details.txt 8c1af2cc39db2dfb43c1b9df0cdcfde0d9a25432a2dbb130b1af0f4d6889631e
F skins/xekri/footer.txt 0280277f0fc52ebeb749cdd7ba32fb184e2c6aa9536123d189b0f6089b701d42
F skins/xekri/header.txt 87636805a1489c17d6b54e6f22eccf215944dd6bd1ef9a17b54816272058a3d7
F src/Makefile 102203d824d778194b79680bef8a553d5e6d9819
F src/add.c bb2fc0bd2fdc4cc60dbba5e870ebd3690b5d64b0fe96404771174941c8f0d2ca
F src/allrepo.c 71ee4f72ac00f9fa598b209c9daa610e45770f02b1b0202edc81cea47f7dd34b
F src/attach.c b5b1578354a9fa26db82b9f4206ec5bb2e82d66fd718e9e5f18c5e46b5520ef4
F src/bag.c a7eb89018c959ebe74f36496ff742d58610220b2
F src/bisect.c 0dcb4df51ea7e86523b1a4f2d62b1f05a89ae380
F src/blob.c 3bee63a73731b64a38f5d8816365c78799d1f67f5fd85c57ab3160b4ba2edbbb
F src/branch.c 6a4121e390e6dd397f0b32700d8fa9900648235ac0bbf98ae5fef2dd9194fdb2
F src/browse.c 10353b275aa4a217995268a7cc8846ebf735f84cd6c4f7112a000fae0a9fe09c
F src/builtin.c 96b6a95fe20ae5bb9a7c5f59b719e5cc56a534220cd8c4ee7e970e6516e24191
F src/bundle.c c87eb0ee5b326ca742fd51010bf01c29a75600b2f7fca1d30c28ec5722e9b841
F src/cache.c f29373b765932f9c6435da4bbfc4c0d442ffa715dce25f9bf295085a80099d83
F src/captcha.c 9ba164112a34201a3717c29060bf76d672daa31f
F src/cgi.c 3f901a4f5c7eb032468a96a087a338ac48313a3270444016807e25bab974510d
F src/checkin.c 1a07ea7271b35bb6328d536b5e374d0729b3446dffc19f589a6109cea917489a
F src/checkout.c b27d81846a1b2f8c961c9ea4eec93c15186432de63d97e650e413e96f0557604
F src/ci_edit.js 9316a271fc9608fa1f232617181e97ea8a03edb23749fdd98f8f1845c41596e7
F src/clearsign.c 3b01d6eb2260a699248a031bb89a2fb69e6f9f3bc34f09f45439e380cab3530a
F src/clone.c 39756ecd3586daaccca6ac5445657a183aaafcc83b6802c47d7e3795fc4d3157
F src/codecheck1.c 4b4bbebe7285545db72ee94406086a3ddbf1839367df76e7672025428465d43c
F src/comformat.c 4d18073b1a8e98bd1b6ae6794df703744be590c69d4a507e04c8d86ed435c42c
F src/config.h d9a16a4931ebf2dfd6ac29cca9d89689f7fbcd858fd37ebbe8fe52851c9db934
F src/configure.c 49176c95e281ba0fd63e8c4a3f7a2b4b5bdf0d6de33aef44ec504b0bcc385044
F src/content.c 3e0cc7864e829d35e0f97f489c833a292308e6e3952e991a95beac661f4036f5
F src/cookies.c 63e81a4d7741a9419565f50e4e508701db758d1ee41019136e1948edc06142f1
F src/cson_amalgamation.c 17939461f660bf81b8b850ada89323ae3f7289ebb51608f13d5dc8323b897e0d
F src/cson_amalgamation.h b58a1f01438ac0fcba8cbdae7a32bcacd02ca0d7
F src/cygsup.h 70accd0c38dce40aa828cb321dffdde1f49f4e8c
F src/db.c 6d07632054b709a56a3ee9e5340d67fb120e80d99fd6dc261fb64c67606bc759
F src/default_css.txt 75d8873223cc2dd20e9e72ef571f5ace421d29da235f1419d1fcf687ac3483f3
F src/delta.c e5c5c088b05441b7c84d7cdd1ee6fc072e111fc000f063041b9ee3d7ed1f7b93
F src/deltacmd.c d8e304784745ba9378253392423f44f0d381d0a87536011a0ffd9a56c1897752
F src/descendants.c f9c804bad784f73ee6179ba46fb92af360461f3e
F src/diff.c 3340923c7d0ab525f21b193a83b3b657330333bb8ebd1a3f501ad827599f154b
F src/diff.tcl 5541bc7846d7707e29ea9f1ecaf85d8e4a52e51d7a4d9e160c869a2a467117b8
F src/diffcmd.c 5ccaa1ef9e8d9bc427f7c9a144aa76d87ad917a7a3235dda72964b3f26e931fe
F src/dispatch.c 15e80d7d8df0f6988cf702de068a06af7690305f36a8fe318c9af29c0db982db
F src/doc.c 799bde12f69112d8a9cda65e6b6eab94cdefe060c9ec9faf56884f75a51724e8
F src/encode.c ea4254b5c4c17757056c67ebe5fae2404356892b
F src/event.c 5d4a12252f765b5a1fa43fc6ddd087e79dfad65e3533369c1b47deb5b4be52d0
F src/export.c 20d1516bc49301bf0d0016711c53da231e90687b250187708513a144e1342930
F src/file.c d1d99096ad0283231a4565a545462b803ef2586687b99744d51c3af7aa3accdf
F src/finfo.c 49e66558585988b2602a528a67fef4decd256ccc17f0d9db4194ce355c8989b4
F src/foci.c a8a068559ec5ccc173aa669c8d0d28fe4fdb51abfdb3d42a893615ed174faa98
F src/fshell.c aaa11e134f984ac5c349b81324dfd5d3bf4e0825
F src/fusefs.c 67d03f1c78e07f27a7f24fef9048fa57df939e564b329014933bbbfa4469959f
F src/glob.c 2209933ddc94df7e019a24c088ebdde67c115bb5
F src/graph.c f0940a16303989bd0c6a883dc90899a489ef16edc08f0f9cbb4b500d4730aad7
F src/graph.js 9ea5a0cf6f41161870d0c77616e88b2e2ca45a8eec2601593883306749c4c686
F src/gzip.c 43cb7e9eaf4e32983a6368bc0b1f49765ab8ea2a0e9fe2114dfcd07a3e5d1067
F src/hname.c da9e0c4b9b08b17cba1d1fd2273becfb9873e6b0af6183848dcc40ea44fc1ea8
F src/href.js 2b485ac67f5ba9917da5f1ea679eee581a8e08a79dfbfb811c4833586330163a
F src/http.c 7de3f16908f0f49cbcfad625513c130c0aef8bb889a5902e0fe9cccfaf893a85
F src/http_socket.c c9dba13158d28e3f7b904b41a00f83d2172856eeccae31270b7c9ab4a55d8776
F src/http_ssl.c 55266e0d4b2dd2d03af062c1e0e2a06c70d28adf6bb82b13f18a7d4beb543423
F src/http_transport.c 43bf993a931c1a6cafb051566e06c841173ec350dedc0cb6887e112bc05a147c
F src/import.c e48f2f2e0095795aeabe7220514c8694393693b853150c47f6d6792921def3f1
F src/info.c a07635417a9e9e2aba8830900e57f036693832f204cd950f0d15a1e8ec5e5535
F src/json.c 20b82a01a75413ba43f41df627b85bd7d651d56842680eaab21752e7b3389ac6
F src/json_artifact.c 6530c919e6671cbec7f72e6240c361229e21d8f4
F src/json_branch.c be9d259fbaf431e38630a430e232e2988552ccfd27b156340cd5a30cd6230582
F src/json_config.c f53fa14ab92730d30be35311b52a17848eeabe44
F src/json_detail.h 76bc835feb671a5001d4a20bd3f0c8882f228382
F src/json_diff.c ece93153083c388397620c7c7c8b56ce986b85c6
F src/json_dir.c 749c78497a1ca3d29659e760a8ecb482bf1a090e9ce6dd01f4e55d6abf062295
F src/json_finfo.c 1061327153acf9d8f29228ae27c98e8f0c089955
F src/json_login.c f446046e74c6cc8da4c791dd34459998c7f88ed8
F src/json_query.c 15f7b943478b3fa4a423aefb5a022e6e9513abc7
F src/json_report.c abda9047e6031f55078e6254f9c1dd50dc54f2b2
F src/json_status.c a59f343f3f361a6932caac35a9b14173eedefc0cab8cf57f30d3ad395f9f5cd6
F src/json_tag.c e2b68b9735e706e9e47fb07f063abf7c94da2d76
F src/json_timeline.c 5a9ce59def16a55b7affbf834dd1e13d876efe76
F src/json_user.c 779af89a12af7c0c228d0194fa564379ec77ac76
F src/json_wiki.c 67ce76b80f4571bb928c4f0e1beec3231404b9c3
F src/leaf.c 1057c3a87c455020b6f8df483ca2241e20ea20c7
F src/linenoise.c ab8f5fa33327842cd43959d06c8ba741f3dc467f00bc2a2790d5c1ac48276f7b
F src/linenoise.h 7c5879e56e29c0d61801a28dc7a6fbe21c63c9e20d8f842c56e767bdf24c32ee
F src/loadctrl.c 76592cbc8dce7f6d6aeffef6b77975a5ffdf6e1f
F src/login.c 8f07f96589451ba414fa42c28b2f77bf3a713e5cf9e40abd364ec2bbb4854826
F src/login.js 3a7accefb8586f3f4587d5bb34eeb393caee7fff9500951d653f3a401cf65b3a
F src/lookslike.c 2f276c62fe8e83fcb2b8a41b1e75e50713c4c165c92111c63c0f0171e6828ddf
F src/main.c 267f42740eb32b10939fba64790d67f728cfaf362ebc5fa4c25051ed23cc372e
F src/main.mk 24214bf65f5855c282632f76b620074487ae7a52dd45a07e342e8153e9722d2d
F src/makeheaders.c ef97646ffc78b8400b06ab9751925bcc7b28dbc1
F src/makeheaders.html c09a2e625c04fe6ac83bcbe148af321f75a956eb
F src/makemake.tcl a51f2efc066f05fe62d750761e8187c4a4f7097b56bf74c42e26e10297f0d501
F src/manifest.c 2668a7564265b469182f48645de7c219624866f7c2f0eb5dfb6bb3b010f0b5be
F src/markdown.c 2cb7007279db7ad8e16f8c822d5ba27f59b4af2dcc0cd4ba87cce3e4303d5969
F src/markdown.md 28d326a7f52366213a2803a1889e5b41c559de15cf5b7d17ae95167d9aafb98d
F src/markdown_html.c 9bf56751d43414003cbf08b5a162d50a53df2c4f48951ccf9152119f39629789
F src/md5.c a18f2868a3b8932c4fbf8c2659931e14cdee1858
F src/menu.js 8a3650ced67d6c31241eaae42efc5796fe7bcbbd581adf5a284ea1dbf2415e23
F src/merge.c c93323af5cc35c307406ca0e72d778344b73edd1ee82c6d323ce80ff8a86a960
F src/merge3.c 3ed67f9d2a6e9a0b75f0eb319c0331b18b1879a8361c0f38d49dd17a930fbc9e
F src/miniz.c 63d5f0addc835c68e41b4321719fe5153a2a6c45
F src/mkbuiltin.c e09eeef79ae18d9b98c8d5e3d977f5fa6b5cfe6a1650fc57063f253561ac502d
F src/mkcss.c b3807ccb28720dab540eef38058ede1792c3bc755d65ce4ee98f2f6de647517a
F src/mkindex.c c1d4a4459bb68241a99877dd202fede5c24321fede2cbf5d27b400575304349a
F src/mkversion.c 6e606c3a895f71b35a878e817104b5e5eb056ce47925e341fde567f2448e9aa7
F src/moderate.c 2540f90b20778a4d62156a3b4af962b401d4c89f
F src/name.c d99ecd151807f79cc9b5376b894d0bd9d4b3d561bb0f8905cee9451c8b0b5a16
F src/path.c 45a49dc7f3e16bd8c07f113e2c833fb40d16bb3bcecbaa3b1f4d4f2e675dab61
F src/piechart.c 38855af6e32847eacf6e5accbfc4af0898d154a1
F src/pivot.c d8c6f6e91772e17893f477402da1efb431b85b8fbf7a938b64a905e04e376a15
F src/popen.c b2ca46105d929ed8329e45c2d526f68538ebf405
F src/pqueue.c dc6f71d9256f7087a85715cb05e78faeb151f026
F src/printf.c 3a56bc49bc7ed5cf1e7a1818ab55c3e3658b8179fbf3d264a5654ad3baf1a417
F src/publish.c 25af837ab073dfee967da752d6c78a0ed45f936c
F src/purge.c f698cae20e3740796f6ffa65f69324f27f19d96c
F src/rebuild.c e094c603fc58ee957d1e9dd3832a19534f61a28280104900cdf7f1f2c0c93d2a
F src/regexp.c 11ed4c905c2e471efe9c1e9c4650004ad91d6ebb
F src/report.c 7af9983a099153c1670ea3a51af5a0823fba1cb083b748847be3617b22a351f6
F src/rss.c 98ec416bc5870b56e8ddfffa6c9f928a298e4aaf
F src/sbsdiff.js ba23c0a2370ae40ca587e5398d0889a34ff0591ba7b0675a0015c527642c74d6
F src/schema.c f72846e4a8e2929fb8b48220a8cd9744e5210986
F src/scroll.js da8de899c727fddec31a99ff0b9b714a87db53ed8798f90bc642326bee7b429e
F src/search.c f38733fcd6cbcc52a70ea4b15520ab787f7dd4e5359e612ce53b125381cdfa49
F src/security_audit.c 39296d083197aaf8f70b2144abff9342a0c4f94a2fd11ae2351547b86c1b1c0d
F src/setup.c 7f26f9dbd511ea1522c3c31d5ae7ff63030eb57b3552d6ad855d2435f59357be
F src/sha1.c 19c038afd779378da9d49ccd461b67bfd453bc0d75c9e4ebcae2e835f505e27d
F src/sha1hard.c e90831822166f79ff8a9830aaaca56923fe414a2
F src/sha3.c e2b57aa73b52eec8ea9a6692908cafc0ae49d8ef756984b68700181d9f2beb88
F src/shell.c 10cf7a31348db4f4103266bb1d69b0d04298cf9391c5d9644785f8424756d8fc
F src/shun.c 5c8afe7fffcc26a7cbe497420b15e2101ba64f5c3a75a01790257b622a77930d
F src/sitemap.c 60b9f066776bd05db01f7db31353f4cae2df4faf
F src/skin.js 4169dc16f8e0cfaf88ee92a6a3d8b73e697681141b4db7cb0b1cdd18cb53fbc3
F src/skins.c fcbd5f57c0f2357e9dbde1295c72d62d4deb99dc1f57f1c505da1f22bd49af05
F src/sorttable.js 305b1187e44046264d2da98f8e1d53bc078373e3d1fc603049d48067c4125c9f
F src/sqlcmd.c 031b91c0ee221f41795bbb95e4ef9f6590478dc1468ee767e3ae744ff3381849
F src/sqlite3.c 206df47ebc49cd1710ac0dd716ce5de5854826536993f4feab7a49d136b85069
F src/sqlite3.h ba49aa5758c70c8b078f774736c13bb9e0e3f34e153fe016e523b5208e5f7784
F src/stash.c 8f0bc283ba1099458e48ecd4c059a85bef34aef02066d972f61c165f2c47177b
F src/stat.c 39a33f66a4d803c036f73993bd043f5484816b54f8cded166b07c100cc4097fd
F src/statrep.c c2509dfa66f9cfea8ce839f36691b061d146e0574e3f1864d0ecc7503f22d114
F src/style.c 535c0054a650e2a4ac778598dfea0e5107f74895601165fb411489f8d34ac108
F src/sync.c 8b50b5df163adae3fc79281fd1f7a2ecbd3a4381
F src/tag.c 24c77636171affc22088c1a7d7e608822d937e9747cbd5cd48f51dfae70a00c9
F src/tar.c 69a1c4327e8b2b9f0c35714559d55d320f5cadabe7a5b40e309044d453901973
F src/th.c 2aeace70627de71587d04e4324a1989fe40ef4a6
F src/th.h 2abe3f3d6c8a3f2c53d859a37965fd92821db6b0b81171e35e26648453f7575b
F src/th_lang.c 728f38a941c451330d69de1872a8a89fa0c4cdb267eb804ab7e9b92c0d42ffc6
F src/th_main.c bba65d7b7871ab7046107848650b5e8e72dbe30763f86b07b9bbd98c30dc791b
F src/th_tcl.c afa334f0b17fc01f8fda8bea281c51305d7c6f7f2c7ed4c190dc5d1a2b80c326
F src/timeline.c 73a4e743732cb8026987b7cf237a4b440cef7c4a5c24c60963ecd7c17fd00cfe
F src/tkt.c 26ee209c0b9d34340ff668f9326cdaa4560ed2976364e968f1b52edc2c56baa6
F src/tktsetup.c 164102f7943181021ea5b4122deeb4a7c1ec4c4c
F src/translate.c e0ba36f347faf5b5105eacc8e42e3f907febfe5abb0401f2227dec26cc60a5f5
F src/tree.js 85fc4dc5ecaf2bf2b26f294eaf8dbb9aca5966492cf9ff0d8edfba5835c14f0c
F src/undo.c 0af37ce94fb9984a23737e0289a9b61ddf647fc6f37aed5c1ce94fa5b2c74d5a
F src/unicode.c 1a3686d1851ac88eeeef3428c9ace3c471b8286fb785606ad63b800c8e688926
F src/unversioned.c 23d297dad48770f9825c007c9eba26968ef0d12528d514a3cbae2198122e03f8
F src/update.c 073b324327d22aae32023f6337c1393a15621683ef5e2920e30a6982237c0372
F src/url.c 61b100991bd4e1375ad67ca8204beb4603f6076e668d2d5fedc6331fccda2005
F src/user.c 9374dffc58dc0ed3126f725db4f7037dbd80fc55b47c70ea2e5cb57e9007fda7
F src/useredit.js 240d73d306b6829a491121970e8a863398c108b4b9d1c6f73c8a5ae37e0b6a97
F src/utf8.c d4d73906b07ccbb1e8037f090c1b02c8ea925d72b8f6091efa822060c4484657
F src/util.c c4d7bb8b1f7ebfc030775d985dead4da8e6ac7b3509660e5261b2c68fc828378
F src/verify.c 5799825d086464bb9e19e69ffeec84a710d1681b
F src/vfile.c 8c891c745e280c0235bf0f57d3aeff2f34e823498601aeb4c9e0766dd964f960
F src/wiki.c 2e1ff7a1f89ad2796068bf130d663eaecafb7ec69ae170181e42f2c42d6b66a5
F src/wiki.wiki 4c7b322f6a638307560e7649df4e60a577c02497ee980fe214ddd5badd45f7ce
F src/wikiformat.c cfb84a3dedc243be87f60a07b3f6eca5fbe482c6975c241521bcc8f56b7337ff
F src/winfile.c 6a822c13410839851e2e9a4e52cdd0a083fe3fed33dce28ac5beb62fe1091d7c
F src/winhttp.c cac4936b567c5b6f8c22b0c10c74400ce6f327d61d1a41f8a41e88ef17079e65
F src/wysiwyg.c cc88a482a2fdec2fcfaf432e6bdb1ac444ebb1d4
F src/xfer.c 668af421d7b956373a7834ad5cccfb98d2020342949aee03ef05c60ac72e68fd
F src/xfersetup.c 5e6e1cfd2481329bf58ff0551926c11fd8470559
F src/zip.c fe405d65fed964880834c1e66276017886a687933106377bdc5fd0dfaf61b7a3
F test/Greek-Lipsum-1.txt 55659c6e062994f462feae602db99df94d5a4d83
F test/Greek-Lipsum-2.txt e3b3df6e8dd627b516e18105656345352a471b0c
F test/amend.test 83966725550e04f80c40a52012074f91ef6d22cbd57f51e17e931eccee6663e0
F test/clean.test 4ea7e9a6eb25b06a543cec6ece2c21103afb1338
F test/cmdline.test df50383ebf00e7a444e29f2f755867f843c37df7
F test/comment.test ebdb00c7ed84b3d124e36caa948409ae05612564
F test/commit-warning.test a850532cb74a091a13aa24a9b59f232e6566c3d7722dd29041f17578665930c4
F test/contains-selector.test cf46a39b3c1ff72d2fc674f4ccbeecfb94add7d2
F test/delta1.test c3ea182ab06554a35203285774606ba37fdc620d
F test/diff-test-1.wiki 1ca941eded0cbf5aa81212d86551512d62717515e0553ddf8a11f15b4603973d
F test/diff.test bf9b349dd6f33022ef2aef2894d3057e2daaf507
F test/fake-editor.tcl 11b5ddc9629fefb4dbc32806f80211440600c744
F test/file1.test 9b2ac578521a7097017c64b8877f6fa6ca0904f7
F test/fileStat.th1 e3e30f7b46488c26215a6d713be36ad4ed595132
F test/fileage-test-1.wiki 50661a791a5037d949534b42cfb1c8245687803fa46894f84a1ad458264d8501
F test/glob.test e135d6e1333452beece53619e9a67cd9224ab00c
F test/graph-test-1.wiki 3dd1bdc5866649041dd619badea330eee20fb12c542b3e97fd35943c0bcd7abe
F test/json.test 6f77d48c30c6f4f0b9f4d5a985814d5780641857e715374b301dd41ebcd0e75c
F test/many-www.tcl 4f2bfa076db6dde808b6155b65a6f1016aac0391
F test/markdown-test1.md bbb3b935b672bd27981d677d35849a4177daa41b
F test/merge1.test 0f11a55b5d71fa668b53ffc4cdeb23997e9cb042
F test/merge2.test 038091215ec2f2b53157599acae6f03dcf91dd12
F test/merge3.test 70db9ae7c679efad5d5b371114a3cc609818e01a
F test/merge4.test d563164c477885bcaecb6ea28e824b698bdd57bb
F test/merge5.test 00a16dbff1c3ffb981b7bb7ede93dcf03e77a42c8fddff1fd632a49119d2dc65
F test/merge5_repo.sql 742ca843c4a2cdc7f72c9e850aa0cac80c1457aa
F test/merge6.test 50b1c16adce0050bc946e3d64b14df9ab82f37e0
F test/merge_exe.test f888647a3305bf2a4ddd77f947e486ae72fced09
F test/merge_renames.test 2ecb429af3732900352738bbd4e5b532a2d331bb
F test/merge_warn.test d4a98c6ff14e4bb142d784f96c88d152d9599529
F test/mv-rm.test 6a60863935f7a9e0223ccb9421729d7677fa1f9f
F test/release-checklist.wiki 671add634fe96d221bc04bc4d58ed58fd8581bb2
F test/revert.test 303d90ca6a8f221d671daa90b3f9a07a874e7ff0
F test/set-manifest.test a4caa5745c0af2dc9bb1a2f0902e7991818f725bb168355cae5da8724e2b3b75
F test/settings-repo.test 7c2617c7deea7d245d927df5688d26365e3bca9b
F test/settings.test 1877083a0fecb044a698e8ca60d7f9ff2b4f4450
F test/stash.test 4ac356770b8ad5a013f1927d678bec077cbb387616e67133a4050a177aae0373
F test/subdir-b/readme.txt e8e5bf5191c37755b77f68dc971880cacc72ec09
F test/subdir/README.html b73b2bbc042aa2d246733582ac74e96ae57f38360e1f9bf96121eca09ab71b55
F test/subdir/one/readme.wiki c532caf18a2b3e0f946340bc3e26e58c5e56fe64256975c6ec641e374496bcb0
F test/subdir/one/two/three/four/five/six/readme.txt 99ae38744ac72af06c059e59cb5fa636153c120b
F test/symlinks.test 9ead8cede3906559325b19560124bd30396f7c0e
F test/test-page++.wiki 0f8b7780a1e441e32feef0e2ae15c75a355e52a1
F test/tester.tcl df32381d274820e8d9350196d6294a473e4a56dfe149dfd74763e2e537b614f4
F test/th1-docs-input.txt a08c24abac1d1592a1116f8396a53f03a47f25d3
F test/th1-docs.test 3d2c5998f4b499ffd762e836425309e3ba7ed554ba3493534b6d82f68b33557d
F test/th1-hooks-input.txt a08c24abac1d1592a1116f8396a53f03a47f25d3
F test/th1-hooks.test 5923feea5dc7516f082f85bd813fe7db6afebdf8127f2aa2a4b765ac271c14f2
F test/th1-repo.test 985c195a770c571b0d3bb30bf4390fcf13fa55d0
F test/th1-tcl.test 76e8c9e232702be54a41f425ec3fe373a6d8f9eb
F test/th1-tcl1.txt c60e664b138a2189b637c254d55a05819db1521d
F test/th1-tcl2.txt 9f7e7ea7cc6c75df78c5efb761d10a4e8e354401
F test/th1-tcl3.txt 208d6e2a9a68969df9220f6f6c190402a62b4919
F test/th1-tcl4.txt 655d0d0f27a32dc058b15f0e89b739aeb6f50a9f
F test/th1-tcl5.txt 7d1fc8a760f4521e187489ea7f520a43c8c9c4d8
F test/th1-tcl6.txt 8fa6cba360402c03caf0d9f4b61e7fcb818cba33
F test/th1-tcl7.txt 99d669388e668cd4da281782a96fa165895feeb6
F test/th1-tcl8.txt 2a865ef58e16647b30545b6d970ae99e4e1576af
F test/th1-tcl9.txt e27a24481044739c1429ff02a7b3b4b8d92d7673
F test/th1.test 223ad61b0bad1385a75233671c4ebab25a801b26a2ffeccebf5ba5fe73b5bb75
F test/unversioned.test 454f7010d05252a07c6b196545c55dc05e14e8287ba87dbb3a80a82f7773040c
F test/update-test-1.sh 6812a27babef50e8888641f52936a7db3d3c9d6f
F test/update-test-2.sh a976664f21390761543dcd93b290bd9beed96667
F test/utf.test e2489218e27ea0c643185707e2a4fd33db59f13b
F test/utf16be.txt 53a0f53370156db87378709ca00deeb560681ec1
F test/utf16le.txt ffa2c69c1239ec3ea46ef5abc04210171ed88719
F test/valgrind-www.tcl b298cdae985190042a1cf83782af99ec28875b03
F test/wiki.test b56d0e136bff056946b98cbff333036fb5c68778
F tools/cvs2fossil/changeset 1c99ad8ca9b2f049266d63e0bcc5f26196c72627
F tools/cvs2fossil/cvs2fossil df73a69477f7abbe7d25d905d4604d01b567ef26
F tools/cvs2fossil/doc/LICENSE aede671429a0e8a5cc2fa35dfe5bcadd5c281b58
F tools/cvs2fossil/doc/README 6d655c3f823db2a177d32af6d904ca0426a74e9b
F tools/cvs2fossil/filerevtree b6e112463408bbcf51287f58dd997e256f3cd390
F tools/cvs2fossil/getmemoryseries.tcl a93703a60d1c154bea2a5b8f2a66a46dc9a511d7
F tools/cvs2fossil/lib/c2f_blobstore.tcl b63bce5767afb8a5e50b6ba5be213a0dea3a88bf
F tools/cvs2fossil/lib/c2f_cyclebreaker.tcl 59ef48a9b8851e680f238e1243e86c05a81428c8
F tools/cvs2fossil/lib/c2f_file.tcl 43f6a2b4c2c2c71a7eb62dea1168cd3f4f33c75b
F tools/cvs2fossil/lib/c2f_fossil.tcl 55a6ec9011f9335bac80172c4d49a7989ef2f116
F tools/cvs2fossil/lib/c2f_frev.tcl 5f8c3fdd03e593a12ac063ba37cc16df5e14ec40
F tools/cvs2fossil/lib/c2f_fsym.tcl b11a935cc8d103e3ec455b2acf48136b5cafcc83
F tools/cvs2fossil/lib/c2f_ftrunk.tcl 116792654a5a7ee6745262756b7cd9a028482eb6
F tools/cvs2fossil/lib/c2f_gtcore.tcl 6d553315880f6054c1bf453a26a91732cc1dc504
F tools/cvs2fossil/lib/c2f_integrity.tcl cd21bd4aefba1cd07b909cbe338e9ed1c5aed69f
F tools/cvs2fossil/lib/c2f_option.tcl 737f972b127681c537c8da03f5703ffc65fb59e4
F tools/cvs2fossil/lib/c2f_pass.tcl d98651431b7344ed481cdddad18890c249395ed4
F tools/cvs2fossil/lib/c2f_patopsort.tcl 32dd51eb8ce14ea302c3a9af1cbc3860156b629c
F tools/cvs2fossil/lib/c2f_pbreakacycle.tcl 4f1e51a06458ea4aa1559b8020a79a121faa595a
F tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl 9b0d3d53604c99a5f3339f92232ab45262dea23d
F tools/cvs2fossil/lib/c2f_pbreakscycle.tcl 9943947d7e001b1c0b42717a06423c0101e6011d
F tools/cvs2fossil/lib/c2f_pcollar.tcl 7d94939b63ae5f2e2291d3a6f3d816dad9a12126
F tools/cvs2fossil/lib/c2f_pcollrev.tcl 643897c97a0558c46ffa98837c3d9f097d0269a6
F tools/cvs2fossil/lib/c2f_pcollsym.tcl 67107f6d59dba2c74a01e1d34d5199effc4f4829
F tools/cvs2fossil/lib/c2f_pcsetdeps.tcl 627fcc1355eb6c029d49ea28250ff245ffdce592
F tools/cvs2fossil/lib/c2f_pfiltersym.tcl 77d474466172f34ed9e8f27f56c0b0c62d4e2973
F tools/cvs2fossil/lib/c2f_pimportcsets.tcl 69adaad9d5ae91590e823a712d26a8c480f154cd
F tools/cvs2fossil/lib/c2f_pimportfiles.tcl 6318a84484d6875333bd2d8a387714f045304cfd
F tools/cvs2fossil/lib/c2f_pimportfinal.tcl 47b2c14f5346beeedffa9ad5a663fe04ff6947fa
F tools/cvs2fossil/lib/c2f_pinitcsets.tcl 14fdb6d32b359b01b3edbfe66f0b3f2a069a14f2
F tools/cvs2fossil/lib/c2f_prev.tcl 207987843799049d608f20e5f50bdc38b4751b21
F tools/cvs2fossil/lib/c2f_prevlink.tcl c7d0900794b2be39e003522407571e41c8510f73
F tools/cvs2fossil/lib/c2f_project.tcl 15a57df0aedec07e8b23bb6292325219285e735b
F tools/cvs2fossil/lib/c2f_prtopsort.tcl dbb40b4225992f9ab267571f366724966bf772e6
F tools/cvs2fossil/lib/c2f_psym.tcl 472799fd794f0ceb9bcfe1e8c006fd824f4cf126
F tools/cvs2fossil/lib/c2f_ptrunk.tcl 46554f57369d41e50025fe58297217585ffb4f0e
F tools/cvs2fossil/lib/c2f_repository.tcl e021cb0c0ba26a1f03dce672c10c353c44c28cfb
F tools/cvs2fossil/lib/c2f_ristate.tcl 29b3696463cb158a41291ad1c3bbab2e9f9c4116
F tools/cvs2fossil/lib/c2f_state.tcl 98813ec9b67baacd5de24462a0c6a60ec8f9d09e
F tools/cvs2fossil/lib/c2f_wsstate.tcl ab8cd1f9b92a776119fd83e9f725f9d789373e34
F tools/cvs2fossil/lib/cvs2fossil.tcl d530eb41003784a9a3fefbfa8e61103334ceafd6
F tools/cvs2fossil/lib/dot.tcl a07b3e3a20b9cf0896f3d585b6350ab367b8c44b
F tools/cvs2fossil/lib/id.tcl ad0171bebe08b12ce2197e444b1237e9dfabf68a
F tools/cvs2fossil/lib/log.tcl c2ee0c05740bbe0195ac286a145ce740bad7bb2f
F tools/cvs2fossil/lib/mem.tcl 53c7bc8f5596f0ecdef7567731ae8ef08b408426
F tools/cvs2fossil/lib/misc.tcl b4a6c1a89033c497001ff7db53f337921dbea56f
F tools/cvs2fossil/lib/pkgIndex.tcl b810fde76079e77e850013d65ca6cf1a5ea62a36
F tools/cvs2fossil/lib/rcsparser.tcl 6518936d0c3152fb53024c91aa587de15b354262
F tools/cvs2fossil/lib/trouble.tcl c6cef7555cede649dab283c4a15ea0d2ec71d042
F tools/cvs2fossil/lodtree eadeb78341c0c59f1dec0f0db0383bf797f5ca8f
F tools/cvs2fossil/showg 3b5479d1527a33cf1316fcab935a127d86cf3532
F tools/cvs2fossil/symboltree 6c405827269eda1089a1ffe58e03b4657a7bdfa6
F tools/encode_math.sh 86eb1215d85a3e796788b6a4c2354b3f096f5f88
F tools/fossil-autocomplete.bash 1135105ee18b95823944e2fa425806d3bc0f4252
F tools/fossil-stress.tcl bd6f62946ae2105e737e3b1f2869be622a54d08e1352fd6fea6857d2bc66fc5e
F tools/fossil_chat.tcl a9de1adfac21cf2cab4406965e24b10781fb59e0
F tools/fossilwiki 73bd40b6d491798ef8a1ccfd467f3e7fe8ba1e0b x
F tools/man_page_command_list.tcl 63a5fe3b28e652e09b31fe21d1fdf30f86e77a5ca403c9ab2a388591c3d36f8d x
F win/Makefile.PellesCGMake 547423a19e764acb69c1958462c7ec9bb610e331e7dc7b85f4e9b32ecc295de2
F win/Makefile.dmc a0127613891228f228186dbac24f345a43933807555c97174998004c21db63a6
F win/Makefile.mingw c8b4cbfb9dda122df940b624e5c9552c3f092c3e0f43e77bf6c11155cca127dc
F win/Makefile.mingw.mistachkin bee9dda9d85d33e0df8e6f486d2dd06b443e9c90f0578a794fbd9d648b8a302b
F win/Makefile.msc 2bbc590a08583e2f9ebaf1c45d3b8fca474c0dd46d9adaa83c969bc640864c5e
F win/buildmsvc.bat 890e5795707de561a6d19e98448c1bef268ac42b
F win/fossil.exe.manifest f81a7d376816e7c6c38495b475e7fa54ed09b002
F win/fossil.ico 01423a2d71e01558a94d6cd6525f6a98977f29ee
F win/fossil.rc a38a9b922cb35c4b2f91c7026d3dc1556999fd32
F win/include/dirent.h aa960e5590e08266ed4bc9acd94776ebd6a0eca13799a43cb52aaf7b15f2f859 x
F win/include/unistd.h de304af8b95751f25cf1e45ed25a4a500089b191eab9e51c2eba9fb8d6bf0709
F www/CollRev1.gif 3ca46d72571bc56d114d467ec8d291541c9ae932
F www/CollRev2.gif 581afba0a01d5fd62e06ebbed88e76e51a5d1d6c
F www/CollRev3.gif 996e26f2d6182a95e4e0781529cd34178e3bfa25
F www/CollRev4.gif 2344026a4ce78a39b198ccbd3accd554798aa915
F www/aboutcgi.wiki 47d45f0a0a0ffed614f222296fe3c7fed4ebb6b09123d1b9051cf5a17adc84fd
F www/aboutdownload.wiki 99aa5e1f5bb489c7e981e002a054d90121dd6463587a5d45f28df6b9e3e7ab09
F www/adding_code.wiki 5254f0811146471cf1cc5dde727822745e554a9c
F www/antibot.wiki 1d8222c3769a8cd4402989d72db1ca2cf8bf34c64c7be7b2a4032e72297ec084
F www/apple-touch-icon.png 68adbb71243e6c7c4eddeeeda339c76ef77084e5
F www/background.jpg 85f8f27f45a743484488e6c5cf0bd060137973a8
F www/blame.wiki 59ddc91b415597b76217177835ecd2f46bad1e39
F www/branch01.gif a288153196b8f3fc5fabe00c92101000717cb491
F www/branch02.gif 55c3567748366595e1678a1c43448a9370ff105e
F www/branch03.gif 3840bdbb5ed0f57104089c2888ee286d4c79a17b
F www/branch04.gif 908b4fc1688810f78250e0a269741165ee31979a
F www/branch05.gif 4808cbf6e0a4095580fca0f56a35f16ba975dbf9
F www/branching.wiki 6e80e4eafd508ab0bfe76b353936618de457f6da
F www/bugtheory.wiki 786bcb265b8043c41f5985167d88b57866e5a652
F www/build-icons/linux.gif d816e94fb198073feb570da5d28e4106b70bae57
F www/build-icons/linux64.gif 522442bc41cc8399b8957ab3cb1af4f5fe46b11f
F www/build-icons/mac.gif b25243f405328861f9a8736fb1141c65752ce193
F www/build-icons/openbsd.gif f6eeddc2b1bcb0b5fbcac7a6be1afc98d4444b48
F www/build-icons/src.gif b82914bcd9de7a1511db313dafdf37cfda0ab055
F www/build-icons/win32.gif bfc3d418ac068df331d80494e8f866c40eb744c3
F www/build.wiki 80a214d6378f721f1052ef2fd57021dbbb1b7c3ca64da7cf7e3b4971255b3b4a
F www/changes.wiki dcf99606815a9e6118187059b7e2ea7656da101ccc18592d35271e8145fca7ce
F www/checkin.wiki 57faeb0861430c6bc83e179bf4e254c6e982370b
F www/checkin_names.wiki a57ae91363c133141e58c7cf330ebfebc2b67058
F www/childprojects.wiki c3efec1c46a523d4dc489f68b99f4c354af64873
F www/concept1.gif 6bb98f69a2cfe883ad6dbfbb70561b2282a563e1
F www/concept2.gif ff6165d1e94186362309c951622c8dcee6edcf2c
F www/concepts.wiki 9da3052a9631db957ece0a1dee2b7228c294ea64
F www/contribute.wiki 51d8338889e42b57668b1116bb3fc6ab9df52864
F www/copyright-release.html 7ef67c07ace84fd3f4e06fc35c9085c6063da870
F www/copyright-release.pdf 7caa5bde467050c092bd63656e164f29950d6434
F www/custom_ticket.wiki 237e66bca7ae40c77285357967bfa6728e79a73d
F www/customgraph.md bb10359329d4e7bd8a1e068944fb7fabe2b61695
F www/customskin.md a6788c63961d104e57126e5cdf7ada0be703f687
F www/delta1.gif fc676aedbef6ec9670dca75fd815371f6fbd7143
F www/delta2.gif 305bcc078165737af0fc8001c37b42fca568fa72
F www/delta3.gif ecdccfa728b9e060d8d9541b7851818e4ff435a2
F www/delta4.gif 235b08d75ca98d34ba8b5bcaf38aeaf975ec51b4
F www/delta5.gif 990001794fe052e5163bc5423ad0968fdc9ced92
F www/delta6.gif 325bffc28f96aa9a73696e260cba68a1668ac31a
F www/delta_encoder_algorithm.wiki ac576e788f4a96212a59e81761e4d73a9cc8cfbd
F www/delta_format.wiki 7ca5bd7bfd6bc8e3df067badc393129d30363562
F www/embeddeddoc.wiki 5072dbdd2c7902da176bcdd6c7e7bc044c1960757bb9ea52941de5dfc4f0b6d9
F www/encode1.gif d75ce317b5f940c6f557cf76540de2aa1cde8c0b
F www/encode10.gif 36b56c4055dc85e63cf28d7b07e0004b20e2a7bf
F www/encode2.gif e2b657c112227549b9424508cc0753bf2f82b03e
F www/encode3.gif 1565ebf8d7579785bc05ce80434b2eae1773a813
F www/encode4.gif 7879afadc59db61606e70f88ad387587ccb6242d
F www/encode5.gif 90a35e3626b0196878c728954fc832a3c7d58f2a
F www/encode6.gif ca683ebcfa2a32946c9d7f613ab1ceb50cb450ff
F www/encode7.gif 5bb9e59f86d8dc85bb08398441081864b73405f9
F www/encode8.gif 99cb8d91c37c30f7ebe05506980579263e017315
F www/encode9.gif 7aca8807ddf4eff0b01745b0dc3012cea104a817
F www/encryptedrepos.wiki 79a109d3a75e86fd99419de4b00f1937043db9a6
F www/env-opts.md c2bab5d2cfe289979b83ff8409e6b156f102bf477a1e71e6002c8761172fed70
F www/event.wiki f5a9cc34b11e8224e503e16137ba0f966f151551
F www/faq.tcl ce69c67e15fdac73ba83f6b9d214a7188fc04922
F www/faq.wiki 86cf76ff52e06d06ed4f4f82470192286323eee2
F www/fileformat.wiki c5e5f4a278c4babc29f071a07d177b1dddbfbac3
F www/fiveminutes.wiki 0f0faaf4eb29a6652660d32516f9079772fb25da
F www/foss-cklist.wiki bb6dbd96ca6953843b5a68b86e896fa08a4e1122
F www/fossil-from-msvc.wiki f73f0667b1f268e61e276007ad000c4205e740ba
F www/fossil-v-git.wiki efa753cfb11f8a7daee31c4b2417402acea3953282d150ca47bfa733d79263f7
F www/fossil.eps dd303bdc475ef1aa3b1cfca07b5ed70397370394
F www/fossil.gif 590c4da59ebd76b65da0c9ba610d661f1bcb0146
F www/fossil2.eps fb372ab5154d581923bf0f4044644af259991872
F www/fossil2.gif f64284050bf93f1b74fd05ed00de9984b79193b3
F www/fossil3.gif 0fa38d60655faf3da20c019583981cf6f71ae6fb
F www/fossil_logo_small.gif 02f9b89eb0726d67bbbb6a6532a3a427ad8e1e83
F www/fossil_logo_small2.gif 2a25c3c9b9f266b884e98fe0f73da2341e6fe733
F www/fossil_logo_small3.gif 6c2768dcb62988ab402a8b0a3d9bd290cbe6c132
F www/fossil_prompt.sh db68e2cae431b9e9f5dd672e2f56e2bde5a57d2a
F www/fossil_prompt.wiki 8ea400e45e41184d859cf9e3cc0186c5fa81c5be
F www/globs.md 023c06fa69c833dfab2128d07070e9d58e34da5f0c6a58d7e55e0de12e1a6fdf
F www/hacker-howto.wiki e30361cfbc08462444e4ea943b977abe0b952dbe
F www/hashpolicy.wiki 901e234166e31d8cb6634577b3fe266f41453ca1
F www/hints.wiki a64405f03f9fbe23d0e29b4842adf2d8ad1afacb
F www/index.wiki 45df7f31bc78ec89a58cb77f4f9362a11c730addeec952037e6d4ce598c94fea
F www/inout.wiki 027298d991dec3a79886f7818f86cd190ba5e70b
F www/makefile.wiki 840768ac36c6075cffaab1a60d8d8b8a4a4096391bdce5e3e0ea75564750fcbf
F www/mkdownload.tcl 86e774d93eb5c92cac5e7328920987feedf9356d
F www/mkindex.tcl 675d640d6256ade2b008e1ce8cc146b7ba68d05823b271b2632397a015e37d4d x
F www/newrepo.wiki 8b05313b8c7b3ceb71dfc1209d5b7df299d3a719
F www/password.wiki 135405d9e2261e759d0d85fd2104848589c485e6
F www/permutedindex.html 8fa0b5807aee65975705f6cbd6722e148c10fdc0b8f223f32c18b71b1249fce6
F www/pop.wiki 9f3459c3343265fed252854bfbab49afd2008797
F www/private.wiki e5109b9f545d4b1ded991057a7b2d80630f89712ef67a568e574b1809106f843
F www/qandc.wiki b8b6f9668796bde63440e64dfd40a176766dd78e
F www/quickstart.wiki afc5e41e06cc2d54364016e3d0d7dff1209b082d
F www/quotes.wiki dcb5b56c3438294218ccb7f0c6f7c81c98f747a46472516e1d6f17dac9f5c783
F www/reviews.wiki b5733a2b7f6aa8495493b4b43eafe98b388e6acb
F www/scgi.wiki 227d2749e84d696d3f5266888196dfe4c4451098
F www/selfcheck.wiki 02e46328cb1a6308a1e07a502456acf4e508d264f11942b1427bc5427a2a57eb
F www/selfhost.wiki aa4fe1f210e20474a4c5e0f0ab47be9860b060fcb0f1bd1a3a327e05f3a7a6c0
F www/server.wiki aeef4081f8bdd4ae729e2a5dc9aa841e0156a0aa6cb76eb72f3c2f85eb646fe0
F www/settings.wiki c53581bd6cd8769ddbacc24ce41cea06a4267e1a
F www/shunning.wiki c7d6e43f27b9d65774b46f6b4aba386225c24716
F www/ssl.wiki f381ee310d2953040b9172a19de4d865f5885a97
F www/stats.wiki 6558a7e417d5e9d29271c26ebb3195dddec31855
F www/style.wiki 63369a9a6e5eb0c968e7d3fa1854919c42ff19d3b930a6da60cb4caa964cd0ba
F www/sync.wiki 54f36924056d9b854a509ed1a87d15595605bc403f1dca18231439c44619a298
F www/tech_overview.wiki 202a068495f341712b040ed2c672b4f1a39f4959ef4a71608923b5eefd494364
F www/th1-hooks.md d03bf09f51a061c17f39eefe6149dae36930da5e905e8bd38d610c20b143f6bc
F www/th1.md 8fe09653d75c61780b48ef9e24c18984bbd657befb9495fee0bf3f6ee99842d9
F www/theory1.wiki c5a3a5c9c81a94787d20eacd5184f8afa0c7519efaacd75f84633d129763644a
F www/tickets.wiki 717ff5a436834bf0ec42f9501216449c40b938fe
F www/uitest.html 7d7bd8198689c266012398d1df12eb71ab98031c
F www/unvers.wiki a75ea510c408c0bb83c396afbe72948b8b2202cd
F www/webpage-ex.md a77371e2e4e14255f647e2c257232a5b4a528553
F www/webui.wiki 411350e0bfcabd3e3e8a750d5e69ba840ce50e45
F www/whyusefossil.wiki 730056ead695df82c7aa9dd099cf34b4bfbfd473
F www/wikitheory.wiki bd20172d783835606043b15bba0c69c9f606a87b
F www/xkcd-git.gif 1f9bc44ed41cad3f5ac18f21e3463e3390b53b29
P f390552d0e5c0174560772f81096910178185165b15fea2ad4ed101049d0c8a0
R 1479a816adf739cdbbe4bfbdeeb0fd59
T +bgcolor * #d0c0ff
T +sym-release *
T +sym-version-2.5 *
U drh
Z ee45093a20ca2906fd50424eb1400fb7
# Remove this line to create a well-formed manifest.
fossil-2.5/manifest.uuid 0000644 0000000 0000000 00000000101 13236644756 0014741 0 ustar 00nobody nobody 188a0e290419211f7928be4e808d58331c9fdd742d73caa7818c2ac0b66b605c
fossil-2.5/.dockerignore 0000644 0000000 0000000 00000000241 13236644756 0014724 0 ustar 00nobody nobody _FOSSIL_
.fslckout
ajax
art
autosetup
bld
compat
debian
fossil
fossil.exe
setup
src
test
tools
win
wbld
win
www
*.a
*.lib
*.log
*.manifest
*.o
*.obj
*.pdb
*.res
fossil-2.5/.fossil-settings 0000755 0000000 0000000 00000000000 13236644756 0015407 5 ustar 00nobody nobody fossil-2.5/.fossil-settings/binary-glob 0000644 0000000 0000000 00000000255 13236644756 0017620 0 ustar 00nobody nobody *.gif
*.ico
*.jpg
*.odp
*.dia
*.pdf
*.png
compat/zlib/contrib/blast/test.pk
compat/zlib/contrib/dotzlib/DotZLib.chm
compat/zlib/contrib/puff/zeros.raw
compat/zlib/zlib.3.pdf fossil-2.5/.fossil-settings/clean-glob 0000644 0000000 0000000 00000000262 13236644756 0017414 0 ustar 00nobody nobody *.a
*.lib
*.manifest
*.o
*.obj
*.pdb
*.res
Makefile
autosetup/jimsh0
autosetup/jimsh0.exe
bld/*
wbld/*
win/*.c
win/*.h
win/*.exe
win/headers
win/linkopts
autoconfig.h
config.log
fossil-2.5/.fossil-settings/crlf-glob 0000644 0000000 0000000 00000000141 13236644756 0017254 0 ustar 00nobody nobody compat/zlib/*
setup/fossil.iss
test/th1-docs-input.txt
test/th1-hooks-input.txt
win/buildmsvc.bat fossil-2.5/.fossil-settings/encoding-glob 0000644 0000000 0000000 00000000130 13236644756 0020112 0 ustar 00nobody nobody compat/zlib/contrib/dotzlib/DotZLib/*.cs
test/utf16be.txt
test/utf16le.txt
win/fossil.rc fossil-2.5/.fossil-settings/ignore-glob 0000644 0000000 0000000 00000000130 13236644756 0017607 0 ustar 00nobody nobody compat/openssl*
compat/tcl*
fossil
fossil.exe
win/fossil.exe
*shell-see.*
*sqlite3-see.* fossil-2.5/.project 0000644 0000000 0000000 00000000307 13236644756 0013722 0 ustar 00nobody nobody
fossil
fossil-2.5/.settings 0000755 0000000 0000000 00000000000 13236644756 0014112 5 ustar 00nobody nobody fossil-2.5/.settings/org.eclipse.core.resources.prefs 0000644 0000000 0000000 00000000067 13236644756 0022407 0 ustar 00nobody nobody eclipse.preferences.version=1
encoding/=UTF-8
fossil-2.5/.settings/org.eclipse.core.runtime.prefs 0000644 0000000 0000000 00000000060 13236644756 0022051 0 ustar 00nobody nobody eclipse.preferences.version=1
line.separator=\n
fossil-2.5/BUILD.txt 0000644 0000000 0000000 00000005220 13236644756 0013652 0 ustar 00nobody nobody To do a complete build, just type:
./configure; make
The ./configure script builds Makefile from Makefile.in based on
your system and any options you select (run "./configure --help"
for a listing of the available options.)
If you wish to use the original Makefile with no configuration, you can
instead use:
make -f Makefile.classic
On a windows box, use one of the Makefiles in the win/ subdirectory,
according to your compiler and environment. If you have MinGW or
MinGW-w64 installed on your system (Msys or Cygwin, or as
cross-compile environment on Linux or Darwin), then consider:
make -f win/Makefile.mingw
If you have VC++ installed on your system, then consider:
cd win; nmake /f Makefile.msc
If you have trouble, or you want to do something fancy, just look at
Makefile.classic. There are 6 configuration options that are all well
commented. Instead of editing the Makefile.classic, consider copying
Makefile.classic to an alternative name such as "GNUMakefile",
"BSDMakefile", or "makefile" and editing the copy.
BUILDING OUTSIDE THE SOURCE TREE
An out of source build is pretty easy:
1. Make and change to a new directory to do the builds in.
2. Run the "configure" script from this directory.
3. Type: "make"
For example:
mkdir build
cd build
../configure
make
This will now keep all generates files separate from the maintained
source code.
--------------------------------------------------------------------------
Here are some notes on what is happening behind the scenes:
* The configure script (if used) examines the options given
and runs various tests with the C compiler to create Makefile
from the Makefile.in template as well as autoconfig.h
* The Makefile just sets up a few macros and then invokes the
real makefile in src/main.mk. The src/main.mk makefile is
automatically generated by a TCL script found at src/makemake.tcl.
Do not edit src/main.mk directly. Update src/makemake.tcl and
then rerun it.
* The *.h header files are automatically generated using a program
called "makeheaders". Source code to the makeheaders program is
found in src/makeheaders.c. Documentation is found in
src/makeheaders.html.
* Most *.c source files are preprocessed using a program called
"translate". The sources to translate are found in src/translate.c.
A header comment in src/translate.c explains in detail what it does.
* The src/mkindex.c program generates some C code that implements
static lookup tables. See the header comment in the source code
for details on what it does.
Additional information on the build process is available from
http://www.fossil-scm.org/fossil/doc/trunk/www/makefile.wiki
fossil-2.5/COPYRIGHT-BSD2.txt 0000644 0000000 0000000 00000002754 13236644756 0015064 0 ustar 00nobody nobody Copyright 2007 D. Richard Hipp. All rights reserved.
Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the
following conditions are met:
1. Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
2. Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other
materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation
are those of the authors and contributors and should not be interpreted
as representing official policies, either expressed or implied, of anybody
else.
fossil-2.5/Dockerfile 0000644 0000000 0000000 00000002617 13236644756 0014253 0 ustar 00nobody nobody ###
# Dockerfile for Fossil
###
FROM fedora:24
### Now install some additional parts we will need for the build
RUN dnf update -y && dnf install -y gcc make zlib-devel openssl-devel tar && dnf clean all && groupadd -r fossil -g 433 && useradd -u 431 -r -g fossil -d /opt/fossil -s /sbin/nologin -c "Fossil user" fossil
### If you want to build "trunk", change the next line accordingly.
ENV FOSSIL_INSTALL_VERSION release
RUN curl "http://core.tcl.tk/tcl/tarball/tcl-src.tar.gz?name=tcl-src&uuid=release" | tar zx
RUN cd tcl-src/unix && ./configure --prefix=/usr --disable-load && make && make install
RUN curl "http://www.fossil-scm.org/index.html/tarball/fossil-src.tar.gz?name=fossil-src&uuid=${FOSSIL_INSTALL_VERSION}" | tar zx
RUN cd fossil-src && ./configure --disable-fusefs --json --with-th1-docs --with-th1-hooks --with-tcl --with-tcl-stubs --with-tcl-private-stubs
RUN cd fossil-src/src && mv main.c main.c.orig && sed s/\"now\"/0/ main.c
RUN cd fossil-src && make && strip fossil && cp fossil /usr/bin && cd .. && rm -rf fossil-src && chmod a+rx /usr/bin/fossil && mkdir -p /opt/fossil && chown fossil:fossil /opt/fossil
### Build is done, remove modules no longer needed
RUN dnf remove -y gcc make zlib-devel openssl-devel tar && dnf clean all
USER fossil
ENV HOME /opt/fossil
EXPOSE 8080
CMD ["/usr/bin/fossil", "server", "--create", "--user", "admin", "/opt/fossil/repository.fossil"]
fossil-2.5/Makefile.classic 0000644 0000000 0000000 00000005217 13236644756 0015340 0 ustar 00nobody nobody #!/usr/bin/make
#
# This is the top-level makefile for Fossil when the build is occurring
# on a unix platform. This works out-of-the-box on most unix platforms.
# But you are free to vary some of the definitions if desired.
#
#### The toplevel directory of the source tree. Fossil can be built
# in a directory that is separate from the source tree. Just change
# the following to point from the build directory to the src/ folder.
#
SRCDIR = ./src
#### The directory into which object code files should be written.
#
#
OBJDIR = ./bld
#### C Compiler and options for use in building executables that
# will run on the platform that is doing the build. This is used
# to compile code-generator programs as part of the build process.
# See TCC below for the C compiler for building the finished binary.
#
BCC = gcc
#### The suffix to add to final executable file. When cross-compiling
# to windows, make this ".exe". Otherwise leave it blank.
#
E =
#### C Compile and options for use in building executables that
# will run on the target platform. This is usually the same
# as BCC, unless you are cross-compiling. This C compiler builds
# the finished binary for fossil. The BCC compiler above is used
# for building intermediate code-generator tools.
#
#TCC = gcc -O6
#TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage
TCC = gcc -g -Os -Wall
# To use the included miniz library
# FOSSIL_ENABLE_MINIZ = 1
# TCC += -DFOSSIL_ENABLE_MINIZ
# To add support for HTTPS
TCC += -DFOSSIL_ENABLE_SSL
#### We sometimes add the -static option here so that we can build a
# static executable that will run in a chroot jail.
#LIB = -static
TCC += -DFOSSIL_DYNAMIC_BUILD=1
#### Extra arguments for linking the finished binary. Fossil needs
# to link against the Z-Lib compression library unless the miniz
# library in the source tree is being used. There are no other
# required dependencies.
ZLIB_LIB.0 = -lz
ZLIB_LIB.1 =
ZLIB_LIB. = $(ZLIB_LIB.0)
# If using zlib:
LIB += $(ZLIB_LIB.$(FOSSIL_ENABLE_MINIZ)) $(LDFLAGS)
# If using HTTPS:
LIB += -lcrypto -lssl
#### Tcl shell for use in running the fossil testsuite. If you do not
# care about testing the end result, this can be blank.
#
TCLSH = tclsh
# You should not need to change anything below this line
###############################################################################
#
# Automatic platform-specific options.
HOST_OS_CMD = uname -s
HOST_OS = $(HOST_OS_CMD:sh)
LIB.SunOS= -lsocket -lnsl
LIB += $(LIB.$(HOST_OS))
TCC.DragonFly += -DUSE_PREAD
TCC.FreeBSD += -DUSE_PREAD
TCC.NetBSD += -DUSE_PREAD
TCC.OpenBSD += -DUSE_PREAD
TCC += $(TCC.$(HOST_OS))
include $(SRCDIR)/main.mk
fossil-2.5/Makefile.in 0000755 0000000 0000000 00000005316 13236644756 0014330 0 ustar 00nobody nobody #!/usr/bin/make
#
# This is the top-level makefile for Fossil when the build is occurring
# on a unix platform. This works out-of-the-box on most unix platforms.
# But you are free to vary some of the definitions if desired.
#
#### The toplevel directory of the source tree. Fossil can be built
# in a directory that is separate from the source tree. Just change
# the following to point from the build directory to the src/ folder.
#
SRCDIR = @srcdir@/src
#### The directory into which object code files should be written.
# Having a "./" prefix in the value of this variable breaks our use of the
# "makeheaders" tool when running make on the MinGW platform, apparently
# due to some command line argument manipulation performed automatically
# by the shell.
#
#
OBJDIR = bld
#### C Compiler and options for use in building executables that
# will run on the platform that is doing the build. This is used
# to compile code-generator programs as part of the build process.
# See TCC below for the C compiler for building the finished binary.
#
BCC = @CC_FOR_BUILD@
#### The suffix to add to final executable file. When cross-compiling
# to windows, make this ".exe". Otherwise leave it blank.
#
E = @EXEEXT@
TCC = @CC@
#### Tcl shell for use in running the fossil testsuite. If you do not
# care about testing the end result, this can be blank.
#
TCLSH = tclsh
CFLAGS = @CFLAGS@
LIB = @LDFLAGS@ @EXTRA_LDFLAGS@ @LIBS@
BCCFLAGS = @CPPFLAGS@ @CFLAGS@
TCCFLAGS = @EXTRA_CFLAGS@ @CPPFLAGS@ @CFLAGS@ -DHAVE_AUTOCONFIG_H -D_HAVE_SQLITE_CONFIG_H
INSTALLDIR = $(DESTDIR)@prefix@/bin
USE_SYSTEM_SQLITE = @USE_SYSTEM_SQLITE@
USE_LINENOISE = @USE_LINENOISE@
USE_SEE = @USE_SEE@
FOSSIL_ENABLE_MINIZ = @FOSSIL_ENABLE_MINIZ@
include $(SRCDIR)/main.mk
distclean: clean
rm -f autoconfig.h config.log Makefile
reconfig:
@AUTOREMAKE@
# Automatically reconfigure whenever an autosetup file or one of the
# make source files change.
#
# The "touch" is necessary to avoid a make loop due to a new upstream
# feature in autosetup (GH 0a71e3c3b7) which rewrites *.in outputs only
# if doing so will write different contents; otherwise, it leaves them
# alone so the mtime doesn't change. This means that if you change one
# our depdendencies besides Makefile.in, we'll reconfigure but Makefile
# won't change, so this rule will remain out of date, so we'll reconfig
# but Makefile won't change, so we'll reconfig but... endlessly.
#
# This is also why we repeat the reconfig target's command here instead
# of delegating to it with "$(MAKE) reconfig": having children running
# around interfering makes this failure mode even worse.
Makefile: @srcdir@/Makefile.in $(SRCDIR)/main.mk @AUTODEPS@
@AUTOREMAKE@
touch @builddir@/Makefile
fossil-2.5/VERSION 0000644 0000000 0000000 00000000004 13236644756 0013315 0 ustar 00nobody nobody 2.5
fossil-2.5/ajax 0000755 0000000 0000000 00000000000 13236644756 0013117 5 ustar 00nobody nobody fossil-2.5/ajax/README 0000644 0000000 0000000 00000002375 13236644756 0014065 0 ustar 00nobody nobody This is the README for how to set up the Fossil/JSON test web page
under Apache on Unix systems. This is only intended only for
Fossil/JSON developers/tinkerers:
First, copy cgi-bin/fossil-json.cgi.example to
cgi-bin/fossil-json.cgi. Edit it and correct the paths to the fossil
binary and the repo you want to serve. Make it executable.
MAKE SURE that the fossil repo you use is world-writable OR that your
Web/CGI server is set up to run as the user ID of the owner of the
fossil file. ALSO: the DIRECTORY CONTAINING the repo file must be
writable by the CGI process.
Next, set up an apache vhost entry. Mine looks like:
ServerAlias fjson
ScriptAlias /cgi-bin/ /home/stephan/cvs/fossil/fossil-json/ajax/cgi-bin/
DocumentRoot /home/stephan/cvs/fossil/fossil-json/ajax
Now add your preferred vhost name (fjson in the above example) to /etc/hosts:
127.0.0.1 ...other aliases... fjson
Restart your Apache.
Now visit: http://fjson/
that will show the test/demo page. If it doesn't, edit index.html and
make sure that:
WhAjaj.Connector.options.ajax.url = ...;
points to your CGI script. In theory you can also do this over fossil
standalone server mode, but i haven't yet tested that particular test
page in that mode.
fossil-2.5/ajax/cgi-bin 0000755 0000000 0000000 00000000000 13236644756 0014427 5 ustar 00nobody nobody fossil-2.5/ajax/cgi-bin/fossil-json.cgi.example 0000644 0000000 0000000 00000000067 13236644756 0021075 0 ustar 00nobody nobody #!/path/to/fossil/binary
repository: /path/to/repo.fsl
fossil-2.5/ajax/i-test 0000755 0000000 0000000 00000000000 13236644756 0014324 5 ustar 00nobody nobody fossil-2.5/ajax/i-test/rhino-shell.js 0000644 0000000 0000000 00000014225 13236644756 0017171 0 ustar 00nobody nobody var FShell = {
serverUrl:
'http://localhost:8080'
//'http://fjson/cgi-bin/fossil-json.cgi'
//'http://192.168.1.62:8080'
//'http://fossil.wanderinghorse.net/repos/fossil-json-java/index.cgi'
,
verbose:false,
prompt:"fossil shell > ",
wiki:{},
consol:java.lang.System.console(),
v:function(msg){
if(this.verbose){
print("VERBOSE: "+msg);
}
}
};
(function bootstrap() {
var srcdir = '../js/';
var includes = [srcdir+'json2.js',
srcdir+'whajaj.js',
srcdir+'fossil-ajaj.js'
];
for( var i in includes ) {
load(includes[i]);
}
WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.rhino;
FShell.fossil = new FossilAjaj({
asynchronous:false, /* rhino-based impl doesn't support async. */
timeout:10000,
url:FShell.serverUrl
});
print("Server: "+FShell.serverUrl);
var cb = FShell.fossil.ajaj.callbacks;
cb.beforeSend = function(req,opt){
if(!FShell.verbose) return;
print("SENDING REQUEST: AJAJ options="+JSON.stringify(opt));
if(req) print("Request envelope="+WhAjaj.stringify(req));
};
cb.afterSend = function(req,opt){
//if(!FShell.verbose) return;
//print("REQUEST RETURNED: opt="+JSON.stringify(opt));
//if(req) print("Request="+WhAjaj.stringify(req));
};
cb.onError = function(req,opt){
//if(!FShell.verbose) return;
print("ERROR: "+WhAjaj.stringify(opt));
};
cb.onResponse = function(resp,req){
if(!FShell.verbose) return;
if(resp && resp.resultCode){
print("Response contains error info: "+resp.resultCode+": "+resp.resultText);
}
print("GOT RESPONSE: "+(('string'===typeof resp) ? resp : WhAjaj.stringify(resp)));
};
FShell.fossil.HAI({
onResponse:function(resp,opt){
assertResponseOK(resp);
}
});
})();
/**
Throws an exception of cond is a falsy value.
*/
function assert(cond, descr){
descr = descr || "Undescribed condition.";
if(!cond){
throw new Error("Assertion failed: "+descr);
}else{
//print("Assertion OK: "+descr);
}
}
/**
Convenience form of FShell.fossil.sendCommand(command,payload,ajajOpt).
*/
function send(command,payload, ajajOpt){
FShell.fossil.sendCommand(command,payload,ajajOpt);
}
/**
Asserts that resp is-a Object, resp.fossil is-a string, and
!resp.resultCode.
*/
function assertResponseOK(resp){
assert('object' === typeof resp,'Response is-a object.');
assert( 'string' === typeof resp.fossil, 'Response contains fossil property.');
assert( !resp.resultCode, 'resp.resultCode='+resp.resultCode);
}
/**
Asserts that resp is-a Object, resp.fossil is-a string, and
resp.resultCode is a truthy value. If expectCode is set then
it also asserts that (resp.resultCode=='FOSSIL-'+expectCode).
*/
function assertResponseError(resp,expectCode){
assert('object' === typeof resp,'Response is-a object.');
assert( 'string' === typeof resp.fossil, 'Response contains fossil property.');
assert( resp.resultCode, 'resp.resultCode='+resp.resultCode);
if(expectCode){
assert( 'FOSSIL-'+expectCode == resp.resultCode, 'Expecting result code '+expectCode );
}
}
FShell.readline = (typeof readline === 'function') ? (readline) : (function() {
importPackage(java.io);
importPackage(java.lang);
var stdin = new BufferedReader(new InputStreamReader(System['in']));
var self = this;
return function(prompt) {
if(prompt) print(prompt);
var x = stdin.readLine();
return null===x ? x : String(x) /*convert to JS string!*/;
};
}());
FShell.dispatchLine = function(line){
var av = line.split(' '); // FIXME: to shell-like tokenization. Too tired!
var cmd = av[0];
var key, h;
if('/' == cmd[0]) key = '/';
else key = this.commandAliases[cmd];
if(!key) key = cmd;
h = this.commandHandlers[key];
if(!h){
print("Command not known: "+cmd +" ("+key+")");
}else if(!WhAjaj.isFunction(h)){
print("Not a function: "+key);
}
else{
print("Sending ["+key+"] command... ");
try{h(av);}
catch(e){ print("EXCEPTION: "+e); }
}
};
FShell.onResponseDefault = function(callback){
return function(resp,req){
assertResponseOK(resp);
print("Payload: "+(resp.payload ? WhAjaj.stringify(resp.payload) : "none"));
if(WhAjaj.isFunction(callback)){
callback(resp,req);
}
};
};
FShell.commandHandlers = {
"?":function(args){
var k;
print("Available commands...\n");
var o = FShell.commandHandlers;
for(k in o){
if(! o.hasOwnProperty(k)) continue;
print("\t"+k);
}
},
"/":function(args){
FShell.fossil.sendCommand('/json'+args[0],undefined,{
beforeSend:function(req,opt){
print("Sending to: "+opt.url);
},
onResponse:FShell.onResponseDefault()
});
},
"eval":function(args){
eval(args.join(' '));
},
"login":function(args){
FShell.fossil.login(args[1], args[2], {
onResponse:FShell.onResponseDefault()
});
},
"whoami":function(args){
FShell.fossil.whoami({
onResponse:FShell.onResponseDefault()
});
},
"HAI":function(args){
FShell.fossil.HAI({
onResponse:FShell.onResponseDefault()
});
}
};
FShell.commandAliases = {
"li":"login",
"lo":"logout",
"who":"whoami",
"hi":"HAI",
"tci":"/timeline/ci?limit=3"
};
FShell.mainLoop = function(){
var line;
var check = /\S/;
//var isJavaNull = /java\.lang\.null/;
//print(typeof java.lang['null']);
while( null != (line=this.readline(this.prompt)) ){
if(null===line) break /*EOF*/;
else if( "" === line ) continue;
//print("Got line: "+line);
else if(!check.test(line)) continue;
print('typeof line = '+typeof line);
this.dispatchLine(line);
print("");
}
print("Bye!");
};
FShell.mainLoop();
fossil-2.5/ajax/i-test/rhino-test.js 0000644 0000000 0000000 00000021010 13236644756 0017027 0 ustar 00nobody nobody var TestApp = {
serverUrl:
'http://localhost:8080'
//'http://fjson/cgi-bin/fossil-json.cgi'
//'http://192.168.1.62:8080'
//'http://fossil.wanderinghorse.net/repos/fossil-json-java/index.cgi'
,
verbose:true,
fossilBinary:'fossil',
wiki:{}
};
(function bootstrap() {
var srcdir = '../js/';
var includes = [srcdir+'json2.js',
srcdir+'whajaj.js',
srcdir+'fossil-ajaj.js'
];
for( var i in includes ) {
load(includes[i]);
}
WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.rhino;
TestApp.fossil = new FossilAjaj({
asynchronous:false, /* rhino-based impl doesn't support async or timeout. */
timeout:0,
url:TestApp.serverUrl,
fossilBinary:TestApp.fossilBinary
});
var cb = TestApp.fossil.ajaj.callbacks;
cb.beforeSend = function(req,opt){
if(!TestApp.verbose) return;
print("SENDING REQUEST: AJAJ options="+JSON.stringify(opt));
if(req) print("Request envelope="+WhAjaj.stringify(req));
};
cb.afterSend = function(req,opt){
//if(!TestApp.verbose) return;
//print("REQUEST RETURNED: opt="+JSON.stringify(opt));
//if(req) print("Request="+WhAjaj.stringify(req));
};
cb.onError = function(req,opt){
if(!TestApp.verbose) return;
print("ERROR: "+WhAjaj.stringify(opt));
};
cb.onResponse = function(resp,req){
if(!TestApp.verbose) return;
print("GOT RESPONSE: "+(('string'===typeof resp) ? resp : WhAjaj.stringify(resp)));
};
})();
/**
Throws an exception of cond is a falsy value.
*/
function assert(cond, descr){
descr = descr || "Undescribed condition.";
if(!cond){
print("Assertion FAILED: "+descr);
throw new Error("Assertion failed: "+descr);
// aarrgghh. Exceptions are of course swallowed by
// the AJAX layer, to keep from killing a browser's
// script environment.
}else{
if(TestApp.verbose) print("Assertion OK: "+descr);
}
}
/**
Calls func() in a try/catch block and throws an exception if
func() does NOT throw.
*/
function assertThrows(func, descr){
descr = descr || "Undescribed condition failed.";
var ex;
try{
func();
}catch(e){
ex = e;
}
if(!ex){
throw new Error("Function did not throw (as expected): "+descr);
}else{
if(TestApp.verbose) print("Function threw (as expected): "+descr+": "+ex);
}
}
/**
Convenience form of TestApp.fossil.sendCommand(command,payload,ajajOpt).
*/
function send(command,payload, ajajOpt){
TestApp.fossil.sendCommand(command,payload,ajajOpt);
}
/**
Asserts that resp is-a Object, resp.fossil is-a string, and
!resp.resultCode.
*/
function assertResponseOK(resp){
assert('object' === typeof resp,'Response is-a object.');
assert( 'string' === typeof resp.fossil, 'Response contains fossil property.');
assert( undefined === resp.resultCode, 'resp.resultCode is not set');
}
/**
Asserts that resp is-a Object, resp.fossil is-a string, and
resp.resultCode is a truthy value. If expectCode is set then
it also asserts that (resp.resultCode=='FOSSIL-'+expectCode).
*/
function assertResponseError(resp,expectCode){
assert('object' === typeof resp,'Response is-a object.');
assert( 'string' === typeof resp.fossil, 'Response contains fossil property.');
assert( !!resp.resultCode, 'resp.resultCode='+resp.resultCode);
if(expectCode){
assert( 'FOSSIL-'+expectCode == resp.resultCode, 'Expecting result code '+expectCode );
}
}
function testHAI(){
var rs;
TestApp.fossil.HAI({
onResponse:function(resp,req){
rs = resp;
}
});
assertResponseOK(rs);
TestApp.serverVersion = rs.fossil;
assert( 'string' === typeof TestApp.serverVersion, 'server version = '+TestApp.serverVersion);
}
testHAI.description = 'Get server version info.';
function testIAmNobody(){
TestApp.fossil.whoami('/json/whoami');
assert('nobody' === TestApp.fossil.auth.name, 'User == nobody.' );
assert(!TestApp.fossil.auth.authToken, 'authToken is not set.' );
}
testIAmNobody.description = 'Ensure that current user is "nobody".';
function testAnonymousLogin(){
TestApp.fossil.login();
assert('string' === typeof TestApp.fossil.auth.authToken, 'authToken = '+TestApp.fossil.auth.authToken);
assert( 'string' === typeof TestApp.fossil.auth.name, 'User name = '+TestApp.fossil.auth.name);
TestApp.fossil.userName = null;
TestApp.fossil.whoami('/json/whoami');
assert( 'string' === typeof TestApp.fossil.auth.name, 'User name = '+TestApp.fossil.auth.name);
}
testAnonymousLogin.description = 'Perform anonymous login.';
function testAnonWiki(){
var rs;
TestApp.fossil.sendCommand('/json/wiki/list',undefined,{
beforeSend:function(req,opt){
assert( req && (req.authToken==TestApp.fossil.auth.authToken), 'Request envelope contains expected authToken.' );
},
onResponse:function(resp,req){
rs = resp;
}
});
assertResponseOK(rs);
assert( (typeof [] === typeof rs.payload) && rs.payload.length,
"Wiki list seems to be okay.");
TestApp.wiki.list = rs.payload;
TestApp.fossil.sendCommand('/json/wiki/get',{
name:TestApp.wiki.list[0]
},{
onResponse:function(resp,req){
rs = resp;
}
});
assertResponseOK(rs);
assert(rs.payload.name == TestApp.wiki.list[0], "Fetched page name matches expectations.");
print("Got first wiki page: "+WhAjaj.stringify(rs.payload));
}
testAnonWiki.description = 'Fetch wiki list as anonymous user.';
function testFetchCheckinArtifact(){
var art = '18dd383e5e7684ece';
var rs;
TestApp.fossil.sendCommand('/json/artifact',{
'name': art
},
{
onResponse:function(resp,req){
rs = resp;
}
});
assertResponseOK(rs);
assert(3 == rs.payload.parents.length, 'Got 3 parent artifacts.');
}
testFetchCheckinArtifact.description = '/json/artifact/CHECKIN';
function testAnonLogout(){
var rs;
TestApp.fossil.logout({
onResponse:function(resp,req){
rs = resp;
}
});
assertResponseOK(rs);
print("Ensure that second logout attempt fails...");
TestApp.fossil.logout({
onResponse:function(resp,req){
rs = resp;
}
});
assertResponseError(rs);
}
testAnonLogout.description = 'Log out anonymous user.';
function testExternalProcess(){
var req = { command:"HAI", requestId:'testExternalProcess()' };
var args = [TestApp.fossilBinary, 'json', '--json-input', '-'];
var p = java.lang.Runtime.getRuntime().exec(args);
var outs = p.getOutputStream();
var osr = new java.io.OutputStreamWriter(outs);
var osb = new java.io.BufferedWriter(osr);
var json = JSON.stringify(req);
osb.write(json,0, json.length);
osb.close();
req = json = outs = osr = osb = undefined;
var ins = p.getInputStream();
var isr = new java.io.InputStreamReader(ins);
var br = new java.io.BufferedReader(isr);
var line;
while( null !== (line=br.readLine())){
print(line);
}
br.close();
isr.close();
ins.close();
p.waitFor();
}
testExternalProcess.description = 'Run fossil as external process.';
function testExternalProcessHandler(){
var aj = TestApp.fossil.ajaj;
var oldImpl = aj.sendImpl;
aj.sendImpl = FossilAjaj.rhinoLocalBinarySendImpl;
var rs;
TestApp.fossil.sendCommand('/json/HAI',undefined,{
onResponse:function(resp,opt){
rs = resp;
}
});
aj.sendImpl = oldImpl;
assertResponseOK(rs);
print("Using local fossil binary via AJAX interface, we fetched: "+
WhAjaj.stringify(rs));
}
testExternalProcessHandler.description = 'Try local fossil binary via AJAX interface.';
(function runAllTests(){
var testList = [
testHAI,
testIAmNobody,
testAnonymousLogin,
testAnonWiki,
testFetchCheckinArtifact,
testAnonLogout,
testExternalProcess,
testExternalProcessHandler
];
var i, f;
for( i = 0; i < testList.length; ++i ){
f = testList[i];
try{
print("Running test #"+(i+1)+": "+(f.description || "no description."));
f();
}catch(e){
print("Test #"+(i+1)+" failed: "+e);
throw e;
}
}
})();
print("Done! If you don't see an exception message in the last few lines, you win!");
fossil-2.5/ajax/index.html 0000644 0000000 0000000 00000030170 13236644756 0015174 0 ustar 00nobody nobody
Fossil/JSON raw request sending
You know, for sending raw JSON requests to Fossil...
If you're actually using this page, then you know what you're doing and don't
need help text, hoverhelp, and a snazzy interface.
Path:
If the POST textarea is not empty then it will be posted with the request.
Quick-posts:
Login:
name:
pw:
POST data
Request AJAJ options
Response
fossil-2.5/ajax/js 0000755 0000000 0000000 00000000000 13236644756 0013533 5 ustar 00nobody nobody fossil-2.5/ajax/js/fossil-ajaj.js 0000644 0000000 0000000 00000023253 13236644756 0016357 0 ustar 00nobody nobody /**
This file contains a WhAjaj extension for use with Fossil/JSON.
Author: Stephan Beal (sgbeal@googlemail.com)
License: Public Domain
*/
/**
Constructor for a new Fossil AJAJ client. ajajOpt may be an optional
object suitable for passing to the WhAjaj.Connector() constructor.
On returning, this.ajaj is-a WhAjaj.Connector instance which can
be used to send requests to the back-end (though the convenience
functions of this class are the preferred way to do it). Clients
are encouraged to use FossilAjaj.sendCommand() (and friends) instead
of the underlying WhAjaj.Connector API, since this class' API
contains Fossil-specific request-calling handling (e.g. of authentication
info) whereas WhAjaj is more generic.
*/
function FossilAjaj(ajajOpt)
{
this.ajaj = new WhAjaj.Connector(ajajOpt);
return this;
}
FossilAjaj.prototype.generateRequestId = function() {
return this.ajaj.generateRequestId();
};
/**
Proxy for this.ajaj.sendRequest().
*/
FossilAjaj.prototype.sendRequest = function(req,opt) {
return this.ajaj.sendRequest(req,opt);
};
/**
Sends a command to the fossil back-end. Command should be the
path part of the URL, e.g. /json/stat, payload is a request-specific
value type (may often be null/undefined). ajajOpt is an optional object
holding WhAjaj.sendRequest()-compatible options.
This function constructs a Fossil/JSON request envelope based
on the given arguments and adds this.auth.authToken and a requestId
to it.
*/
FossilAjaj.prototype.sendCommand = function(command, payload, ajajOpt) {
var req;
ajajOpt = ajajOpt || {};
if(payload || (this.auth && this.auth.authToken) || ajajOpt.jsonp) {
req = {
payload:payload,
requestId:('function' === typeof this.generateRequestId) ? this.generateRequestId() : undefined,
authToken:(this.auth ? this.auth.authToken : undefined),
jsonp:('string' === typeof ajajOpt.jsonp) ? ajajOpt.jsonp : undefined
};
}
ajajOpt.method = req ? 'POST' : 'GET';
// just for debuggering: ajajOpt.method = 'POST'; if(!req) req={};
if(command) ajajOpt.url = this.ajaj.derivedOption('url',ajajOpt) + command;
this.ajaj.sendRequest(req,ajajOpt);
};
/**
Sends a login request to the back-end.
ajajOpt is an optional configuration object suitable for passing
to sendCommand().
After the response returns, this.auth will be
set to the response payload.
If name === 'anonymous' (the default if none is passed in) then this
function ignores the pw argument and must make two requests - the first
one gets the captcha code and the second one submits it.
ajajOpt.onResponse() (if set) is only called for the actual login
response (the 2nd one), as opposed to being called for both requests.
However, this.ajaj.callbacks.onResponse() _is_ called for both (because
it happens at a lower level).
If this object has an onLogin() function it is called (with
no arguments) before the onResponse() handler of the login is called
(that is the 2nd request for anonymous logins) and any exceptions
it throws are ignored.
*/
FossilAjaj.prototype.login = function(name,pw,ajajOpt) {
name = name || 'anonymous';
var self = this;
var loginReq = {
name:name,
password:pw
};
ajajOpt = this.ajaj.normalizeAjaxParameters( ajajOpt || {} );
var oldOnResponse = ajajOpt.onResponse;
ajajOpt.onResponse = function(resp,req) {
var thisOpt = this;
//alert('login response:\n'+WhAjaj.stringify(resp));
if( resp && resp.payload ) {
//self.userName = resp.payload.name;
//self.capabilities = resp.payload.capabilities;
self.auth = resp.payload;
}
if( WhAjaj.isFunction( self.onLogin ) ){
try{ self.onLogin(); }
catch(e){}
}
if( WhAjaj.isFunction(oldOnResponse) ) {
oldOnResponse.apply(thisOpt,[resp,req]);
}
};
function doLogin(){
//alert("Sending login request..."+WhAjaj.stringify(loginReq));
self.sendCommand('/json/login', loginReq, ajajOpt);
}
if( 'anonymous' === name ){
this.sendCommand('/json/anonymousPassword',undefined,{
onResponse:function(resp,req){
/*
if( WhAjaj.isFunction(oldOnResponse) ){
oldOnResponse.apply(this, [resp,req]);
};
*/
if(resp && !resp.resultCode){
//alert("Got PW. Trying to log in..."+WhAjaj.stringify(resp));
loginReq.anonymousSeed = resp.payload.seed;
loginReq.password = resp.payload.password;
doLogin();
}
}
});
}
else doLogin();
};
/**
Logs out of fossil, invaliding this login token.
ajajOpt is an optional configuration object suitable for passing
to sendCommand().
If this object has an onLogout() function it is called (with
no arguments) before the onResponse() handler is called.
IFF the response succeeds then this.auth is unset.
*/
FossilAjaj.prototype.logout = function(ajajOpt) {
var self = this;
ajajOpt = this.ajaj.normalizeAjaxParameters( ajajOpt || {} );
var oldOnResponse = ajajOpt.onResponse;
ajajOpt.onResponse = function(resp,req) {
var thisOpt = this;
self.auth = undefined;
if( WhAjaj.isFunction( self.onLogout ) ){
try{ self.onLogout(); }
catch(e){}
}
if( WhAjaj.isFunction(oldOnResponse) ) {
oldOnResponse.apply(thisOpt,[resp,req]);
}
};
this.sendCommand('/json/logout', undefined, ajajOpt );
};
/**
Sends a HAI request to the server. /json/HAI is an alias /json/version.
ajajOpt is an optional configuration object suitable for passing
to sendCommand().
*/
FossilAjaj.prototype.HAI = function(ajajOpt) {
this.sendCommand('/json/HAI', undefined, ajajOpt);
};
/**
Sends a /json/whoami request. Updates this.auth to contain
the login info, removing them if the response does not contain
that data.
*/
FossilAjaj.prototype.whoami = function(ajajOpt) {
var self = this;
ajajOpt = this.ajaj.normalizeAjaxParameters( ajajOpt || {} );
var oldOnResponse = ajajOpt.onResponse;
ajajOpt.onResponse = function(resp,req) {
var thisOpt = this;
if( resp && resp.payload ){
if(!self.auth || (self.auth.authToken!==resp.payload.authToken)){
self.auth = resp.payload;
if( WhAjaj.isFunction(self.onLogin) ){
self.onLogin();
}
}
}
else { delete self.auth; }
if( WhAjaj.isFunction(oldOnResponse) ) {
oldOnResponse.apply(thisOpt,[resp,req]);
}
};
self.sendCommand('/json/whoami', undefined, ajajOpt);
};
/**
EXPERIMENTAL concrete WhAjaj.Connector.sendImpl() implementation which
uses Rhino to connect to a local fossil binary for input and output. Its
signature and semantics are as described for
WhAjaj.Connector.prototype.sendImpl(), with a few exceptions and
additions:
- It does not support timeouts or asynchronous mode.
- The args.fossilBinary property must point to the local fossil binary
(it need not be a complete path if fossil is in the $PATH). This
function throws (without calling any request callbacks) if
args.fossilBinary is not set. fossilBinary may be set on
WhAjaj.Connector.options.ajax, in the FossilAjaj constructor call, as
the ajax options parameter to any of the FossilAjaj.sendCommand() family
of functions, or by setting
aFossilAjajInstance.ajaj.options.fossilBinary on a specific
FossilAjaj instance.
- It uses the args.url field to create the "command" property of the
request, constructs a request envelope, spawns a fossil process in JSON
mode, feeds it the request envelope, and returns the response envelope
via the same mechanisms defined for the HTTP-based implementations.
The interface is otherwise compatible with the "normal"
FossilAjaj.sendCommand() front-end (it is, however, fossil-specific, and
not back-end agnostic like the WhAjaj.sendImpl() interface intends).
*/
FossilAjaj.rhinoLocalBinarySendImpl = function(request,args){
var self = this;
request = request || {};
if(!args.fossilBinary){
throw new Error("fossilBinary is not set on AJAX options!");
}
var url = args.url.split('?')[0].split(/\/+/);
if(url.length>1){
// 3x shift(): protocol, host, 'json' part of path
request.command = (url.shift(),url.shift(),url.shift(), url.join('/'));
}
delete args.url;
//print("rhinoLocalBinarySendImpl SENDING: "+WhAjaj.stringify(request));
var json;
try{
var pargs = [args.fossilBinary, 'json', '--json-input', '-'];
var p = java.lang.Runtime.getRuntime().exec(pargs);
var outs = p.getOutputStream();
var osr = new java.io.OutputStreamWriter(outs);
var osb = new java.io.BufferedWriter(osr);
json = JSON.stringify(request);
osb.write(json,0, json.length);
osb.close();
var ins = p.getInputStream();
var isr = new java.io.InputStreamReader(ins);
var br = new java.io.BufferedReader(isr);
var line;
json = [];
while( null !== (line=br.readLine())){
json.push(line);
}
ins.close();
}catch(e){
args.errorMessage = e.toString();
WhAjaj.Connector.sendHelper.onSendError.apply( self, [request, args] );
return undefined;
}
json = json.join('');
//print("READ IN JSON: "+json);
WhAjaj.Connector.sendHelper.onSendSuccess.apply( self, [request, json, args] );
}/*rhinoLocalBinary*/
fossil-2.5/ajax/js/json2.js 0000644 0000000 0000000 00000041664 13236644756 0015216 0 ustar 00nobody nobody /*
http://www.JSON.org/json2.js
2009-06-29
Public Domain.
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
See http://www.JSON.org/js.html
This file creates a global JSON object containing two methods: stringify
and parse.
JSON.stringify(value, replacer, space)
value any JavaScript value, usually an object or array.
replacer an optional parameter that determines how object
values are stringified for objects. It can be a
function or an array of strings.
space an optional parameter that specifies the indentation
of nested structures. If it is omitted, the text will
be packed without extra whitespace. If it is a number,
it will specify the number of spaces to indent at each
level. If it is a string (such as '\t' or ' '),
it contains the characters used to indent at each level.
This method produces a JSON text from a JavaScript value.
When an object value is found, if the object contains a toJSON
method, its toJSON method will be called and the result will be
stringified. A toJSON method does not serialize: it returns the
value represented by the name/value pair that should be serialized,
or undefined if nothing should be serialized. The toJSON method
will be passed the key associated with the value, and this will be
bound to the object holding the key.
For example, this would serialize Dates as ISO strings.
Date.prototype.toJSON = function (key) {
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}
return this.getUTCFullYear() + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate()) + 'T' +
f(this.getUTCHours()) + ':' +
f(this.getUTCMinutes()) + ':' +
f(this.getUTCSeconds()) + 'Z';
};
You can provide an optional replacer method. It will be passed the
key and value of each member, with this bound to the containing
object. The value that is returned from your method will be
serialized. If your method returns undefined, then the member will
be excluded from the serialization.
If the replacer parameter is an array of strings, then it will be
used to select the members to be serialized. It filters the results
such that only members with keys listed in the replacer array are
stringified.
Values that do not have JSON representations, such as undefined or
functions, will not be serialized. Such values in objects will be
dropped; in arrays they will be replaced with null. You can use
a replacer function to replace those with JSON values.
JSON.stringify(undefined) returns undefined.
The optional space parameter produces a stringification of the
value that is filled with line breaks and indentation to make it
easier to read.
If the space parameter is a non-empty string, then that string will
be used for indentation. If the space parameter is a number, then
the indentation will be that many spaces.
Example:
text = JSON.stringify(['e', {pluribus: 'unum'}]);
// text is '["e",{"pluribus":"unum"}]'
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
text = JSON.stringify([new Date()], function (key, value) {
return this[key] instanceof Date ?
'Date(' + this[key] + ')' : value;
});
// text is '["Date(---current time---)"]'
JSON.parse(text, reviver)
This method parses a JSON text to produce an object or array.
It can throw a SyntaxError exception.
The optional reviver parameter is a function that can filter and
transform the results. It receives each of the keys and values,
and its return value is used instead of the original value.
If it returns what it received, then the structure is not modified.
If it returns undefined then the member is deleted.
Example:
// Parse the text. Values that look like ISO date strings will
// be converted to Date objects.
myData = JSON.parse(text, function (key, value) {
var a;
if (typeof value === 'string') {
a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
});
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
var d;
if (typeof value === 'string' &&
value.slice(0, 5) === 'Date(' &&
value.slice(-1) === ')') {
d = new Date(value.slice(5, -1));
if (d) {
return d;
}
}
return value;
});
This is a reference implementation. You are free to copy, modify, or
redistribute.
This code should be minified before deployment.
See http://javascript.crockford.com/jsmin.html
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
NOT CONTROL.
*/
/*jslint evil: true */
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
lastIndex, length, parse, prototype, push, replace, slice, stringify,
test, toJSON, toString, valueOf
*/
// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.
var JSON = JSON || {};
(function () {
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}
if (typeof Date.prototype.toJSON !== 'function') {
Date.prototype.toJSON = function (key) {
return isFinite(this.valueOf()) ?
this.getUTCFullYear() + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate()) + 'T' +
f(this.getUTCHours()) + ':' +
f(this.getUTCMinutes()) + ':' +
f(this.getUTCSeconds()) + 'Z' : null;
};
String.prototype.toJSON =
Number.prototype.toJSON =
Boolean.prototype.toJSON = function (key) {
return this.valueOf();
};
}
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
gap,
indent,
meta = { // table of character substitutions
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
},
rep;
function quote(string) {
// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.
escapable.lastIndex = 0;
return escapable.test(string) ?
'"' + string.replace(escapable, function (a) {
var c = meta[a];
return typeof c === 'string' ? c :
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
}) + '"' :
'"' + string + '"';
}
function str(key, holder) {
// Produce a string from holder[key].
var i, // The loop counter.
k, // The member key.
v, // The member value.
length,
mind = gap,
partial,
value = holder[key];
// If the value has a toJSON method, call it to obtain a replacement value.
if (value && typeof value === 'object' &&
typeof value.toJSON === 'function') {
value = value.toJSON(key);
}
// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.
if (typeof rep === 'function') {
value = rep.call(holder, key, value);
}
// What happens next depends on the value's type.
switch (typeof value) {
case 'string':
return quote(value);
case 'number':
// JSON numbers must be finite. Encode non-finite numbers as null.
return isFinite(value) ? String(value) : 'null';
case 'boolean':
case 'null':
// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.
return String(value);
// If the type is 'object', we might be dealing with an object or an array or
// null.
case 'object':
// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.
if (!value) {
return 'null';
}
// Make an array to hold the partial results of stringifying this object value.
gap += indent;
partial = [];
// Is the value an array?
if (Object.prototype.toString.apply(value) === '[object Array]') {
// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.
length = value.length;
for (i = 0; i < length; i += 1) {
partial[i] = str(i, value) || 'null';
}
// Join all of the elements together, separated with commas, and wrap them in
// brackets.
v = partial.length === 0 ? '[]' :
gap ? '[\n' + gap +
partial.join(',\n' + gap) + '\n' +
mind + ']' :
'[' + partial.join(',') + ']';
gap = mind;
return v;
}
// If the replacer is an array, use it to select the members to be stringified.
if (rep && typeof rep === 'object') {
length = rep.length;
for (i = 0; i < length; i += 1) {
k = rep[i];
if (typeof k === 'string') {
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
} else {
// Otherwise, iterate through all of the keys in the object.
for (k in value) {
if (Object.hasOwnProperty.call(value, k)) {
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
}
// Join all of the member texts together, separated with commas,
// and wrap them in braces.
v = partial.length === 0 ? '{}' :
gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
mind + '}' : '{' + partial.join(',') + '}';
gap = mind;
return v;
}
}
// If the JSON object does not yet have a stringify method, give it one.
if (typeof JSON.stringify !== 'function') {
JSON.stringify = function (value, replacer, space) {
// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.
var i;
gap = '';
indent = '';
// If the space parameter is a number, make an indent string containing that
// many spaces.
if (typeof space === 'number') {
for (i = 0; i < space; i += 1) {
indent += ' ';
}
// If the space parameter is a string, it will be used as the indent string.
} else if (typeof space === 'string') {
indent = space;
}
// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.
rep = replacer;
if (replacer && typeof replacer !== 'function' &&
(typeof replacer !== 'object' ||
typeof replacer.length !== 'number')) {
throw new Error('JSON.stringify');
}
// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.
return str('', {'': value});
};
}
// If the JSON object does not yet have a parse method, give it one.
if (typeof JSON.parse !== 'function') {
JSON.parse = function (text, reviver) {
// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
var j;
function walk(holder, key) {
// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.
var k, v, value = holder[key];
if (value && typeof value === 'object') {
for (k in value) {
if (Object.hasOwnProperty.call(value, k)) {
v = walk(value, k);
if (v !== undefined) {
value[k] = v;
} else {
delete value[k];
}
}
}
}
return reviver.call(holder, key, value);
}
// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.
cx.lastIndex = 0;
if (cx.test(text)) {
text = text.replace(cx, function (a) {
return '\\u' +
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
});
}
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.
// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.
return typeof reviver === 'function' ?
walk({'': j}, '') : j;
}
// If the text is not JSON parseable, then a SyntaxError is thrown.
throw new SyntaxError('JSON.parse');
};
}
}());
fossil-2.5/ajax/js/whajaj.js 0000644 0000000 0000000 00000132703 13236644756 0015422 0 ustar 00nobody nobody /**
This file provides a JS interface into the core functionality of
JSON-centric back-ends. It sends GET or JSON POST requests to
a back-end and expects JSON responses. The exact semantics of
the underlying back-end and overlying front-end are not its concern,
and it leaves the interpretation of the data up to the client/server
insofar as possible.
All functionality is part of a class named WhAjaj, and that class
acts as namespace for this framework.
Author: Stephan Beal (http://wanderinghorse.net/home/stephan/)
License: Public Domain
This framework is directly derived from code originally found in
http://code.google.com/p/jsonmessage, and later in
http://whiki.wanderinghorse.net, where it contained quite a bit
of application-specific logic. It was eventually (the 3rd time i
needed it) split off into its own library to simplify inclusion
into my many mini-projects.
*/
/**
The WhAjaj function is primarily a namespace, and not intended
to called or instantiated via the 'new' operator.
*/
function WhAjaj()
{
}
/** Returns a millisecond Unix Epoch timestamp. */
WhAjaj.msTimestamp = function()
{
return (new Date()).getTime();
};
/** Returns a Unix Epoch timestamp (in seconds) in integer format.
Reminder to self: (1.1 %1.2) evaluates to a floating-point value
in JS, and thus this implementation is less than optimal.
*/
WhAjaj.unixTimestamp = function()
{
var ts = (new Date()).getTime();
return parseInt( ""+((ts / 1000) % ts) );
};
/**
Returns true if v is-a Array instance.
*/
WhAjaj.isArray = function( v )
{
return (v &&
(v instanceof Array) ||
(Object.prototype.toString.call(v) === "[object Array]")
);
/* Reminders to self:
typeof [] == "object"
toString.call([]) == "[object Array]"
([]).toString() == empty
*/
};
/**
Returns true if v is-a Object instance.
*/
WhAjaj.isObject = function( v )
{
return v &&
(v instanceof Object) &&
('[object Object]' === Object.prototype.toString.apply(v) );
};
/**
Returns true if v is-a Function instance.
*/
WhAjaj.isFunction = function(obj)
{
return obj
&& (
(obj instanceof Function)
|| ('function' === typeof obj)
|| ("[object Function]" === Object.prototype.toString.call(obj))
)
;
};
/**
Parses window.location.search-style string into an object
containing key/value pairs of URL arguments (already urldecoded).
If the str argument is not passed (arguments.length==0) then
window.location.search.substring(1) is used by default. If
neither str is passed in nor window exists then false is returned.
On success it returns an Object containing the key/value pairs
parsed from the string. Keys which have no value are treated
has having the boolean true value.
FIXME: for keys in the form "name[]", build an array of results,
like PHP does.
*/
WhAjaj.processUrlArgs = function(str) {
if( 0 === arguments.length ) {
if( ('undefined' === typeof window) ||
!window.location ||
!window.location.search ) return false;
else str = (''+window.location.search).substring(1);
}
if( ! str ) return false;
str = (''+str).split(/#/,2)[0]; // remove #... to avoid it being added as part of the last value.
var args = {};
var sp = str.split(/&+/);
var rx = /^([^=]+)(=(.+))?/;
var i, m;
for( i in sp ) {
m = rx.exec( sp[i] );
if( ! m ) continue;
args[decodeURIComponent(m[1])] = (m[3] ? decodeURIComponent(m[3]) : true);
}
return args;
};
/**
A simple wrapper around JSON.stringify(), using my own personal
preferred values for the 2nd and 3rd parameters. To globally
set its indentation level, assign WhAjaj.stringify.indent to
an integer value (0 for no intendation).
This function is intended only for human-readable output, not
generic over-the-wire JSON output (where JSON.stringify(val) will
produce smaller results).
*/
WhAjaj.stringify = function(val) {
if( ! arguments.callee.indent ) arguments.callee.indent = 4;
return JSON.stringify(val,0,arguments.callee.indent);
};
/**
Each instance of this class holds state information for making
AJAJ requests to a back-end system. While clients may use one
"requester" object per connection attempt, for connections to the
same back-end, using an instance configured for that back-end
can simplify usage. This class is designed so that the actual
connection-related details (i.e. _how_ it connects to the
back-end) may be re-implemented to use a client's preferred
connection mechanism (e.g. jQuery).
The optional opt parameter may be an object with any (or all) of
the properties documented for WhAjaj.Connector.options.ajax.
Properties set here (or later via modification of the "options"
property of this object) will be used in calls to
WhAjaj.Connector.sendRequest(), and these override (normally) any
options set in WhAjaj.Connector.options.ajax. Note that
WhAjaj.Connector.sendRequest() _also_ takes an options object,
and ones passed there will override, for purposes of that one
request, any options passed in here or defined in
WhAjaj.Connector.options.ajax. See WhAjaj.Connector.options.ajax
and WhAjaj.Connector.prototype.sendRequest() for more details
about the precedence of options.
Sample usage:
@code
// Set up common connection-level options:
var cgi = new WhAjaj.Connector({
url: '/cgi-bin/my.cgi',
timeout:10000,
onResponse(resp,req) { alert(JSON.stringify(resp,0.4)); },
onError(req,opt) {
alert(opt.errorMessage);
}
});
// Any of those options may optionally be set globally in
// WhAjaj.Connector.options.ajax (onError(), beforeSend(), and afterSend()
// are often easiest/most useful to set globally).
// Get list of pages...
cgi.sendRequest( null, {
onResponse(resp,req){ alert(WhAjaj.stringify(resp)); }
});
@endcode
For common request types, clients can add functions to this
object which act as wrappers for backend-specific functionality. As
a simple example:
@code
cgi.login = function(name,pw,ajajOpt) {
this.sendRequest(
{command:"json/login",
name:name,
password:pw
}, ajajOpt );
};
@endcode
TODOs:
- Caching of page-load requests, with a configurable lifetime.
- Use-cases like the above login() function are a tiny bit
problematic to implement when each request has a different URL
path (i know this from the whiki and fossil implementations).
This is partly a side-effect of design descisions made back in
the very first days of this code's life. i need to go through
and see where i can bend those conventions a bit (where it won't
break my other apps unduly).
*/
WhAjaj.Connector = function(opt)
{
if(WhAjaj.isObject(opt)) this.options = opt;
//TODO?: this.$cache = {};
};
/**
The core options used by WhAjaj.Connector instances for performing
network operations. These options can (and some _should_)
be changed by a client application. They can also be changed
on specific instances of WhAjaj.Connector, but for most applications
it is simpler to set them here and not have to bother with configuring
each WhAjaj.Connector instance. Apps which use multiple back-ends at one time,
however, will need to customize each instance for a given back-end.
*/
WhAjaj.Connector.options = {
/**
A (meaningless) prefix to apply to WhAjaj.Connector-generated
request IDs.
*/
requestIdPrefix:'WhAjaj.Connector-',
/**
Default options for WhAjaj.Connector.sendRequest() connection
parameters. This object holds only connection-related
options and callbacks (all optional), and not options
related to the required JSON structure of any given request.
i.e. the page name used in a get-page request are not set
here but are specified as part of the request object.
These connection options are a "normalized form" of options
often found in various AJAX libraries like jQuery,
Prototype, dojo, etc. This approach allows us to swap out
the real connection-related parts by writing a simple proxy
which transforms our "normalized" form to the
backend-specific form. For examples, see the various
implementations stored in WhAjaj.Connector.sendImpls.
The following callback options are, in practice, almost
always set globally to some app-wide defaults:
- onError() to report errors using a common mechanism.
- beforeSend() to start a visual activity notification
- afterSend() to disable the visual activity notification
However, be aware that if any given WhAjaj.Connector instance is
given its own before/afterSend callback then those will
override these. Mixing shared/global and per-instance
callbacks can potentially lead to confusing results if, e.g.,
the beforeSend() and afterSend() functions have side-effects
but are not used with their proper before/after partner.
TODO: rename this to 'ajaj' (the name is historical). The
problem with renaming it is is that the word 'ajax' is
pretty prevelant in the source tree, so i can't globally
swap it out.
*/
ajax: {
/**
URL of the back-end server/CGI.
*/
url: '/some/path',
/**
Connection method. Some connection-related functions might
override any client-defined setting.
Must be one of 'GET' or 'POST'. For custom connection
implementation, it may optionally be some
implementation-specified value.
Normally the API can derive this value automatically - if the
request uses JSON data it is POSTed, else it is GETted.
*/
method:'GET',
/**
A hint whether to run the operation asynchronously or
not. Not all concrete WhAjaj.Connector.sendImpl()
implementations can support this. Interestingly, at
least one popular AJAX toolkit does not document
supporting _synchronous_ AJAX operations. All common
browser-side implementations support async operation, but
non-browser implementations might not.
*/
asynchronous:true,
/**
A HTTP authentication login name for the AJAX
connection. Not all concrete WhAjaj.Connector.sendImpl()
implementations can support this.
*/
loginName:undefined,
/**
An HTTP authentication login password for the AJAJ
connection. Not all concrete WhAjaj.Connector.sendImpl()
implementations can support this.
*/
loginPassword:undefined,
/**
A connection timeout, in milliseconds, for establishing
an AJAJ connection. Not all concrete
WhAjaj.Connector.sendImpl() implementations can support this.
*/
timeout:10000,
/**
If an AJAJ request receives JSON data from the back-end,
that data is passed as a plain Object as the response
parameter (exception: in jsonp mode it is passed a
string (why???)). The initiating request object is
passed as the second parameter, but clients can normally
ignore it (only those which need a way to map specific
requests to responses will need it). The 3rd parameter
is the same as the 'this' object for the context of the
callback, but is provided because the instance-level
callbacks (set in (WhAjaj.Connector instance).callbacks,
require it in some cases (because their 'this' is
different!).
Note that the response might contain error information
which comes from the back-end. The difference between
this error info and the info passed to the onError()
callback is that this data indicates an
application-level error, whereas onError() is used to
report connection-level problems or when the backend
produces non-JSON data (which, when not in jsonp mode,
is unexpected and is as fatal to the request as a
connection error).
*/
onResponse: function(response, request, opt){},
/**
If an AJAX request fails to establish a connection or it
receives non-JSON data from the back-end, this function
is called (e.g. timeout error or host name not
resolvable). It is passed the originating request and the
"normalized" connection parameters used for that
request. The connectOpt object "should" (or "might")
have an "errorMessage" property which describes the
nature of the problem.
Clients will almost always want to replace the default
implementation with something which integrates into
their application.
*/
onError: function(request, connectOpt)
{
alert('AJAJ request failed:\n'
+'Connection information:\n'
+JSON.stringify(connectOpt,0,4)
);
},
/**
Called before each connection attempt is made. Clients
can use this to, e.g., enable a visual "network activity
notification" for the user. It is passed the original
request object and the normalized connection parameters
for the request. If this function changes opt, those
changes _are_ applied to the subsequent request. If this
function throws, neither the onError() nor afterSend()
callbacks are triggered and WhAjaj.Connector.sendImpl()
propagates the exception back to the caller.
*/
beforeSend: function(request,opt){},
/**
Called after an AJAJ connection attempt completes,
regardless of success or failure. Passed the same
parameters as beforeSend() (see that function for
details).
Here's an example of setting up a visual notification on
ajax operations using jQuery (but it's also easy to do
without jQuery as well):
@code
function startAjaxNotif(req,opt) {
var me = arguments.callee;
var c = ++me.ajaxCount;
me.element.text( c + " pending AJAX operation(s)..." );
if( 1 == c ) me.element.stop().fadeIn();
}
startAjaxNotif.ajaxCount = 0.
startAjaxNotif.element = jQuery('#whikiAjaxNotification');
function endAjaxNotif() {
var c = --startAjaxNotif.ajaxCount;
startAjaxNotif.element.text( c+" pending AJAX operation(s)..." );
if( 0 == c ) startAjaxNotif.element.stop().fadeOut();
}
@endcode
Set the beforeSend/afterSend properties to those
functions to enable the notifications by default.
*/
afterSend: function(request,opt){},
/**
If jsonp is a string then the WhAjaj-internal response
handling code ASSUMES that the response contains a JSONP-style
construct and eval()s it after afterSend() but before onResponse().
In this case, onResponse() will get a string value for the response
instead of a response object parsed from JSON.
*/
jsonp:undefined,
/**
Don't use yet. Planned future option.
*/
propagateExceptions:false
}
};
/**
WhAjaj.Connector.prototype.callbacks defines callbacks analog
to the onXXX callbacks defined in WhAjaj.Connector.options.ajax,
with two notable differences:
1) these callbacks, if set, are called in addition to any
request-specific callback. The intention is to allow a framework to set
"framework-level" callbacks which should be called independently of the
request-specific callbacks (without interfering with them, e.g.
requiring special re-forwarding features).
2) The 'this' object in these callbacks is the Connector instance
associated with the callback, whereas the "other" onXXX form has its
"ajax options" object as its this.
When this API says that an onXXX callback will be called for a request,
both the request's onXXX (if set) and this one (if set) will be called.
*/
WhAjaj.Connector.prototype.callbacks = {};
/**
Instance-specific values for AJAJ-level properties (as opposed to
application-level request properties). Options set here "override" those
specified in WhAjaj.Connector.options.ajax and are "overridden" by
options passed to sendRequest().
*/
WhAjaj.Connector.prototype.options = {};
/**
Tries to find the given key in any of the following, returning
the first match found: opt, this.options, WhAjaj.Connector.options.ajax.
Returns undefined if key is not found.
*/
WhAjaj.Connector.prototype.derivedOption = function(key,opt) {
var v = opt ? opt[key] : undefined;
if( undefined !== v ) return v;
else v = this.options[key];
if( undefined !== v ) return v;
else v = WhAjaj.Connector.options.ajax[key];
return v;
};
/**
Returns a unique string on each call containing a generic
reandom request identifier string. This is not used by the core
API but can be used by client code to generate unique IDs for
each request (if needed).
The exact format is unspecified and may change in the future.
Request IDs can be used by clients to "match up" responses to
specific requests if needed. In practice, however, they are
seldom, if ever, needed. When passing several concurrent
requests through the same response callback, it might be useful
for some clients to be able to distinguish, possibly re-routing
them through other handlers based on the originating request type.
If this.options.requestIdPrefix or
WhAjaj.Connector.options.requestIdPrefix is set then that text
is prefixed to the returned string.
*/
WhAjaj.Connector.prototype.generateRequestId = function()
{
if( undefined === arguments.callee.sequence )
{
arguments.callee.sequence = 0;
}
var pref = this.options.requestIdPrefix || WhAjaj.Connector.options.requestIdPrefix || '';
return pref +
WhAjaj.msTimestamp() +
'/'+(Math.round( Math.random() * 100000000) )+
':'+(++arguments.callee.sequence);
};
/**
Copies (SHALLOWLY) all properties in opt to this.options.
*/
WhAjaj.Connector.prototype.addOptions = function(opt) {
var k, v;
for( k in opt ) {
if( ! opt.hasOwnProperty(k) ) continue /* proactive Prototype kludge! */;
this.options[k] = opt[k];
}
return this.options;
};
/**
An internal helper object which holds several functions intended
to simplify the creation of concrete communication channel
implementations for WhAjaj.Connector.sendImpl(). These operations
take care of some of the more error-prone parts of ensuring that
onResponse(), onError(), etc. callbacks are called consistently
using the same rules.
*/
WhAjaj.Connector.sendHelper = {
/**
opt is assumed to be a normalized set of
WhAjaj.Connector.sendRequest() options. This function
creates a url by concatenating opt.url and some form of
opt.urlParam.
If opt.urlParam is an object or string then it is appended
to the url. An object is assumed to be a one-dimensional set
of simple (urlencodable) key/value pairs, and not larger
data structures. A string value is assumed to be a
well-formed, urlencoded set of key/value pairs separated by
'&' characters.
The new/normalized URL is returned (opt is not modified). If
opt.urlParam is not set then opt.url is returned (or an
empty string if opt.url is itself a false value).
TODO: if opt is-a Object and any key points to an array,
build up a list of keys in the form "keyname[]". We could
arguably encode sub-objects like "keyname[subkey]=...", but
i don't know if that's conventions-compatible with other
frameworks.
*/
normalizeURL: function(opt) {
var u = opt.url || '';
if( opt.urlParam ) {
var addQ = (u.indexOf('?') >= 0) ? false : true;
var addA = addQ ? false : ((u.indexOf('&')>=0) ? true : false);
var tail = '';
if( WhAjaj.isObject(opt.urlParam) ) {
var li = [], k;
for( k in opt.urlParam) {
li.push( k+'='+encodeURIComponent( opt.urlParam[k] ) );
}
tail = li.join('&');
}
else if( 'string' === typeof opt.urlParam ) {
tail = opt.urlParam;
}
u = u + (addQ ? '?' : '') + (addA ? '&' : '') + tail;
}
return u;
},
/**
Should be called by WhAjaj.Connector.sendImpl()
implementations after a response has come back. This
function takes care of most of ensuring that framework-level
conventions involving WhAjaj.Connector.options.ajax
properties are followed.
The request argument must be the original request passed to
the sendImpl() function. It may legally be null for GET requests.
The opt object should be the normalized AJAX options used
for the connection.
The resp argument may be either a plain Object or a string
(in which case it is assumed to be JSON).
The 'this' object for this call MUST be a WhAjaj.Connector
instance in order for callback processing to work properly.
This function takes care of the following:
- Calling opt.afterSend()
- If resp is a string, de-JSON-izing it to an object.
- Calling opt.onResponse()
- Calling opt.onError() in several common (potential) error
cases.
- If resp is-a String and opt.jsonp then resp is assumed to be
a JSONP-form construct and is eval()d BEFORE opt.onResponse()
is called. It is arguable to eval() it first, but the logic
integrates better with the non-jsonp handler.
The sendImpl() should return immediately after calling this.
The sendImpl() must call only one of onSendSuccess() or
onSendError(). It must call one of them or it must implement
its own response/error handling, which is not recommended
because getting the documented semantics of the
onError/onResponse/afterSend handling correct can be tedious.
*/
onSendSuccess:function(request,resp,opt) {
var cb = this.callbacks || {};
if( WhAjaj.isFunction(cb.afterSend) ) {
try {cb.afterSend( request, opt );}
catch(e){}
}
if( WhAjaj.isFunction(opt.afterSend) ) {
try {opt.afterSend( request, opt );}
catch(e){}
}
function doErr(){
if( WhAjaj.isFunction(cb.onError) ) {
try {cb.onError( request, opt );}
catch(e){}
}
if( WhAjaj.isFunction(opt.onError) ) {
try {opt.onError( request, opt );}
catch(e){}
}
}
if( ! resp ) {
opt.errorMessage = "Sending of request succeeded but returned no data!";
doErr();
return false;
}
if( 'string' === typeof resp ) {
try {
resp = opt.jsonp ? eval(resp) : JSON.parse(resp);
} catch(e) {
opt.errorMessage = e.toString();
doErr();
return;
}
}
try {
if( WhAjaj.isFunction( cb.onResponse ) ) {
cb.onResponse( resp, request, opt );
}
if( WhAjaj.isFunction( opt.onResponse ) ) {
opt.onResponse( resp, request, opt );
}
return true;
}
catch(e) {
opt.errorMessage = "Exception while handling inbound JSON response:\n"
+ e
+"\nOriginal response data:\n"+JSON.stringify(resp,0,2)
;
;
doErr();
return false;
}
},
/**
Should be called by sendImpl() implementations after a response
has failed to connect (e.g. could not resolve host or timeout
reached). This function takes care of most of ensuring that
framework-level conventions involving WhAjaj.Connector.options.ajax
properties are followed.
The request argument must be the original request passed to
the sendImpl() function. It may legally be null for GET
requests.
The 'this' object for this call MUST be a WhAjaj.Connector
instance in order for callback processing to work properly.
The opt object should be the normalized AJAX options used
for the connection. By convention, the caller of this
function "should" set opt.errorMessage to contain a
human-readable description of the error.
The sendImpl() should return immediately after calling this. The
return value from this function is unspecified.
*/
onSendError: function(request,opt) {
var cb = this.callbacks || {};
if( WhAjaj.isFunction(cb.afterSend) ) {
try {cb.afterSend( request, opt );}
catch(e){}
}
if( WhAjaj.isFunction(opt.afterSend) ) {
try {opt.afterSend( request, opt );}
catch(e){}
}
if( WhAjaj.isFunction( cb.onError ) ) {
try {cb.onError( request, opt );}
catch(e) {/*ignore*/}
}
if( WhAjaj.isFunction( opt.onError ) ) {
try {opt.onError( request, opt );}
catch(e) {/*ignore*/}
}
}
};
/**
WhAjaj.Connector.sendImpls holds several concrete
implementations of WhAjaj.Connector.prototype.sendImpl(). To use
a specific implementation by default assign
WhAjaj.Connector.prototype.sendImpl to one of these functions.
The functions defined here require that the 'this' object be-a
WhAjaj.Connector instance.
Historical notes:
a) We once had an implementation based on Prototype, but that
library just pisses me off (they change base-most types'
prototypes, introducing side-effects in client code which
doesn't even use Prototype). The Prototype version at the time
had a serious toJSON() bug which caused empty arrays to
serialize as the string "[]", which broke a bunch of my code.
(That has been fixed in the mean time, but i don't use
Prototype.)
b) We once had an implementation for the dojo library,
If/when the time comes to add Prototype/dojo support, we simply
need to port:
http://code.google.com/p/jsonmessage/source/browse/trunk/lib/JSONMessage/JSONMessage.inc.js
(search that file for "dojo" and "Prototype") to this tree. That
code is this code's generic grandfather and they are still very
similar, so a port is trivial.
*/
WhAjaj.Connector.sendImpls = {
/**
This is a concrete implementation of
WhAjaj.Connector.prototype.sendImpl() which uses the
environment's native XMLHttpRequest class to send whiki
requests and fetch the responses.
The only argument must be a connection properties object, as
constructed by WhAjaj.Connector.normalizeAjaxParameters().
If window.firebug is set then window.firebug.watchXHR() is
called to enable monitoring of the XMLHttpRequest object.
This implementation honors the loginName and loginPassword
connection parameters.
Returns the XMLHttpRequest object.
This implementation requires that the 'this' object be-a
WhAjaj.Connector.
This implementation uses setTimeout() to implement the
timeout support, and thus the JS engine must provide that
functionality.
*/
XMLHttpRequest: function(request, args)
{
var json = WhAjaj.isObject(request) ? JSON.stringify(request) : request;
var xhr = new XMLHttpRequest();
var startTime = (new Date()).getTime();
var timeout = args.timeout || 10000/*arbitrary!*/;
var hitTimeout = false;
var done = false;
var tmid /* setTimeout() ID */;
var whself = this;
function handleTimeout()
{
hitTimeout = true;
if( ! done )
{
var now = (new Date()).getTime();
try { xhr.abort(); } catch(e) {/*ignore*/}
// see: http://www.w3.org/TR/XMLHttpRequest/#the-abort-method
args.errorMessage = "Timeout of "+timeout+"ms reached after "+(now-startTime)+"ms during AJAX request.";
WhAjaj.Connector.sendHelper.onSendError.apply( whself, [request, args] );
}
return;
}
function onStateChange()
{ // reminder to self: apparently 'this' is-not-a XHR :/
if( hitTimeout )
{ /* we're too late - the error was already triggered. */
return;
}
if( 4 == xhr.readyState )
{
done = true;
if( tmid )
{
clearTimeout( tmid );
tmid = null;
}
if( (xhr.status >= 200) && (xhr.status < 300) )
{
WhAjaj.Connector.sendHelper.onSendSuccess.apply( whself, [request, xhr.responseText, args] );
return;
}
else
{
if( undefined === args.errorMessage )
{
args.errorMessage = "Error sending a '"+args.method+"' AJAX request to "
+"["+args.url+"]: "
+"Status text=["+xhr.statusText+"]"
;
WhAjaj.Connector.sendHelper.onSendError.apply( whself, [request, args] );
}
else { /*maybe it was was set by the timeout handler. */ }
return;
}
}
};
xhr.onreadystatechange = onStateChange;
if( ('undefined'!==(typeof window)) && ('firebug' in window) && ('watchXHR' in window.firebug) )
{ /* plug in to firebug lite's XHR monitor... */
window.firebug.watchXHR( xhr );
}
try
{
//alert( JSON.stringify( args ));
function xhrOpen()
{
if( ('loginName' in args) && args.loginName )
{
xhr.open( args.method, args.url, args.asynchronous, args.loginName, args.loginPassword );
}
else
{
xhr.open( args.method, args.url, args.asynchronous );
}
}
if( json && ('POST' === args.method.toUpperCase()) )
{
xhrOpen();
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
// Google Chrome warns that it refuses to set these
// "unsafe" headers (his words, not mine):
// xhr.setRequestHeader("Content-length", json.length);
// xhr.setRequestHeader("Connection", "close");
xhr.send( json );
}
else /* assume GET */
{
xhrOpen();
xhr.send(null);
}
tmid = setTimeout( handleTimeout, timeout );
return xhr;
}
catch(e)
{
args.errorMessage = e.toString();
WhAjaj.Connector.sendHelper.onSendError.apply( whself, [request, args] );
return undefined;
}
}/*XMLHttpRequest()*/,
/**
This is a concrete implementation of
WhAjaj.Connector.prototype.sendImpl() which uses the jQuery
AJAX API to send requests and fetch the responses.
The first argument may be either null/false, an Object
containing toJSON-able data to post to the back-end, or such an
object in JSON string form.
The second argument must be a connection properties object, as
constructed by WhAjaj.Connector.normalizeAjaxParameters().
If window.firebug is set then window.firebug.watchXHR() is
called to enable monitoring of the XMLHttpRequest object.
This implementation honors the loginName and loginPassword
connection parameters.
Returns the XMLHttpRequest object.
This implementation requires that the 'this' object be-a
WhAjaj.Connector.
*/
jQuery:function(request,args)
{
var data = request || undefined;
var whself = this;
if( data ) {
if('string'!==typeof data) {
try {
data = JSON.stringify(data);
}
catch(e) {
WhAjaj.Connector.sendHelper.onSendError.apply( whself, [request, args] );
return;
}
}
}
var ajopt = {
url: args.url,
data: data,
type: args.method,
async: args.asynchronous,
password: (undefined !== args.loginPassword) ? args.loginPassword : undefined,
username: (undefined !== args.loginName) ? args.loginName : undefined,
contentType: 'application/json; charset=utf-8',
error: function(xhr, textStatus, errorThrown)
{
//this === the options for this ajax request
args.errorMessage = "Error sending a '"+ajopt.type+"' request to ["+ajopt.url+"]: "
+"Status text=["+textStatus+"]"
+(errorThrown ? ("Error=["+errorThrown+"]") : "")
;
WhAjaj.Connector.sendHelper.onSendError.apply( whself, [request, args] );
},
success: function(data)
{
WhAjaj.Connector.sendHelper.onSendSuccess.apply( whself, [request, data, args] );
},
/* Set dataType=text instead of json to keep jQuery from doing our carefully
written response handling for us.
*/
dataType: 'text'
};
if( undefined !== args.timeout )
{
ajopt.timeout = args.timeout;
}
try
{
return jQuery.ajax(ajopt);
}
catch(e)
{
args.errorMessage = e.toString();
WhAjaj.Connector.sendHelper.onSendError.apply( whself, [request, args] );
return undefined;
}
}/*jQuery()*/,
/**
This is a concrete implementation of
WhAjaj.Connector.prototype.sendImpl() which uses the rhino
Java API to send requests and fetch the responses.
Limitations vis-a-vis the interface:
- timeouts are not supported.
- asynchronous mode is not supported because implementing it
requires the ability to kill a running thread (which is deprecated
in the Java API).
TODOs:
- add socket timeouts.
- support HTTP proxy.
The Java APIs support this, it just hasn't been added here yet.
*/
rhino:function(request,args)
{
var self = this;
var data = request || undefined;
if( data ) {
if('string'!==typeof data) {
try {
data = JSON.stringify(data);
}
catch(e) {
WhAjaj.Connector.sendHelper.onSendError.apply( self, [request, args] );
return;
}
}
}
var url;
var con;
var IO = new JavaImporter(java.io);
var wr;
var rd, ln, json = [];
function setIncomingCookies(list){
if(!list || !list.length) return;
if( !self.cookies ) self.cookies = {};
var k, v, i;
for( i = 0; i < list.length; ++i ){
v = list[i].split('=',2);
k = decodeURIComponent(v[0])
v = v[0] ? decodeURIComponent(v[0].split(';',2)[0]) : null;
//print("RECEIVED COOKIE: "+k+"="+v);
if(!v) {
delete self.cookies[k];
continue;
}else{
self.cookies[k] = v;
}
}
};
function setOutboundCookies(conn){
if(!self.cookies) return;
var k, v;
for( k in self.cookies ){
if(!self.cookies.hasOwnProperty(k)) continue /*kludge for broken JS libs*/;
v = self.cookies[k];
conn.addRequestProperty("Cookie", encodeURIComponent(k)+'='+encodeURIComponent(v));
//print("SENDING COOKIE: "+k+"="+v);
}
};
try{
url = new java.net.URL( args.url )
con = url.openConnection(/*FIXME: add proxy support!*/);
con.setRequestProperty("Accept-Charset","utf-8");
setOutboundCookies(con);
if(data){
con.setRequestProperty("Content-Type","application/json; charset=utf-8");
con.setDoOutput( true );
wr = new IO.OutputStreamWriter(con.getOutputStream())
wr.write(data);
wr.flush();
wr.close();
wr = null;
//print("POSTED: "+data);
}
rd = new IO.BufferedReader(new IO.InputStreamReader(con.getInputStream()));
//var skippedHeaders = false;
while ((line = rd.readLine()) !== null) {
//print("LINE: "+line);
//if(!line.length && !skippedHeaders){
// skippedHeaders = true;
// json = [];
// continue;
//}
json.push(line);
}
setIncomingCookies(con.getHeaderFields().get("Set-Cookie"));
}catch(e){
args.errorMessage = e.toString();
WhAjaj.Connector.sendHelper.onSendError.apply( self, [request, args] );
return undefined;
}
try { if(wr) wr.close(); } catch(e) { /*ignore*/}
try { if(rd) rd.close(); } catch(e) { /*ignore*/}
json = json.join('');
//print("READ IN JSON: "+json);
WhAjaj.Connector.sendHelper.onSendSuccess.apply( self, [request, json, args] );
}/*rhino*/
};
/**
An internal function which takes an object containing properties
for a WhAjaj.Connector network request. This function creates a new
object containing a superset of the properties from:
a) opt
b) this.options
c) WhAjaj.Connector.options.ajax
in that order, using the first one it finds.
All non-function properties are _deeply_ copied via JSON cloning
in order to prevent accidental "cross-request pollenation" (been
there, done that). Functions cannot be cloned and are simply
copied by reference.
This function throws if JSON-copying one of the options fails
(e.g. due to cyclic data structures).
Reminder to self: this function does not "normalize" opt.urlParam
by encoding it into opt.url, mainly for historical reasons, but
also because that behaviour was specifically undesirable in this
code's genetic father.
*/
WhAjaj.Connector.prototype.normalizeAjaxParameters = function (opt)
{
var rc = {};
function merge(k,v)
{
if( rc.hasOwnProperty(k) ) return;
else if( WhAjaj.isFunction(v) ) {}
else if( WhAjaj.isObject(v) ) v = JSON.parse( JSON.stringify(v) );
rc[k]=v;
}
function cp(obj) {
if( ! WhAjaj.isObject(obj) ) return;
var k;
for( k in obj ) {
if( ! obj.hasOwnProperty(k) ) continue /* i will always hate the Prototype designers for this. */;
merge(k, obj[k]);
}
}
cp( opt );
cp( this.options );
cp( WhAjaj.Connector.options.ajax );
// no, not here: rc.url = WhAjaj.Connector.sendHelper.normalizeURL(rc);
return rc;
};
/**
This is the generic interface for making calls to a back-end
JSON-producing request handler. It is a simple wrapper around
WhAjaj.Connector.prototype.sendImpl(), which just normalizes the
connection options for sendImpl() and makes sure that
opt.beforeSend() is (possibly) called.
The request parameter must either be false/null/empty or a
fully-populated JSON-able request object (which will be sent as
unencoded application/json text), depending on the type of
request being made. It is never semantically legal (in this API)
for request to be a string/number/true/array value. As a rule,
only POST requests use the request data. GET requests should
encode their data in opt.url or opt.urlParam (see below).
opt must contain the network-related parameters for the request.
Paramters _not_ set in opt are pulled from this.options or
WhAjaj.Connector.options.ajax (in that order, using the first
value it finds). Thus the set of connection-level options used
for the request are a superset of those various sources.
The "normalized" (or "superimposed") opt object's URL may be
modified before the request is sent, as follows:
if opt.urlParam is a string then it is assumed to be properly
URL-encoded parameters and is appended to the opt.url. If it is
an Object then it is assumed to be a one-dimensional set of
key/value pairs with simple values (numbers, strings, booleans,
null, and NOT objects/arrays). The keys/values are URL-encoded
and appended to the URL.
The beforeSend() callback (see below) can modify the options
object before the request attempt is made.
The callbacks in the normalized opt object will be triggered as
follows (if they are set to Function values):
- beforeSend(request,opt) will be called before any network
processing starts. If beforeSend() throws then no other
callbacks are triggered and this function propagates the
exception. This function is passed normalized connection options
as its second parameter, and changes this function makes to that
object _will_ be used for the pending connection attempt.
- onError(request,opt) will be called if a connection to the
back-end cannot be established. It will be passed the original
request object (which might be null, depending on the request
type) and the normalized options object. In the error case, the
opt object passed to onError() "should" have a property called
"errorMessage" which contains a description of the problem.
- onError(request,opt) will also be called if connection
succeeds but the response is not JSON data.
- onResponse(response,request) will be called if the response
returns JSON data. That data might hold an error response code -
clients need to check for that. It is passed the response object
(a plain object) and the original request object.
- afterSend(request,opt) will be called directly after the
AJAX request is finished, before onError() or onResonse() are
called. Possible TODO: we explicitly do NOT pass the response to
this function in order to keep the line between the responsibilities
of the various callback clear (otherwise this could be used the same
as onResponse()). In practice it would sometimes be useful have the
response passed to this function, mainly for logging/debugging
purposes.
The return value from this function is meaningless because
AJAX operations tend to take place asynchronously.
*/
WhAjaj.Connector.prototype.sendRequest = function(request,opt)
{
if( !WhAjaj.isFunction(this.sendImpl) )
{
throw new Error("This object has no sendImpl() member function! I don't know how to send the request!");
}
var ex = false;
var av = Array.prototype.slice.apply( arguments, [0] );
/**
FIXME: how to handle the error, vis-a-vis- the callbacks, if
normalizeAjaxParameters() throws? It can throw if
(de)JSON-izing fails.
*/
var norm = this.normalizeAjaxParameters( WhAjaj.isObject(opt) ? opt : {} );
norm.url = WhAjaj.Connector.sendHelper.normalizeURL(norm);
if( ! request ) norm.method = 'GET';
var cb = this.callbacks || {};
if( this.callbacks && WhAjaj.isFunction(this.callbacks.beforeSend) ) {
this.callbacks.beforeSend( request, norm );
}
if( WhAjaj.isFunction(norm.beforeSend) ){
norm.beforeSend( request, norm );
}
//alert( WhAjaj.stringify(request)+'\n'+WhAjaj.stringify(norm));
try { this.sendImpl( request, norm ); }
catch(e) { ex = e; }
if(ex) throw ex;
};
/**
sendImpl() holds a concrete back-end connection implementation. It
can be replaced with a custom implementation if one follows the rules
described throughout this API. See WhAjaj.Connector.sendImpls for
the concrete implementations included with this API.
*/
//WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.XMLHttpRequest;
//WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.rhino;
//WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.jQuery;
if( 'undefined' !== typeof jQuery ){
WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.jQuery;
}
else {
WhAjaj.Connector.prototype.sendImpl = WhAjaj.Connector.sendImpls.XMLHttpRequest;
}
fossil-2.5/ajax/wiki-editor.html 0000644 0000000 0000000 00000027304 13236644756 0016321 0 ustar 00nobody nobody
Fossil/JSON Wiki Editor Prototype
PROTOTYPE JSON-based Fossil Wiki Editor
See also: main test page.
Login:
or:
name:
pw:
Quick-posts: