0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 70 68 70 2d 63 #!/usr/bin/php-c
0010: 67 69 20 2d 64 63 67 69 2e 66 6f 72 63 65 5f 72 gi -dcgi.force_r
0020: 65 64 69 72 65 63 74 3d 30 0a 3c 3f 70 68 70 0a edirect=0.<?php.
0030: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 75 74 66 2d # encoding: utf-
0040: 38 0a 23 20 61 70 69 3a 20 63 67 69 0a 23 20 74 8.# api: cgi.# t
0050: 79 70 65 3a 20 6f 75 74 70 75 74 0a 23 20 63 61 ype: output.# ca
0060: 74 65 67 6f 72 79 3a 20 61 70 69 0a 23 20 74 69 tegory: api.# ti
0070: 74 6c 65 3a 20 70 72 6f 6a 65 63 74 2e 6a 73 6f tle: project.jso
0080: 6e 0a 23 20 64 65 73 63 72 69 70 74 69 6f 6e 3a n.# description:
0090: 20 66 72 65 73 68 63 6f 64 65 2d 73 74 79 6c 65 freshcode-style
00a0: 20 70 72 6f 6a 65 63 74 2e 6a 73 6f 6e 20 77 2f project.json w/
00b0: 20 63 68 61 6e 67 65 6c 6f 67 0a 23 20 76 65 72 changelog.# ver
00c0: 73 69 6f 6e 3a 20 30 2e 31 0a 23 20 73 74 61 74 sion: 0.1.# stat
00d0: 65 3a 20 62 65 74 61 0a 23 20 64 65 70 65 6e 64 e: beta.# depend
00e0: 73 3a 20 70 68 70 3a 73 71 6c 69 74 65 0a 23 20 s: php:sqlite.#
00f0: 63 6f 6e 66 69 67 3a 20 2d 0a 23 20 61 63 63 65 config: -.# acce
0100: 73 73 3a 20 70 75 62 6c 69 63 0a 23 0a 23 20 47 ss: public.#.# G
0110: 65 6e 65 72 61 74 65 73 20 61 20 70 72 6f 6a 65 enerates a proje
0120: 63 74 2e 6a 73 6f 6e 20 63 6f 6e 74 61 69 6e 69 ct.json containi
0130: 6e 67 20 67 65 6e 65 72 61 6c 20 64 65 74 61 69 ng general detai
0140: 6c 73 0a 23 20 61 73 20 77 65 6c 6c 20 61 73 20 ls.# as well as
0150: 61 20 60 72 65 6c 65 61 73 65 73 60 20 63 68 61 a `releases` cha
0160: 6e 67 65 6c 6f 67 20 2b 20 64 6f 77 6e 6c 6f 61 ngelog + downloa
0170: 64 20 6c 69 6e 6b 73 2e 0a 23 0a 0a 0a 23 2d 2d d links..#...#--
0180: 20 69 6e 69 74 0a 69 6e 63 6c 75 64 65 28 22 2e init.include(".
0190: 2f 66 6f 73 73 69 6c 5f 63 6f 6d 6d 6f 6e 2e 70 /fossil_common.p
01a0: 68 70 22 29 3b 0a 0a 0a 23 2d 2d 20 63 68 61 6e hp");...#-- chan
01b0: 67 65 6c 6f 67 0a 66 75 6e 63 74 69 6f 6e 20 72 gelog.function r
01c0: 63 28 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e c() {. return
01d0: 20 64 62 28 22 0a 20 20 20 20 20 53 45 4c 45 43 db(". SELEC
01e0: 54 20 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 20 74 T event.mtime, t
01f0: 61 67 2e 74 61 67 6e 61 6d 65 2c 20 4d 41 58 28 ag.tagname, MAX(
0200: 74 61 67 2e 74 61 67 69 64 29 2c 20 44 41 54 45 tag.tagid), DATE
0210: 28 65 76 65 6e 74 2e 6d 74 69 6d 65 29 20 41 53 (event.mtime) AS
0220: 20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 d,.
0230: 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 20 41 53 event.comment AS
0240: 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 20 46 52 comment. FR
0250: 4f 4d 20 65 76 65 6e 74 0a 20 20 20 20 20 20 4c OM event. L
0260: 45 46 54 20 4a 4f 49 4e 20 74 61 67 78 72 65 66 EFT JOIN tagxref
0270: 20 4f 4e 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d ON event.objid=
0280: 74 61 67 78 72 65 66 2e 72 69 64 0a 20 20 20 20 tagxref.rid.
0290: 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 67 20 LEFT JOIN tag
02a0: 4f 4e 20 74 61 67 78 72 65 66 2e 74 61 67 69 64 ON tagxref.tagid
02b0: 3d 74 61 67 2e 74 61 67 69 64 0a 20 20 20 20 20 =tag.tagid.
02c0: 57 48 45 52 45 20 74 79 70 65 3d 27 63 69 27 0a WHERE type='ci'.
02d0: 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 6f 62 GROUP BY ob
02e0: 6a 69 64 0a 20 20 20 20 20 4f 52 44 45 52 20 42 jid. ORDER B
02f0: 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44 45 Y event.mtime DE
0300: 53 43 0a 20 20 20 20 20 4c 49 4d 49 54 20 31 37 SC. LIMIT 17
0310: 35 30 0a 20 20 20 20 22 29 20 2b 20 5b 39 39 39 50. ") + [999
0320: 39 39 3d 3e 5b 22 74 61 67 6e 61 6d 65 22 3d 3e 99=>["tagname"=>
0330: 22 65 6e 64 2d 30 2e 30 22 2c 20 22 64 22 3d 3e "end-0.0", "d"=>
0340: 22 30 2d 30 2d 30 22 2c 20 22 63 6f 6d 6d 65 6e "0-0-0", "commen
0350: 74 22 3d 3e 22 2d 22 5d 5d 3b 0a 7d 0a 23 20 67 t"=>"-"]];.}.# g
0360: 75 65 73 73 20 73 74 61 62 69 6c 69 74 79 0a 66 uess stability.f
0370: 75 6e 63 74 69 6f 6e 20 73 74 61 74 65 28 24 76 unction state($v
0380: 65 72 2c 20 24 63 68 61 6e 67 65 73 29 20 7b 0a er, $changes) {.
0390: 20 20 20 20 69 66 20 28 70 72 65 67 5f 6d 61 74 if (preg_mat
03a0: 63 68 28 22 2f 73 74 61 62 6c 65 7c 62 65 74 61 ch("/stable|beta
03b0: 7c 61 6c 70 68 61 2f 22 2c 20 24 63 68 61 6e 67 |alpha/", $chang
03c0: 65 73 2c 20 24 75 75 29 29 20 7b 0a 20 20 20 20 es, $uu)) {.
03d0: 20 20 20 20 72 65 74 75 72 6e 20 24 75 75 5b 30 return $uu[0
03e0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 ];. }. els
03f0: 65 69 66 20 28 70 72 65 67 5f 6d 61 74 63 68 28 eif (preg_match(
0400: 22 2f 5c 2e 30 2f 22 2c 20 24 76 65 72 29 29 20 "/\.0/", $ver))
0410: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
0420: 20 22 73 74 61 62 6c 65 22 3b 0a 20 20 20 20 7d "stable";. }
0430: 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 . else {.
0440: 20 20 20 20 72 65 74 75 72 6e 20 22 64 65 76 65 return "deve
0450: 6c 6f 70 6d 65 6e 74 22 3b 0a 20 20 20 20 7d 0a lopment";. }.
0460: 7d 0a 23 20 6a 75 64 67 65 20 66 69 78 2f 63 68 }.# judge fix/ch
0470: 61 6e 67 65 79 6e 65 73 73 0a 66 75 6e 63 74 69 angeyness.functi
0480: 6f 6e 20 73 63 6f 70 65 28 24 76 65 72 2c 20 24 on scope($ver, $
0490: 63 68 61 6e 67 65 73 29 20 7b 0a 20 20 20 20 24 changes) {. $
04a0: 66 69 78 20 3d 20 70 72 65 67 5f 6d 61 74 63 68 fix = preg_match
04b0: 5f 61 6c 6c 28 22 2f 66 69 78 7c 63 6f 72 72 65 _all("/fix|corre
04c0: 63 74 7c 6d 65 72 67 65 2f 69 22 2c 20 24 63 68 ct|merge/i", $ch
04d0: 61 6e 67 65 73 2c 20 24 75 75 29 3b 0a 20 20 20 anges, $uu);.
04e0: 20 24 61 64 64 20 3d 20 70 72 65 67 5f 6d 61 74 $add = preg_mat
04f0: 63 68 5f 61 6c 6c 28 22 2f 61 64 64 7c 63 68 61 ch_all("/add|cha
0500: 6e 67 65 7c 69 6e 74 72 6f 2f 69 22 2c 20 24 63 nge|intro/i", $c
0510: 68 61 6e 67 65 73 2c 20 24 75 75 29 3b 0a 20 20 hanges, $uu);.
0520: 20 20 24 73 20 3d 20 20 28 28 24 66 69 78 20 2b $s = (($fix +
0530: 20 24 61 64 64 29 20 3e 20 32 30 29 20 3f 20 22 $add) > 20) ? "
0540: 6d 61 6a 6f 72 20 22 20 3a 20 22 6d 69 6e 6f 72 major " : "minor
0550: 20 22 3b 0a 20 20 20 20 24 73 20 2e 3d 20 28 24 ";. $s .= ($
0560: 66 69 78 20 3e 20 24 61 64 64 29 20 3f 20 22 62 fix > $add) ? "b
0570: 75 67 66 69 78 22 20 3a 20 22 63 68 61 6e 67 65 ugfix" : "change
0580: 73 22 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 24 s";. return $
0590: 73 3b 0a 7d 0a 23 20 73 74 61 63 6b 20 72 65 6c s;.}.# stack rel
05a0: 65 61 73 65 20 6e 6f 74 65 73 20 62 79 20 74 61 ease notes by ta
05b0: 67 2f 76 65 72 73 69 6f 6e 0a 66 75 6e 63 74 69 g/version.functi
05c0: 6f 6e 20 72 65 6c 65 61 73 65 73 28 29 20 7b 0a on releases() {.
05d0: 20 20 20 20 24 76 65 72 20 3d 20 22 74 72 75 6e $ver = "trun
05e0: 6b 22 3b 0a 20 20 20 20 24 64 61 74 65 20 3d 20 k";. $date =
05f0: 74 69 6d 65 28 29 3b 0a 20 20 20 20 24 63 68 61 time();. $cha
0600: 6e 67 65 73 20 3d 20 22 22 3b 0a 20 20 20 20 24 nges = "";. $
0610: 72 65 6c 65 61 73 65 73 20 3d 20 5b 5d 3b 0a 20 releases = [];.
0620: 20 20 20 66 6f 72 65 61 63 68 28 72 63 28 29 20 foreach(rc()
0630: 61 73 20 24 72 29 20 7b 0a 20 20 20 20 20 20 20 as $r) {.
0640: 20 69 66 20 28 70 72 65 67 5f 6d 61 74 63 68 28 if (preg_match(
0650: 22 2f 5c 64 2b 5c 2e 5c 64 2b 2f 22 2c 20 24 72 "/\d+\.\d+/", $r
0660: 5b 22 74 61 67 6e 61 6d 65 22 5d 29 20 61 6e 64 ["tagname"]) and
0670: 20 24 72 5b 22 74 61 67 6e 61 6d 65 22 5d 20 21 $r["tagname"] !
0680: 3d 20 24 76 65 72 29 20 7b 0a 23 20 20 20 20 20 = $ver) {.#
0690: 20 20 20 20 20 20 20 69 66 20 28 24 76 65 72 20 if ($ver
06a0: 21 3d 20 22 74 72 75 6e 6b 22 29 0a 20 20 20 20 != "trunk").
06b0: 20 20 20 20 20 20 20 20 24 72 65 6c 65 61 73 65 $release
06c0: 73 5b 5d 20 3d 20 5b 0a 20 20 20 20 20 20 20 20 s[] = [.
06d0: 20 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e "version
06e0: 22 20 3d 3e 20 70 72 65 67 5f 72 65 70 6c 61 63 " => preg_replac
06f0: 65 28 22 2f 5e 2e 2b 3f 28 3f 3d 5c 64 2b 5c 2e e("/^.+?(?=\d+\.
0700: 5c 64 2b 29 2f 22 2c 20 22 22 2c 20 24 76 65 72 \d+)/", "", $ver
0710: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
0720: 20 20 20 22 73 74 61 74 65 22 20 3d 3e 20 73 74 "state" => st
0730: 61 74 65 28 24 76 65 72 2c 20 24 63 68 61 6e 67 ate($ver, $chang
0740: 65 73 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 es),.
0750: 20 20 20 20 20 22 73 63 6f 70 65 22 20 3d 3e 20 "scope" =>
0760: 73 63 6f 70 65 28 24 76 65 72 2c 20 24 63 68 61 scope($ver, $cha
0770: 6e 67 65 73 29 2c 0a 20 20 20 20 20 20 20 20 20 nges),.
0780: 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73 22 "changes"
0790: 20 3d 3e 20 73 75 62 73 74 72 28 24 63 68 61 6e => substr($chan
07a0: 67 65 73 2c 20 30 2c 20 31 30 32 34 29 2c 0a 20 ges, 0, 1024),.
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
07c0: 64 6f 77 6e 6c 6f 61 64 22 20 3d 3e 20 22 24 5f download" => "$_
07d0: 53 45 52 56 45 52 5b 46 4f 53 53 49 4c 5f 53 45 SERVER[FOSSIL_SE
07e0: 4c 46 5d 7a 69 70 3f 6e 61 6d 65 3d 24 76 65 72 LF]zip?name=$ver
07f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
0800: 20 20 20 22 70 75 62 6c 69 73 68 65 64 22 20 3d "published" =
0810: 3e 20 24 64 61 74 65 2c 0a 20 20 20 20 20 20 20 > $date,.
0820: 20 20 20 20 20 5d 3b 0a 20 20 20 20 20 20 20 20 ];.
0830: 20 20 20 20 24 63 68 61 6e 67 65 73 20 3d 20 22 $changes = "
0840: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 ";. $
0850: 76 65 72 20 3d 20 24 72 5b 22 74 61 67 6e 61 6d ver = $r["tagnam
0860: 65 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 e"];.
0870: 20 24 64 61 74 65 20 3d 20 24 72 5b 22 64 22 5d $date = $r["d"]
0880: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
0890: 20 20 20 20 24 63 68 61 6e 67 65 73 20 2e 3d 20 $changes .=
08a0: 24 72 5b 22 63 6f 6d 6d 65 6e 74 22 5d 20 2e 20 $r["comment"] .
08b0: 22 5c 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 "\n";. }.
08c0: 72 65 74 75 72 6e 20 24 72 65 6c 65 61 73 65 73 return $releases
08d0: 3b 0a 7d 0a 0a 23 2d 2d 20 6f 75 74 70 75 74 0a ;.}..#-- output.
08e0: 68 65 61 64 65 72 28 22 6a 73 6f 6e 2f 76 6e 64 header("json/vnd
08f0: 2e 66 72 65 73 68 63 6f 64 65 2e 63 6c 75 62 3b .freshcode.club;
0900: 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38 22 29 charset=UTF-8")
0910: 3b 0a 70 72 69 6e 74 28 6a 73 6f 6e 5f 65 6e 63 ;.print(json_enc
0920: 6f 64 65 28 5b 0a 20 20 20 20 22 5c 24 66 65 65 ode([. "\$fee
0930: 64 2d 6f 72 69 67 69 6e 22 20 3d 3e 20 22 24 5f d-origin" => "$_
0940: 53 45 52 56 45 52 5b 46 4f 53 53 49 4c 5f 53 45 SERVER[FOSSIL_SE
0950: 4c 46 5d 22 2c 0a 20 20 20 20 22 5c 24 66 65 65 LF]",. "\$fee
0960: 64 2d 6c 69 63 65 6e 73 65 22 20 3d 3e 20 22 43 d-license" => "C
0970: 43 2d 42 59 2d 53 41 20 34 2e 30 22 2c 0a 20 20 C-BY-SA 4.0",.
0980: 20 20 22 6e 61 6d 65 22 20 3d 3e 20 70 72 65 67 "name" => preg
0990: 5f 72 65 70 6c 61 63 65 28 22 2f 5c 2e 5c 77 2b _replace("/\.\w+
09a0: 24 2f 22 2c 20 22 22 2c 20 62 61 73 65 6e 61 6d $/", "", basenam
09b0: 65 28 24 5f 53 45 52 56 45 52 5b 22 46 4f 53 53 e($_SERVER["FOSS
09c0: 49 4c 5f 52 45 50 4f 53 49 54 4f 52 59 22 5d 29 IL_REPOSITORY"])
09d0: 29 2c 0a 20 20 20 20 22 74 69 74 6c 65 22 20 3d ),. "title" =
09e0: 3e 20 67 65 74 5f 63 6f 6e 66 69 67 28 22 70 72 > get_config("pr
09f0: 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20 22 22 29 oject-name", "")
0a00: 2c 0a 20 20 20 20 22 73 75 6d 6d 61 72 79 22 20 ,. "summary"
0a10: 3d 3e 20 73 75 62 73 74 72 28 67 65 74 5f 63 6f => substr(get_co
0a20: 6e 66 69 67 28 22 70 72 6f 6a 65 63 74 2d 64 65 nfig("project-de
0a30: 73 63 72 69 70 74 69 6f 6e 22 2c 20 4e 55 4c 4c scription", NULL
0a40: 29 2c 20 30 2c 20 35 30 29 2c 0a 20 20 20 20 22 ), 0, 50),. "
0a50: 64 65 73 63 72 69 70 74 69 6f 6e 22 20 3d 3e 20 description" =>
0a60: 67 65 74 5f 63 6f 6e 66 69 67 28 22 70 72 6f 6a get_config("proj
0a70: 65 63 74 2d 64 65 73 63 72 69 70 74 69 6f 6e 22 ect-description"
0a80: 2c 20 22 22 29 2c 0a 20 20 20 20 22 68 6f 6d 65 , ""),. "home
0a90: 70 61 67 65 22 20 3d 3e 20 67 65 74 5f 63 6f 6e page" => get_con
0aa0: 66 69 67 28 22 70 72 6f 6a 65 63 74 2d 68 6f 6d fig("project-hom
0ab0: 65 70 61 67 65 22 2c 20 22 24 5f 53 45 52 56 45 epage", "$_SERVE
0ac0: 52 5b 46 4f 53 53 49 4c 5f 53 45 4c 46 5d 22 29 R[FOSSIL_SELF]")
0ad0: 2c 0a 20 20 20 20 22 6c 69 63 65 6e 73 65 22 20 ,. "license"
0ae0: 3d 3e 20 67 65 74 5f 63 6f 6e 66 69 67 28 22 70 => get_config("p
0af0: 72 6f 6a 65 63 74 2d 6c 69 63 65 6e 73 65 22 2c roject-license",
0b00: 20 22 22 29 2c 0a 20 20 20 20 22 74 61 67 73 22 ""),. "tags"
0b10: 20 3d 3e 20 67 65 74 5f 63 6f 6e 66 69 67 28 22 => get_config("
0b20: 70 72 6f 6a 65 63 74 2d 74 61 67 73 22 2c 20 22 project-tags", "
0b30: 22 29 2c 0a 20 20 20 20 22 69 6d 61 67 65 22 20 "),. "image"
0b40: 3d 3e 20 22 24 5f 53 45 52 56 45 52 5b 46 4f 53 => "$_SERVER[FOS
0b50: 53 49 4c 5f 53 45 4c 46 5d 6c 6f 67 6f 22 2c 0a SIL_SELF]logo",.
0b60: 20 20 20 20 22 73 75 62 6d 69 74 74 65 72 22 20 "submitter"
0b70: 3d 3e 20 22 22 2c 0a 20 20 20 20 22 75 72 6c 73 => "",. "urls
0b80: 22 20 3d 3e 20 5b 5d 2c 0a 20 20 20 20 22 72 65 " => [],. "re
0b90: 6c 65 61 73 65 73 22 20 3d 3e 20 72 65 6c 65 61 leases" => relea
0ba0: 73 65 73 28 29 2c 0a 5d 2c 20 4a 53 4f 4e 5f 50 ses(),.], JSON_P
0bb0: 52 45 54 54 59 5f 50 52 49 4e 54 7c 4a 53 4f 4e RETTY_PRINT|JSON
0bc0: 5f 55 4e 45 53 43 41 50 45 44 5f 53 4c 41 53 48 _UNESCAPED_SLASH
0bd0: 45 53 29 29 3b 0a 0a ES));..