fossil-src-1.33 0000755 0000000 0000000 00000000000 12530060143 0013013 5 ustar 00nobody nobody fossil-src-1.33/manifest 0000644 0000000 0000000 00000142553 12530060143 0014635 0 ustar 00nobody nobody C Version\s1.33
D 2015-05-23T11:11:31.970
F .dockerignore 29c5476ae4fb609219ea3f11d60c4b133a037b68
F .fossil-settings/clean-glob c1679d70a381afc39909203441036a736fb4b596
F .fossil-settings/encoding-glob f72f509f8101fb1f252c5719175a300aaabce8e0
F .fossil-settings/ignore-glob 402e93887552ebde5e8c4757982630b7de319b59
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 f57bc9b00197a8ac02d52afb9cb9dd4ade476c05
F Makefile.classic 8860fc8763421cb968e05bdd361311f9a443fc07
F Makefile.in 4c745f08a8ecfe6e1f227e2a6d33cce3adc532d0
F VERSION 68b05f0ffffaf08e478922297c5140cc3b5d6965
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 29c5eb998ee1b33f8138f26618ef1014a0555e48
F ajax/index.html 144dfb6264fd55caf41e9138e94110f846c2d701
F ajax/js/fossil-ajaj.js 7f57fa883df4e0bc9b0ee25fb7d3ead6e4808ae0
F ajax/js/json2.js 2e347546543bf026d364e9d308007b18225c0cba
F ajax/js/whajaj.js aaf43d1459ee6ea218da70ac02863b33f3740767
F ajax/wiki-editor.html 51f2d323985a3692772d2599c81222a58f1c444e
F art/CollRev1.dia 186c7bb7a88c533ab226431bbd7c4835bb6ac2a0
F art/CollRev2.dia 59b1c331a52e19f44f2dcf7c744dd5aaabd2b5cf
F art/CollRev3.dia d14a7b35e0af533998e705e771b504f8aaaead96
F art/CollRev4.dia be6e84c213b52cad03e3192fe8ba941709564fd4
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 e70a82048f77a7f67461cd7a06a287313e066531
F autosetup/LICENSE 34b2f1d7acba3eeb992e4281307640989cd08d0a
F autosetup/README.autosetup 4e0b671b54288fc64d851d056822ee5fec4d3365
F autosetup/autosetup f80eb8d3ebc34b06b08095daf8d964a898ea2777 x
F autosetup/cc-db.tcl 2789d831c2f4ac5364d6aaf0ea922b5fad382f4d
F autosetup/cc-lib.tcl 3c6bbfcb75eacfd4d5b060b9da74bfbf6e932305
F autosetup/cc-shared.tcl 6634fa62ced64692179819ef83eb0ade13f6f7d0
F autosetup/cc.tcl 1a4ebad038952b8631efa8e76e788157c5a39517
F autosetup/config.guess 3646b015d9a91423feaf2bac86fd2df7ab3564f6 x
F autosetup/config.sub 0a7de3085aaa4ea3655c4221574dc9e503035428 x
F autosetup/default.auto f78163e478676728918cbb7360abddb9c830e882
F autosetup/find-tclsh f973558ad74bd8e4d55b677d9c166cbb35f34186 x
F autosetup/jimsh0.c c4b6eb336c5fb548e747b1dc50ffc710fc0f7df0
F autosetup/local.tcl 3a6a7704f546f0863f86f69df7af1858de9c41c9
F autosetup/system.tcl 9e878fb45e32f6a2790ac82b84f9c9d951e15c68
F autosetup/test-tclsh f197a4c7bfa8bde7672864fc36dcbc7f85bdda6c x
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 21b39c131ad95fe5fdeec73465619a41111a6b99
F compat/zlib/ChangeLog 2f20d851233b844c2360c745a550d1cfd27b9f05
F compat/zlib/FAQ 832bb73adff252fa426a141ee4756daa9b8a4db4
F compat/zlib/INDEX 74611a0f2bcc004caa1fa07bdeb4c44b01f0a5d6
F compat/zlib/Makefile b04f62dd1002b9ca07068c90651432dec60029f3
F compat/zlib/Makefile.in e78954daf82e9a58efbed45c9d8751e9587fe7e2
F compat/zlib/README 605a2378c92d1ca9cb850bb403c60496346bcbdd
F compat/zlib/adler32.c 0cff4808476ce0b5f6f0ebbc69ee2ab2a0eebe43
F compat/zlib/amiga/Makefile.pup 79461cdcf8eda434edca3c32781982d2082af5fe
F compat/zlib/amiga/Makefile.sas 64787face2d527df6c78ba8754eb54c53dda6ac2
F compat/zlib/as400/bndsrc aef572b01ebe1aea4e8cd5fcf3307d8fa9ece41f
F compat/zlib/as400/compile.clp 8a1eb0df264e2ee0506e0161231551a40cd314e9
F compat/zlib/as400/readme.txt e33c9c2fb7eed894bae68600c69a17dc7474cb00
F compat/zlib/as400/zlib.inc a6f64b22423b2a59bb8710a11367189ece634fcb
F compat/zlib/compress.c 37f7523fc76d3fb1ddc1c9f47936e3e7ac481316
F compat/zlib/configure 65213505af98ff69e860857f1d823e22736555c1 x
F compat/zlib/contrib/README.contrib c8f5ac934e07b3d91b26b111f5bdc15befa425ac
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 de71c107c3fd780c55b9fd81fe1c7e1cfab67c45
F compat/zlib/contrib/ada/zlib-thin.adb 43c7e58eb582ce078f6ff76aa4f4eb09892ff92b
F compat/zlib/contrib/ada/zlib-thin.ads c24b97465351f562f5b9f751e6706ec01f166000
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 57809291a8febd74b57e784ecdb241421647343d
F compat/zlib/contrib/blast/blast.h fe4073ecdb97eb0d65e4242656b410bf22557e16
F compat/zlib/contrib/blast/test.pk 00d07b4c71bad842d7e04210f966e55977efd9c3
F compat/zlib/contrib/blast/test.txt aed9b9fc86b2b47a4c46053df53feb544ecf31ce
F compat/zlib/contrib/delphi/ZLib.pas 7a6968c37b7045a132b13fa57354f23c23f74720
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 7a0735c9d778e62af20192df8c9860d65786ec38
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 55d01b1ae60a09743e786523cbf1cd65e8577f50
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 x
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 x
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 d360812a8bc465d17b47e8224675bf561d8828bd
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 58dfec8630a3842b6689c077e81407a575de418c
F compat/zlib/contrib/minizip/iowin32.h 4fedf239afafc20e420c5fec678dba91c1dd0074
F compat/zlib/contrib/minizip/make_vms.com 79d9e7c5d124fbcf79bff4509b51c09600b33a34 x
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 9ae64cb93a02721d33907aa57c3017bcd4e1c19c
F compat/zlib/contrib/minizip/unzip.h 4236476513b299f00f9637f7ad3e3631ebdec2b9
F compat/zlib/contrib/minizip/zip.c 084ff1e900a3958b647ab7124f052f33a247b32c
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 f91c3ed34f25a253e6ee716adda55181809325b4
F compat/zlib/contrib/puff/Makefile 6c9c12d0e19be923abf86e2584a23a781d81cb06
F compat/zlib/contrib/puff/README 8f68ce02019463af0813a0db20c98bfc8e3c2ef7
F compat/zlib/contrib/puff/puff.c 945555da89b161ae6aa69eca20b0d89b3e269cec
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 6a562a79b66e86ecf7896e5736c851010c53ddfd
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/miniunz.vcxproj.user 43e826c5dfe10c024f4825d5b2205f1690c6f495
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/minizip.vcxproj.user 43e826c5dfe10c024f4825d5b2205f1690c6f495
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/testzlib.vcxproj.user 43e826c5dfe10c024f4825d5b2205f1690c6f495
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/testzlibdll.vcxproj.user 43e826c5dfe10c024f4825d5b2205f1690c6f495
F compat/zlib/contrib/vstudio/vc10/zlib.rc 295086b30d0fa090323baf827f11a9146d2914ed
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/zlibstat.vcxproj.user 43e826c5dfe10c024f4825d5b2205f1690c6f495
F compat/zlib/contrib/vstudio/vc10/zlibvc.def ed2863245d20ae12cd643eeb4e3b456c264a5723
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/vc10/zlibvc.vcxproj.user 43e826c5dfe10c024f4825d5b2205f1690c6f495
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 295086b30d0fa090323baf827f11a9146d2914ed
F compat/zlib/contrib/vstudio/vc11/zlibstat.vcxproj 223df1a7f2b79131c10230eb98d2112c93b9f977
F compat/zlib/contrib/vstudio/vc11/zlibvc.def ed2863245d20ae12cd643eeb4e3b456c264a5723
F compat/zlib/contrib/vstudio/vc11/zlibvc.sln 7fface057a73d5ad706203d3f6f1e37b59bce3b4
F compat/zlib/contrib/vstudio/vc11/zlibvc.vcxproj 947f29a61b08c158a960687a75b548769a5e1d32
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 295086b30d0fa090323baf827f11a9146d2914ed
F compat/zlib/contrib/vstudio/vc9/zlibstat.vcproj 235725a6f6285f12aa3ecc248b0afbcaeaa3367c
F compat/zlib/contrib/vstudio/vc9/zlibvc.def ed2863245d20ae12cd643eeb4e3b456c264a5723
F compat/zlib/contrib/vstudio/vc9/zlibvc.sln 8b46b3778372dbb718fd0f00ff1ee55266b18892
F compat/zlib/contrib/vstudio/vc9/zlibvc.vcproj 82379594550bf43deb4a5114d938ad8ca06fd763
F compat/zlib/crc32.c 4f033cc214310b581036760b9ad4537397257fa5
F compat/zlib/crc32.h db9e88b8332953972c9120c73389fa2ce03dd8f8
F compat/zlib/deflate.c 7b4ace6d698c5dbbfb9a8f047f63228ca54d2e77
F compat/zlib/deflate.h 29ed3b8ca3927576e5889dea5880ca0052942c7d
F compat/zlib/doc/algorithm.txt 8f58cd212772b622c71345ca5d7dd93648b8ab94
F compat/zlib/doc/rfc1950.txt 58f11c3e7778ca30e9c9330ab248107371429dd8
F compat/zlib/doc/rfc1951.txt b13d37ad6b3855f3a2eaf6c325eddaa7815355b0
F compat/zlib/doc/rfc1952.txt b2346a9c1e9cd011370595a292154ca83eff4ddb
F compat/zlib/doc/txtvsbin.txt 0b5f765b6151da46d356493278fd873e4c99ce80
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 c62c845a114cef8369e560d190346aae099aeb6c
F compat/zlib/examples/gzappend.c a22e75fe1bb392ce8516794d6e810fd0dfcf8dca
F compat/zlib/examples/gzjoin.c 9c34287cf18b05b761daf6457fc5efbf501358d2
F compat/zlib/examples/gzlog.c 8948bbb06e5a8dc323af41c3aa12eab4e4ac1bd0
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 9cca2b2aab8bdf928db85218293f67367ecfe687
F compat/zlib/gzclose.c 4698124c166f59728db9ae229f8467459b458ef3
F compat/zlib/gzguts.h 5ed502b2ac7a8ef477f5a3df79bad725de2ef46e
F compat/zlib/gzlib.c 7ab22c9de3fb1d8c2e4226fa30c4975e7bc07178
F compat/zlib/gzread.c cdea0dade92763c7676c2ededa97e7d0cbb03712
F compat/zlib/gzwrite.c f449a9e360584f3615671f00bf1aff66aec70cd9
F compat/zlib/infback.c 12a79b343baf402b755350c44e2bf4ada83b3295
F compat/zlib/inffast.c 1712d6c39b5cb4aff9f16e91cc1f3626e3721e39
F compat/zlib/inffast.h 4fc803c43a562b2b92a97e22300754ddfe44c603
F compat/zlib/inffixed.h 8770ab43c9050b824c646f6e6cee8b3c0628cbda
F compat/zlib/inflate.c 5ede4b23d0e54bfb08fed005cb35dd7b11580081
F compat/zlib/inflate.h a75affa8989115330672e04289b2681a542979b8
F compat/zlib/inftrees.c f1ae4935697dd305bde334835d7d3139e06197b9
F compat/zlib/inftrees.h 3c63a7707d83991f3e074391c047b3136ff3e558
F compat/zlib/make_vms.com dc817ba3a5335de14bde5b81b1a3365734757625 x
F compat/zlib/msdos/Makefile.bor 85d42a140e556d3b659f7e26c834b5574ea51754
F compat/zlib/msdos/Makefile.dj2 27db1cceefc629ce5bbafbf34188c4de18f327b8
F compat/zlib/msdos/Makefile.emx a27700d4d11801fd2b2e9bbbd51eee114b785239
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 512f3cf405b6671ef59e97277e03c1e78b117858
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 264d34095d4f456bedf18958bbc3380903ef09f3
F compat/zlib/old/os2/zlib.def 108527bad780aecce1c75efa9210f4b1173f4139
F compat/zlib/old/visual-basic.txt 1cf5886f7fcee4019ef529f8f19dd8000be01229
F compat/zlib/qnx/package.qpg f65989cb7a21e96e9827762546aa800c7c6e25d0
F compat/zlib/test/example.c 6ac38180088c90c7165bd2fce685411d62225dd2
F compat/zlib/test/infcover.c 591f0ed4ba6abfcd0a31cd74c7e83d1f8efceccc
F compat/zlib/test/minigzip.c 7552a3662d584f1ec62d3560c86465baec84becd
F compat/zlib/treebuild.xml 980c59f4b297234fdb0c82416fbc88575c103071
F compat/zlib/trees.c 160250aa6cff7f2b84d2ec534102b27be170f75d
F compat/zlib/trees.h 5d8a9c42f902d2418a7e63b539c0f319373e9400
F compat/zlib/uncompr.c e2fcd3aa628d4bbd135826108f55b886b2fc1a47
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 0b3cdeef5be44083d10a87a6edfd089cef229ebf
F compat/zlib/win32/Makefile.msc d70638599d2ef5c0e9ae37c063cf65e9b3692242
F compat/zlib/win32/README-WIN32.txt 70e024e3aa6a9f82bc0eb950c6cb57110e4541d7
F compat/zlib/win32/VisualC.txt e5df2e74c999dce787d725694968d9ce63662d82
F compat/zlib/win32/zlib.def 08119c287a243a91570bc5d2c7f66eba63e156fd
F compat/zlib/win32/zlib1.rc eeaf2d2d1bd45bd401038c406606c1fabec2e97d
F compat/zlib/zconf.h 9707b8deefcb90a7097d5df388c6ac5fffd9a04a
F compat/zlib/zconf.h.cmakein 411689e4473e6ba24954ae59c9ddb9f625a3c2d7
F compat/zlib/zconf.h.in 9707b8deefcb90a7097d5df388c6ac5fffd9a04a
F compat/zlib/zlib.3 7ee8eae8804ee814bc953a80cea51f23918438c5
F compat/zlib/zlib.3.pdf 672522c5633c8c5eedc420ef025788b35d3583b3
F compat/zlib/zlib.h 400d35465f179a4acacb5fe749e6ce20a0bbdb84
F compat/zlib/zlib.map 603e372e4e00806da3ee1b535c2afee27c44ba39
F compat/zlib/zlib.pc.cmakein c80d6efe2a2991a1836ee797f75b12c9d60b6783
F compat/zlib/zlib.pc.in 3ebc107b34d82b134e9f5933c2a569eb6e952ce4
F compat/zlib/zlib2ansi e9859eecf47ae66280573d73969c061989615134
F compat/zlib/zutil.c e1af709bff21ae0d4331119a7fc4c19f82932043
F compat/zlib/zutil.h b909d27ef9ce51639f76b7ea6b62721e7d1b6bf7
F configure 239cde01aca7fc63a2903f85bd2a6414189f1bd4 x
F debian/makedeb.sh b57db65590abc4216946cecd9850a94fd3a4b19f
F fossil.1 2947f4d66ede5508f4fbe501e1e965df3b3a243d
F setup/fossil.iss 57e01e1feb0198de025417c0a98f1d4b1c444f53
F setup/fossil.nsi 688d5a732b08facc529dceeb9fb1ce5c9aa050ab
F skins/README.md d81aeb05fb12f16afde4760671d3d45fe87a37f3
F skins/aht/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/black_and_white/css.txt 569f06d046846930594299a1e38714b50e0c74a7
F skins/black_and_white/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/black_and_white/footer.txt b2c60ecb6edfe58430883cb267f50ef35705b473
F skins/black_and_white/header.txt c74f3b8cfefae2e763d8f117dbd20e90c6dba33d
F skins/blitz/README.md 2b86027936aa1ed69d0ccc413868aa886cacb45f
F skins/blitz/arrow_project.png 2b2958e36ec7fe54836ab50d6c194789461463d0
F skins/blitz/css.txt 0d5206461cfa802a3c8b63f68964d4d777402fe9
F skins/blitz/details.txt 1260bc474e730cd32e4e86f7a346e22a1268cc8f
F skins/blitz/dir.png 4a210b2afb16584e6093478f77025da7e7b83a57
F skins/blitz/file.png 0d20b3bee95152a6358e1878a9bb07cc6a0f975d
F skins/blitz/footer.txt 6a2b49fa89f262377fc709549f745742bae76a1a
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 14ad6c45e2eb7e4664f362663e699e52a6e26bce
F skins/blitz/rss_20.png 7d659cf7e4378d16198ddd4e984b4073e1fac901
F skins/blitz/ticket.txt 1aab964cd7430a550560412a813fbe72311500d9
F skins/blitz_no_logo/README.md 24829897e941d1cef4f8b8d6291c86d9cfe17cd7
F skins/blitz_no_logo/css.txt 448d28510e35b9628e5a64fac981464a17bf0d9b
F skins/blitz_no_logo/details.txt 1260bc474e730cd32e4e86f7a346e22a1268cc8f
F skins/blitz_no_logo/footer.txt 6a2b49fa89f262377fc709549f745742bae76a1a
F skins/blitz_no_logo/header.txt fdfffc2be91c2d45f410e953337fa2aa55c58b96
F skins/blitz_no_logo/ticket.txt 1aab964cd7430a550560412a813fbe72311500d9
F skins/default/README.md 5914478ee55d86877ac6342bf704ffa5f87fc354
F skins/default/css.txt 3644519916de6a497cbda2baac0bd4abdbdce038
F skins/default/details.txt 916a4c696f0865d103980df3ae8425297d70af09
F skins/default/footer.txt 73c83aa5dd4b1ff7cfdd5a446a63c4e0193213a9
F skins/default/header.txt 382e13d2c8147320bb3598611f4625638f7694ad
F skins/eagle/README.md d6b7398b43bb8756316431d51d7efc8c3239c913
F skins/eagle/css.txt b57649b60d60efa2697e07a3523ec9016df527a0
F skins/eagle/details.txt 9515535a2768af2990a6a3aa0fbbcb628a36670b
F skins/eagle/footer.txt 7f36cbf30a82ef3cec30c1917a96415fa7d76eeb
F skins/eagle/header.txt abb29288da0af34b3877b4b1e135e5db5cc77532
F skins/enhanced1/css.txt 8ec40ceed5434186d4264607c2b4acca6a1a1249
F skins/enhanced1/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/enhanced1/footer.txt 7f36cbf30a82ef3cec30c1917a96415fa7d76eeb
F skins/enhanced1/header.txt 4f57da29b372156822ccd2dfbe1f7420c1c3b429
F skins/khaki/css.txt 2a210e3703806e09e04a739eb9877a4b953528e7
F skins/khaki/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/khaki/footer.txt b2c60ecb6edfe58430883cb267f50ef35705b473
F skins/khaki/header.txt 609fe1dd9dd3afdfe2777ce207a2012cb36c3f64
F skins/original/css.txt 8ec40ceed5434186d4264607c2b4acca6a1a1249
F skins/original/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/original/footer.txt 73c83aa5dd4b1ff7cfdd5a446a63c4e0193213a9
F skins/original/header.txt e1f837ff2d7bbe1cda8ca6847875491f6b5b269a
F skins/plain_gray/css.txt 56cdc6074767d5b90116b2e39074a40ac535ba93
F skins/plain_gray/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/plain_gray/footer.txt b2c60ecb6edfe58430883cb267f50ef35705b473
F skins/plain_gray/header.txt dc58123dc4ae1714dea231d69f3dcf25308fe83a
F skins/rounded1/css.txt cf2b6d826f72710f06de8e4ba9c11954d545f884
F skins/rounded1/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/rounded1/footer.txt b2c60ecb6edfe58430883cb267f50ef35705b473
F skins/rounded1/header.txt 90ea81c5b14e22a048e182c22769e9aa779d8752
F skins/xekri/README.md 4acf7362d3bae2959b35f0d07694128a081f7049
F skins/xekri/css.txt db7853ced22284e5bbc1f7cf7c978bca9bcf0ca7
F skins/xekri/details.txt b8f20e99b2dd421f72f686b286f04c0283f242c5
F skins/xekri/footer.txt e8a573cd5148c80926e8bed7f1407519cefbbd7c
F skins/xekri/header.txt b5adf120f4828b86e6bb9efa6d3345b51ab56fcf
F src/Makefile 102203d824d778194b79680bef8a553d5e6d9819
F src/add.c f3da742e34e12711528cceef61e040bb2ffbd69a
F src/allrepo.c cf9356bb2ef29ad8836889fbbc486f5a4ce2ffc1
F src/attach.c 5b713ffe437fa0c3241da307835b1286e38798fd
F src/bag.c a7eb89018c959ebe74f36496ff742d58610220b2
F src/bisect.c 9029c31c5fbce785202743937ccf4c276284b433
F src/blob.c 0d539a6e5ca07937733df17f37e68fbe27082d59
F src/branch.c 09724980278de18e9bbff5da85950c3febd811eb
F src/browse.c 904f68c2a82bed2b9533b76a3497a961d2ae25d9
F src/builtin.c 31c17d18b565c7766021913c89be4180b3ee4a56
F src/bundle.c 2aba06748d3bf43d66dc7c621138eb31b6b5b011
F src/cache.c 85da0ea6ee5ecff186e135b61108892904194e1e
F src/captcha.c 0ec2ed2bf4d3997c5cab5f9493435ec7493feee4
F src/cgi.c 6657772f2447b54cfa4fe965d00b9605a04ada4d
F src/checkin.c acb5a86ae18235cfcf9d0dde6fce742f3a5bfaae
F src/checkout.c 11b0ff042a12a54021924eb20130dc35cd72be6f
F src/clearsign.c 7ad6d8eebc228f0f5ba6bb1362985b845e272060
F src/clone.c 265e9a29da905f3ab68625a9a5b245d7630275b2
F src/codecheck1.c 2cf1fc75f4f611574e92cf1440f4fb2ae49e8ba6
F src/comformat.c f570981a7bb58eb3ecdfc52b4ac5be428dc32acb
F src/config.h 5b0f2c55c62691916d4477f37109d3356a1dcecf
F src/configure.c b8759201454accf1a9f760a232cf6c0a1f057294
F src/content.c 49fd70d3136fbeb4794b7ef2f76c977c3ea77013
F src/cson_amalgamation.c 992eb40c1cf7f2ee67f6c0d2a8579de84bff368a
F src/cson_amalgamation.h e6b06068f936bb96f0ce38e9dcd188df4f3d5f7b
F src/cygsup.h 70accd0c38dce40aa828cb321dffdde1f49f4e8c
F src/db.c 9ceff8564cd4ffaebb7e3b8efc960fc97a744014
F src/delta.c e8de840f518dca8a6641f34eae115c8f9ca36004
F src/deltacmd.c 4ac36378bf7b772d3bd67954212eb98be121961b
F src/descendants.c 8153a57364fc97fc6fc26b62efa0907d2fa28403
F src/diff.c 7146e8698601338a2c5ff7d33e309579bb4edee0
F src/diff.tcl 587933b55b28b63c3e4bb0ba91f257a49640bd0f
F src/diffcmd.c e3a5ca38f5154994e22875e24895a35f33d99c7e
F src/doc.c 1dfc49e465379f5fb1f37bed95ddaad085883f23
F src/encode.c 68aefc417e28d6ae9adb0a05f79dc46b5ecf1167
F src/event.c 8ee9f8359ef1c26c9cd831b229fd824573390e22
F src/export.c 5a38d841078ab504cfc1e73328a847c8d670d979
F src/file.c 45b8b355bfe5411a84c170590ddac48890a1e5ff
F src/finfo.c 504004df33665fe89ec695c34abce45e1873abd6
F src/foci.c 8e1553ee3a2db6b73497b4cfca8d4b8fe89e2471
F src/fusefs.c e25405b83122ed8369aa63125897348e5eb3cab2
F src/glob.c 2209933ddc94df7e019a24c088ebdde67c115bb5
F src/graph.c 845e2bcf72cfced7b9dee6b7b5093c92b05e11b0
F src/gzip.c b0d60daf0cf3e17c848906ec952ef0a4812d8a49
F src/http.c 5d5c19958bad3b0de0be4f47ad022c689be0d543
F src/http_socket.c cdd5f9adf90b400f997434a1b748da85fc7da635
F src/http_ssl.c 3bb5fed66102596645238c14ae010266ba7f0d2a
F src/http_transport.c 8231c313134df651b6a89028ce3bc03fc0c09f21
F src/import.c 39947d8db7449d3e73b121de4c1196e33138508c
F src/info.c 25476c22d1a31b796eb3fd5b0462e20137f13bda
F src/json.c 4bfa5f9114a9ff0678efbc010c8c31b914fb528f
F src/json_artifact.c 82c34f8fd337856f779c5062d4431266c4e5f505
F src/json_branch.c db1dbae4d7cbd728dbbf05167aaa5c1c6579ad8a
F src/json_config.c 1bbf8fc1b98f951f94dedc1a191c138f110b7a5d
F src/json_detail.h 7d9cdc126617216623145aaea42a914a93cf983c
F src/json_diff.c 784180c67a6bb8547dcb9adc430678c8286ab3ff
F src/json_dir.c bd7be6f09d9c4d951e68b9562ad13d15aa76fb70
F src/json_finfo.c 65693ef509f62591cec2fb2198b66f852742be80
F src/json_login.c d8daafbf01d285a7c64b9ef08c1e5875f8efa65f
F src/json_query.c 15f7b943478b3fa4a423aefb5a022e6e9513abc7
F src/json_report.c ae998f37dee54fa0b6c898de29b2f34d9a0d87b7
F src/json_status.c 0a9f959d19f4b90c879ad50ef0cd376262d8247b
F src/json_tag.c 2a9e6dac502055a795ef6ade37faa024d480015b
F src/json_timeline.c a8aece1a959dd8cae0d5a99f61cc5d31802b4e4b
F src/json_user.c 66fc65a1647616819074eb8ae4534f0822b2fb55
F src/json_wiki.c fca83828f069a0964f7b5e72dc4e8793e8571707
F src/leaf.c df47f8f52ed1ebeb3b7f5c7b92c62351b177d458
F src/loadctrl.c df2282aa92481289773a129400309e682d73a311
F src/login.c 0a6cf8707e27b04873950a6c63a48391c0a9f7ce
F src/lookslike.c 390a2bc854f3a8ea8259139af7f88c497960da97
F src/main.c 2315abe50eb6c01695ec11f2315e91e44114c59a
F src/main.mk c56b4b688a95c62878ca19916058b94f2a4466d0
F src/makeheaders.c c42268ec69aae42b8dd10471fd73377d789873ca
F src/makeheaders.html 4428f89f94c3b333b106171fe63f2c175d0ee53b
F src/makemake.tcl 7c95b041c0e6d691387c589fe5169f6ab7a9a552
F src/manifest.c ba061499e6431a1c2c8aa19821adf429975fdee6
F src/markdown.c c740cc81a2b0740548475fbe10f9ed159313cb66
F src/markdown.md 45f6e06e03e4183764067eec37ff73f357303306
F src/markdown_html.c 453460a916b805e688e4a6ed7b52994b171eea27
F src/md5.c c6f6b5df8001ab094e5f49416fc2aa3019823d69
F src/merge.c d323fe8c0930a5e850eabf3eb8991d717defe784
F src/merge3.c b2502f631c761f2c606f4fad6c8aa00bc2a5f4a7
F src/miniz.c 63d5f0addc835c68e41b4321719fe5153a2a6c45
F src/mkbuiltin.c 4f27b52df5a72b6c516ed48c585f94109eb63560
F src/mkindex.c 8b49a351b060c3e9203dacbacfc8216f760f8da2
F src/mkversion.c 40ed302872cc5795c76efb3ab089fc1aedba18f1
F src/moderate.c 8ab2bd4bda9a6b6765f99ddea7950dc5c6bad007
F src/name.c aa78af37cb3226cc56c955edfc28ba9094f0947b
F src/path.c 9455d26c4bf91ae949abd55536a1a20d863c486b
F src/piechart.c 02d8189bfce61a49ed7f8495299788feb1b54ede
F src/pivot.c f03ae2edfb53590f6dee86c1a0d93441feb0f816
F src/popen.c b2ca46105d929ed8329e45c2d526f68538ebf405
F src/pqueue.c dc6f71d9256f7087a85715cb05e78faeb151f026
F src/printf.c 3d86d4ec595025c938053049ea915012e2b10306
F src/publish.c 25af837ab073dfee967da752d6c78a0ed45f936c
F src/purge.c 211c55255d42f06781ae68f26e5ed4a2c9239ad1
F src/rebuild.c 5aaf2a7ce639be4caa966eafa59775ca997bda4f
F src/regexp.c bbd776d92790cee01990df6c25135b0d904cca5e
F src/report.c de3d39a59b923d0259a01cb7b66244860778e39d
F src/rss.c bb314966b5fd2c4a779d4ac6afbabc4721fcf44f
F src/schema.c cae75601dd0b3940bc192ff5a8b142d099bbc4e3
F src/search.c b02a73b942028631eacf484ae3f83a3a4edd3518
F src/setup.c 97d246c3bba673f87745d1c870250d30e53ab3ee
F src/sha1.c 475f5dc5fd546d3ec5cd656f773f36bb2d03584f
F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee
F src/shun.c a31e037850f11b14ffecaa2f46972e6175acec9a
F src/sitemap.c c61001e4c189224381a6474d204cde7d868e9ef0
F src/skins.c f12a6c105e7ceb269570e046800ae4ad1231b15a
F src/sqlcmd.c 9038553d94b648b9bf36cdbb40d54f4419dec2a1
F src/sqlite3.c 638abb77965332c956dbbd2c8e4248e84da4eb63
F src/sqlite3.h b479b6a7b0fc402946ae0ae2beb878ce6cc33ce2
F src/stash.c 18214fe82460ef5bbb4d9904620a96cd942aa937
F src/stat.c 760b5ec89d07e1d2b566353d588e77e8b9cf97c8
F src/statrep.c 18bd59afe94902740da515f323f64310325cb100
F src/style.c 1c9ef7c0dc77a49b6b833ec12971fb092e55885d
F src/sync.c a23d8d6dc35fe4a22f1bd9b0bb267c98952fe2ba
F src/tag.c 7d5fce007b31f441fc6d907248251e529495a474
F src/tar.c 9d67347c9ec4c8b5ec09c9cbc1247cd4fb49bccc
F src/th.c e9840f21b1bb1bc03fdba17c818728e132e254b7
F src/th.h 331b9aaf012117b22a3e8c4676c5b131cd8b7f9d
F src/th_lang.c f6085bbe7c97a4d00c8fe8cd9328d402937111a8
F src/th_main.c 00058b8cf89276094aae21c741ef15655d1fa34d
F src/th_tcl.c 7b37123bd606f5b9999a1103807f822a77dfcdc5
F src/timeline.c 4cf7561500d63e525be9d2a6a4445865240688a2
F src/tkt.c be76575f231f2ee778b63c686f20d59ed5b93469
F src/tktsetup.c 1360904128a3c60008867056d9f576c8f906eb7c
F src/translate.c 144427e4ae2bfa1966f138462181d224fb86c2de
F src/undo.c 463d3968fdd2cb7052bf351e9b028ad0dd556b10
F src/unicode.c 471c170c6ca090967e68ffa51010d79233b9ff1b
F src/update.c e4e6c94829ac7aebc0d7b9ab1c16cad3e5b02b9a
F src/url.c be48911fa1624051538157f2dfc815ec082e7206
F src/user.c 6ec57f122cadd7c324e657be5de1b0c8f0d37c8d
F src/utf8.c d9b19f5abbdecacb9b69a9e31f3bb0ef6e017918
F src/util.c 9f02b01358bf71236e91ebedde2027aa158bb87f
F src/verify.c 51b1a2e2609ae83f4e35243d1a38faa8271a0b22
F src/vfile.c b8560f486de87af7e480faaa34b946e7f042b408
F src/wiki.c 09aef1e140021ade15ebadfa2b7435b35f701442
F src/wikiformat.c f693446cc459fc72fb0345cff08b3573dbe4365d
F src/winfile.c 0bcf34859198c42bbfe224e23eb8bcf27dd3e27d
F src/winhttp.c 4e680d7c8778be4439169f40a992ccc81f7ceec2
F src/wysiwyg.c cc88a482a2fdec2fcfaf432e6bdb1ac444ebb1d4
F src/xfer.c 27b853ed9a5a7e20de06a080d89ff08c1825376c
F src/xfersetup.c 60d3e7eb781605652e593f1af2a4b9dd0bf99057
F src/zip.c 49c6b1327a9aea3b0682b2c55bddd9d54860ff6f
F test/Greek-Lipsum-1.txt 55659c6e062994f462feae602db99df94d5a4d83
F test/Greek-Lipsum-2.txt e3b3df6e8dd627b516e18105656345352a471b0c
F test/cmdline.test 4532df2c904f035fc2a3be3bca6c5514def515a8
F test/comment.test 3d18947b36ad7dcc914ed905eb950c9fb84a1ec6
F test/contains-selector.test 6ecd602b6786ebedca580b8e82e402c6f9aec2fd
F test/delta1.test a13b6b3efec3c09d07229f887d57a46cae0fb0e6
F test/diff-test-1.wiki 597fbb13c9c3da02e09a53d128f3b5d4dd5cadda
F test/file1.test 4a1009731c0959c46c228a9336df9da4a5da97f1
F test/fileStat.th1 e3e30f7b46488c26215a6d713be36ad4ed595132
F test/fileage-test-1.wiki d249e897fdd41038c17f3b66d374e509830da1eb
F test/glob.test 027f2aa0b0c737a0f27d51800802a08f07561beb
F test/graph-test-1.wiki 1bbf8bd05dfd5205c589569d911477c27aeb4d51
F test/many-www.tcl 4f2bfa076db6dde808b6155b65a6f1016aac0391
F test/markdown-test1.md bbb3b935b672bd27981d677d35849a4177daa41b
F test/merge1.test 4734854393f717824ae96b3de8524a2401a21921
F test/merge2.test 1915d0a7cf117dd7448d6ccc30b54b4cd85a942c
F test/merge3.test 637ad5275604c7fe17340b32338aadf2a1f27c07
F test/merge4.test e9b9b3826dc271ae75523a5fa0a08fe17b0cd722
F test/merge5.test 28cc9adf08343456fae9f2d9001c35ec62a78f31
F test/merge5_repo.sql 742ca843c4a2cdc7f72c9e850aa0cac80c1457aa
F test/merge6.test ed766d924a9cb87249bbe7f84e093135f088a2b3
F test/merge_renames.test 23036947380c8c2268761cf606063cbad51bb747
F test/release-checklist.wiki 671add634fe96d221bc04bc4d58ed58fd8581bb2
F test/revert.test fd2db9b23831a1e0e9ada5bfc7475fce579a949a
F test/subdir-b/readme.txt e8e5bf5191c37755b77f68dc971880cacc72ec09
F test/subdir/one/two/three/four/five/six/readme.txt 99ae38744ac72af06c059e59cb5fa636153c120b
F test/test-page++.wiki 0f8b7780a1e441e32feef0e2ae15c75a355e52a1
F test/tester.tcl f6f72930bf1958f87be305f6fd25f85e82fb9b09
F test/th1-docs-input.txt a08c24abac1d1592a1116f8396a53f03a47f25d3
F test/th1-docs.test b09ff99726b78609549c9880e3522497c138b935
F test/th1-hooks-input.txt a08c24abac1d1592a1116f8396a53f03a47f25d3
F test/th1-hooks.test 3e533ca4b5956be9f13119177c795465dd3dd3a8
F test/th1-tcl.test 2122a0da663a830cfefa68cc997adeec0b0013c7
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 6075c4daebcaa4b20877f0b500940bdfe18ecb0a
F test/update-test-1.sh 6812a27babef50e8888641f52936a7db3d3c9d6f
F test/update-test-2.sh a976664f21390761543dcd93b290bd9beed96667
F test/utf.test 9b9447e346cbc663d6f3c51e00adbc1ba2d296a2
F test/utf16be.txt 53a0f53370156db87378709ca00deeb560681ec1
F test/utf16le.txt ffa2c69c1239ec3ea46ef5abc04210171ed88719
F test/valgrind-www.tcl b298cdae985190042a1cf83782af99ec28875b03
F tools/cvs2fossil/changeset 60a9ddc157ed086dbc7a06ef3b3c188148814be0
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 6d6903cdcab3809b6f7cf19e1073e754bed592d2
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 b2c7314519b34cfc9be5d8a8a85dbf56f48caf84
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 124db2afe9bc2adab4e0ec405998d5df657e82f7
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_chat.tcl a9de1adfac21cf2cab4406965e24b10781fb59e0
F tools/fossilwiki 7d167aaa9d5114d0fa0962c92befe26615e9fcbc x
F win/Makefile.PellesCGMake cd7a95bc1ffa5608ae7c84b043d99d57e668803f
F win/Makefile.dmc cf59fe3e8f3657d4b4738adec3e40a0bed7db602
F win/Makefile.mingw 7dc01337f4d2906df2710a67b7b72207c10d8e98
F win/Makefile.mingw.mistachkin a5dacc6c4b9b09731ed30c40e64090cb67eee82c
F win/Makefile.msc 9bf6249b5bbefe943b72e64988a217a211497a07
F win/buildmsvc.bat 869c37b9583faaaf69a04a4fac921ce5edb74f0e
F win/fossil.exe.manifest f81a7d376816e7c6c38495b475e7fa54ed09b002
F win/fossil.ico 01423a2d71e01558a94d6cd6525f6a98977f29ee
F win/fossil.rc e71fb1ba07243265901077141df5eec7ab27aba9
F win/include/dirent.h 0e00ac29eb8c2e237bc460ae4481cc74a1bf9e00
F win/include/unistd.h 44f9195ff0279791af08c504f58939ba0ca01c4b
F www/CollRev1.gif 3ca46d72571bc56d114d467ec8d291541c9ae932
F www/CollRev2.gif 581afba0a01d5fd62e06ebbed88e76e51a5d1d6c
F www/CollRev3.gif 996e26f2d6182a95e4e0781529cd34178e3bfa25
F www/CollRev4.gif 2344026a4ce78a39b198ccbd3accd554798aa915
F www/adding_code.wiki b769f1c0b4fd661ea7d3a22e6bbc10d9ebeed677
F www/antibot.wiki 2cb08df5fdf129d683b1fa104c93c6785660432b
F www/apple-touch-icon.png 68adbb71243e6c7c4eddeeeda339c76ef77084e5
F www/background.jpg 85f8f27f45a743484488e6c5cf0bd060137973a8
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 2375d7530edc4455e4c36a3c6b3474659ac983bf
F www/bugtheory.wiki e43e29be95b51db3cbe00dfc0c4cea6a3a424eec
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 1a0af5fa07defbe9c0ef2a821158fd51f39183a9
F www/changes.wiki 1a8a018eb9b0183080a42d7a7d4b2f2de88d777b
F www/checkin.wiki 57faeb0861430c6bc83e179bf4e254c6e982370b
F www/checkin_names.wiki 37087c035ff437c1c14dce07a0b8c7bf7adb3c2d
F www/cmd_.wiki-template a0e5ab8f206047b8513725a7ccda23b8ef7b3608
F www/concept1.gif 6bb98f69a2cfe883ad6dbfbb70561b2282a563e1
F www/concept2.gif ff6165d1e94186362309c951622c8dcee6edcf2c
F www/concepts.wiki a1230dfc3bdef4f0ddc78c3cc8695a60eb7684fe
F www/contribute.wiki 9f7136d12f9099e615c8d5a414934e0b15613393
F www/copyright-release.html af2224620e3aa85d5226b74832dce703616a1c21
F www/copyright-release.pdf 7caa5bde467050c092bd63656e164f29950d6434
F www/custom_ticket.wiki 4083c719eee18ea9dad81d335e45e9af8e29ec4e
F www/customgraph.md dee9e20fca78d35c9821a0f52eeaa9256252075c
F www/customskin.md 9086cace41566061c87d3b8494d75f699bec041e
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 9686168c940fc6e88065a845918e9b7e77e881c8
F www/delta_format.wiki df258b69a8be9a4e3f4ce6dbef3077cfb3dcb89c
F www/embeddeddoc.wiki b0a84f7535827c2d612d9cd6598f028d12cf55e6
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/event.wiki 395b955e611769fd9aedf3ab489530b89ad5f224
F www/faq.tcl ce69c67e15fdac73ba83f6b9d214a7188fc04922
F www/faq.wiki 93c4421d2bafd192dc61ea563df68aa25caaed95
F www/fileformat.wiki 1cd023bfde51e32161cee8f0824be255f76e30e8
F www/fiveminutes.wiki 3172b324738523b163b19a8c836d3d9a3ceb9b94
F www/foss-cklist.wiki 77fe5872d7077a68e1b01e8dd5e3a48f7ee2b0dd
F www/fossil-from-msvc.wiki f2c229553ff6304fa0c6e82d169e959498af98a8
F www/fossil-v-git.wiki 31acd45f927afcd17712b633e7e0799dd03346eb
F www/fossil.eps 672ae6297081bd6a1c9565a9cae7c8299a1d61e3
F www/fossil.gif 590c4da59ebd76b65da0c9ba610d661f1bcb0146
F www/fossil2.eps d8e0aba6acbeb3cba071ed894783ca9b8de9a310
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 b0e3a47ea763b336736f6371e2a461d858eb73c1
F www/fossil_prompt.wiki 8ea400e45e41184d859cf9e3cc0186c5fa81c5be
F www/hacker-howto.wiki e30361cfbc08462444e4ea943b977abe0b952dbe
F www/hints.wiki 1b508177aeff0580a7544942681de2d0b00c705d
F www/index.wiki ed2340fa4a69d437e8d796814a12cde3fa9d290a
F www/inout.wiki 61818535112fc22f7c80de4683c834f5fec27362
F www/makefile.wiki 843e568594e5320634da1fccc5177f99d4f7044d
F www/mkdownload.tcl 2adb240f61ff7f6027e5f00b5920f74b9e6680f2
F www/mkindex.tcl fc48247219c0dde8e35b723a25de85e11c63d58f
F www/newrepo.wiki f0b0a01e2dcf85b2d50f14196775e89c808a3b0b
F www/password.wiki 336916afde4ff470e87fc43066063623a9a74c8a
F www/permutedindex.html 2499997e14dba536be940b5e856164c21a276ebe
F www/pop.wiki 759734461ff700ab2cf94bec8f1eba08b239a092
F www/private.wiki 72344489bbae6f7955369559b6ab22e01a64259b
F www/qandc.wiki e07b21da221b05afeb1905f17af3765045952ba8
F www/quickstart.wiki aa6a95f181fad1f7806016ed463b4875ec06dd8a
F www/quotes.wiki 831d8cd640488fbf36621ad96ce4b6082417ffa2
F www/reviews.wiki 866e545f89fce7cff29c96a29ab10586692f3964
F www/scgi.wiki 45a497a26ea940ef945a4c34cc1458ddddf304d6
F www/selfcheck.wiki d1e2fc5baf9ade46815499c9758256a22efe8142
F www/selfhost.wiki 03de31d67690fe47972589e4e1e395e11559c85c
F www/server.wiki 3e4c81928384c129f86445928c337594d8c82ef0
F www/settings.wiki 691c64e6d164d5a26cef610d07b000659189a314
F www/shunning.wiki 8e73f8191c1270e33863dac5529f93397ac158e4
F www/ssl.wiki f381ee310d2953040b9172a19de4d865f5885a97
F www/stats.wiki 2d8317fe35d22877c86ed2332de02b653f50a498
F www/style.wiki 4c9c67c0eddba030a73a55e468802fd09d59bc2f
F www/sync.wiki ecd7e356270a40e81649970c1b606767db68d9e3
F www/tech_overview.wiki 66d893fd0bca7f5dbc659ab0b4e9dde987e4fdb3
F www/th1.md bf69f21f480afe640a327cd0d392be77a9a3c1bb
F www/theory1.wiki ddd2a87bc0849a3da7c2187cb91219bf0941dae0
F www/tickets.wiki 717ff5a436834bf0ec42f9501216449c40b938fe
F www/uitest.html b4160b619cb6694c0caebd13422b15a3182e5dee
F www/webpage-ex.md 72a7965e3c53ea04beb0bbac5e11757b308b2059
F www/webui.wiki 7fe551ac712f1036d3927f983e6469962fe4402d
F www/wikitheory.wiki 06d46f731993c0d0ab1c9b202fea77a6dbd6a7a8
P 36c457b086ed710f2f8b825e2657ead54b27364f
R fa566a255d636eaaa4b59169412ce50e
T +bgcolor * #d0c0ff
T +sym-release *
T +sym-version-1.33 *
U drh
Z fcd65a9b4e598d39eae8601775b2f8cb
# Remove this line to create a well-formed manifest.
fossil-src-1.33/manifest.uuid 0000644 0000000 0000000 00000000051 12530060143 0015564 0 ustar 00nobody nobody 9c65b5432e4aeecf3556e5550c338ce93fd861cc
fossil-src-1.33/.dockerignore 0000644 0000000 0000000 00000000241 12530060143 0015543 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-src-1.33/.fossil-settings 0000755 0000000 0000000 00000000000 12530060143 0016226 5 ustar 00nobody nobody fossil-src-1.33/.fossil-settings/clean-glob 0000644 0000000 0000000 00000000214 12530060143 0020230 0 ustar 00nobody nobody *.a
*.lib
*.manifest
*.o
*.obj
*.pdb
*.res
Makefile
bld/*
wbld/*
win/*.c
win/*.h
win/*.exe
win/headers
win/linkopts
autoconfig.h
config.log
fossil-src-1.33/.fossil-settings/encoding-glob 0000644 0000000 0000000 00000000067 12530060143 0020742 0 ustar 00nobody nobody compat/zlib/contrib/dotzlib/DotZLib/*.cs
win/fossil.rc
fossil-src-1.33/.fossil-settings/ignore-glob 0000644 0000000 0000000 00000000075 12530060143 0020436 0 ustar 00nobody nobody compat/openssl*
compat/tcl*
fossil
fossil.exe
win/fossil.exe
fossil-src-1.33/.project 0000644 0000000 0000000 00000000307 12530060143 0014541 0 ustar 00nobody nobody
fossil
fossil-src-1.33/.settings 0000755 0000000 0000000 00000000000 12530060143 0014731 5 ustar 00nobody nobody fossil-src-1.33/.settings/org.eclipse.core.resources.prefs 0000644 0000000 0000000 00000000067 12530060143 0023226 0 ustar 00nobody nobody eclipse.preferences.version=1
encoding/=UTF-8
fossil-src-1.33/.settings/org.eclipse.core.runtime.prefs 0000644 0000000 0000000 00000000060 12530060143 0022670 0 ustar 00nobody nobody eclipse.preferences.version=1
line.separator=\n
fossil-src-1.33/BUILD.txt 0000644 0000000 0000000 00000005220 12530060143 0014471 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-src-1.33/COPYRIGHT-BSD2.txt 0000644 0000000 0000000 00000002754 12530060143 0015703 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-src-1.33/Dockerfile 0000644 0000000 0000000 00000002503 12530060143 0015064 0 ustar 00nobody nobody ###
# Dockerfile for Fossil
###
FROM fedora:21
### Now install some additional parts we will need for the build
RUN yum update -y && yum install -y gcc make zlib-devel openssl-devel tar && yum 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 "release", change the next line accordingly.
ENV FOSSIL_INSTALL_VERSION trunk
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-shared --disable-threads --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-lineedit --disable-fusefs --json --with-th1-docs --with-th1-hooks --with-tcl
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 yum remove -y gcc make zlib-devel openssl-devel tar && yum clean all
USER fossil
ENV HOME /opt/fossil
EXPOSE 8080
CMD ["/usr/bin/fossil", "server", "--create", "--user", "admin", "/opt/fossil/repository.fossil"]
fossil-src-1.33/Makefile.classic 0000644 0000000 0000000 00000005142 12530060143 0016154 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
#### 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. We sometimes add the -static option
# here so that we can build a static executable that will run in
# a chroot jail.
#
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-src-1.33/Makefile.in 0000644 0000000 0000000 00000003317 12530060143 0015143 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
LIB = @LDFLAGS@ @EXTRA_LDFLAGS@ @LIBS@
TCCFLAGS = @EXTRA_CFLAGS@ @CPPFLAGS@ @CFLAGS@ -DHAVE_AUTOCONFIG_H -D_HAVE_SQLITE_CONFIG_H
INSTALLDIR = $(DESTDIR)@prefix@/bin
USE_SYSTEM_SQLITE = @USE_SYSTEM_SQLITE@
FOSSIL_ENABLE_MINIZ = @FOSSIL_ENABLE_MINIZ@
include $(SRCDIR)/main.mk
distclean: clean
rm -f autoconfig.h config.log Makefile
fossil-src-1.33/VERSION 0000644 0000000 0000000 00000000005 12530060143 0014135 0 ustar 00nobody nobody 1.33
fossil-src-1.33/ajax 0000755 0000000 0000000 00000000000 12530060143 0013736 5 ustar 00nobody nobody fossil-src-1.33/ajax/README 0000644 0000000 0000000 00000002375 12530060143 0014704 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-src-1.33/ajax/cgi-bin 0000755 0000000 0000000 00000000000 12530060143 0015246 5 ustar 00nobody nobody fossil-src-1.33/ajax/cgi-bin/fossil-json.cgi.example 0000644 0000000 0000000 00000000067 12530060143 0021714 0 ustar 00nobody nobody #!/path/to/fossil/binary
repository: /path/to/repo.fsl
fossil-src-1.33/ajax/i-test 0000755 0000000 0000000 00000000000 12530060143 0015143 5 ustar 00nobody nobody fossil-src-1.33/ajax/i-test/rhino-shell.js 0000644 0000000 0000000 00000014225 12530060143 0020010 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-src-1.33/ajax/i-test/rhino-test.js 0000644 0000000 0000000 00000021023 12530060143 0017652 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-src-1.33/ajax/index.html 0000644 0000000 0000000 00000030166 12530060143 0016020 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-src-1.33/ajax/js 0000755 0000000 0000000 00000000000 12530060143 0014352 5 ustar 00nobody nobody fossil-src-1.33/ajax/js/fossil-ajaj.js 0000644 0000000 0000000 00000023327 12530060143 0017200 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-src-1.33/ajax/js/json2.js 0000644 0000000 0000000 00000041664 12530060143 0016035 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-src-1.33/ajax/js/whajaj.js 0000644 0000000 0000000 00000133734 12530060143 0016246 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 paramater 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-src-1.33/ajax/wiki-editor.html 0000644 0000000 0000000 00000027333 12530060143 0017142 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: