Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch wcag-2.1 Excluding Merge-Ins
This is equivalent to a diff from d0ee8100 to 56d8000a
2022-11-16
| ||
18:46 | Version 2.20 ... (check-in: 210e89a0 user: drh tags: trunk, release, version-2.20) | |
16:09 | Merge trunk into wcag-2.1 branch for deployment on test server. ... (Leaf check-in: 56d8000a user: stephan tags: wcag-2.1) | |
16:02 | Update the built-in SQLite to the 3.40.0 release. ... (check-in: d0ee8100 user: drh tags: trunk) | |
2022-11-14
| ||
12:43 | Update the built-in SQLite to the 3.40.0 rc1 for testing. ... (check-in: 2ece5d0f user: drh tags: trunk) | |
2022-11-13
| ||
19:49 | Removed the title property from the nav element for the submenu in style.c. It caused a redundant tooltip, and was not necessary. ... (check-in: ba3fa28d user: ericwikman tags: wcag-2.1) | |
Changes to skins/ardoise/css.txt.
︙ | ︙ | |||
726 727 728 729 730 731 732 | .mainmenu li:hover { background-color: #ff8000; border-radius: 5px } .mainmenu li:hover a { color: #000 } | | | 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 | .mainmenu li:hover { background-color: #ff8000; border-radius: 5px } .mainmenu li:hover a { color: #000 } nav#hbdrop { background-color: #161819; border-radius: 15px; display: none; width: 100%; position: absolute; z-index: 20; } |
︙ | ︙ |
Changes to skins/ardoise/footer.txt.
1 2 3 4 5 6 7 | <th1> if {[string first artifact $current_page] == 0 || [string first hexdump $current_page] == 0} { html "</div>" } </th1> </div> <!-- end div container --> </div> <!-- end div middle max-full-width --> | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <th1> if {[string first artifact $current_page] == 0 || [string first hexdump $current_page] == 0} { html "</div>" } </th1> </div> <!-- end div container --> </div> <!-- end div middle max-full-width --> <footer class="footer"> <div class="container"> <div class="pull-right"> <a href="https://fossil-scm.org/">Fossil $release_version $manifest_version $manifest_date</a> </div> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s </div> </footer> |
Changes to skins/ardoise/header.txt.
|
| | | 1 2 3 4 5 6 7 8 | <header class="header"> <div class="container"> <div class="login pull-right"> <th1> if {[info exists login]} { html "<b>$login</b> — <a class='button' href='$home/login'>Logout</a>\n" } else { html "<a class='button' href='$home/login'>Login</a>\n" |
︙ | ︙ | |||
16 17 18 19 20 21 22 | html "<a class='rss' href='$home/timeline.rss'></a>" } </th1> <small> $<title></small></h1> </div> <!-- Main Menu --> | | | | | | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | html "<a class='rss' href='$home/timeline.rss'></a>" } </th1> <small> $<title></small></h1> </div> <!-- Main Menu --> <nav class="mainmenu"> <ul> <th1> html "<li><a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a></li>\n" builtin_request_js hbmenu.js set once 1 foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {$once && [string match $url\[/?#\]* /$current_page/]} { set class "$class active" set once 0 } html "<li class='$class'>" if {[string match /* $url]} {set url $home$url} html "<a href='$url'>$name</a></li>\n" } </th1></ul> </nav> <!-- end div mainmenu --> <nav id='hbdrop' title="Sitemap"></nav> </div> <!-- end div container --> </header> <!-- end div header --> <div class="middle max-full-width"> <div class="container"> <th1> if {[string first artifact $current_page] == 0 || [string first hexdump $current_page] == 0} { html "<div class=\"artifact_content\">" } </th1> |
Changes to skins/black_and_white/css.txt.
︙ | ︙ | |||
47 48 49 50 51 52 53 | color: #333; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ | | | | | | | | | | | | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | color: #333; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ header.header { margin:10px 0px 10px 0px; padding:1px 0px 0px 20px; border-style:solid; border-color:black; border-width:1px 0px; background-color:#eee; } /* The main menu bar that appears at the top left of the page beneath ** the header. Width must be co-ordinated with the container below */ nav.mainmenu { float: left; margin-left: 10px; margin-right: 20px; font-size: 0.9em; font-weight: bold; padding:5px; background-color:#eee; border:1px solid #999; width:6em; } /* Main menu is now a list */ nav.mainmenu ul { padding: 0; list-style:none; } nav.mainmenu a, nav.mainmenu a:visited{ padding: 1px 10px 1px 10px; color: #333; text-decoration: none; } nav.mainmenu a:hover { color: #eee; background-color: #333; } /* Container for the sub-menu and content so they don't spread ** out underneath the main menu */ #container { padding-left: 9em; } /* The submenu bar that *sometimes* appears below the main menu */ nav.submenu, div.sectionmenu { padding: 3px 10px 3px 10px; font-size: 0.9em; text-align: center; border:1px solid #999; border-width:1px 0px; background-color: #eee; color: #333; } nav.submenu a, nav.submenu a:visited, div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited, nav.submenu label { padding: 3px 10px 3px 10px; color: #333; text-decoration: none; } nav.submenu a:hover, div.sectionmenu>a.button:hover, nav.submenu label:hover { color: #eee; background-color: #333; } /* All page content from the bottom of the menu or submenu down to ** the footer */ main.content { padding: 2ex 1ex 0ex 2ex; } /* Some pages have section dividers */ div.section { margin-bottom: 0px; margin-top: 1em; |
︙ | ︙ | |||
147 148 149 150 151 152 153 | float: left; clear: left; color: #333; white-space: nowrap; } /* The footer at the very bottom of the page */ | | | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | float: left; clear: left; color: #333; white-space: nowrap; } /* The footer at the very bottom of the page */ footer.footer { font-size: 0.8em; margin-top: 12px; padding: 5px 10px 5px 10px; text-align: right; background-color: #eee; color: #555; } |
︙ | ︙ |
Changes to skins/black_and_white/footer.txt.
|
| | | | 1 2 3 | <footer class="footer"> Fossil $release_version $manifest_version $manifest_date </footer> |
Changes to skins/black_and_white/header.txt.
|
| | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <header class="header"> <div class="logo"> <img src="$logo_image_url" alt="logo"> <br />$<project_name> </div> <div class="title">$<title></div> <div class="status"><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></div> </header> <nav class="mainmenu"> <th1> set sitemap 0 foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} {set url $home$url} html "<a href='$url'>$name</a><br/>\n" if {[string match /sitemap $url]} {set sitemap 1} } if {!$sitemap} { html "<a href='$home/sitemap'>Sitemap</a>\n" } </th1></nav> |
Changes to skins/blitz/css.txt.
︙ | ︙ | |||
864 865 866 867 868 869 870 | .mainmenu li.active { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB90FDxEXAZ2XRzAAAABJSURBVCjPY2CgBzhz5sx/QmoYiTXAxMSEkWRDsLkAl0GMpHoBm0EoAlu3bmUQFxcnGAboBjEhc4gxAJtLGUmJBVwuYiTXAGSDAIx5IBObnuVxAAAAAElFTkSuQmCC); background-repeat: no-repeat; background-position: center bottom; } .mainmenu li a, | | | | | 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 | .mainmenu li.active { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB90FDxEXAZ2XRzAAAABJSURBVCjPY2CgBzhz5sx/QmoYiTXAxMSEkWRDsLkAl0GMpHoBm0EoAlu3bmUQFxcnGAboBjEhc4gxAJtLGUmJBVwuYiTXAGSDAIx5IBObnuVxAAAAAElFTkSuQmCC); background-repeat: no-repeat; background-position: center bottom; } .mainmenu li a, nav#hbdrop a { color: #3b5c6b; padding: 10px 15px; } .mainmenu li.active a { font-weight: bold; } .mainmenu li:hover nav#hbdrop a:hover { background-color: #eee; } nav#hbdrop { background-color: white; border: 2px solid #ccc; display: none; width: 100%; position: absolute; z-index: 20; } |
︙ | ︙ |
Changes to skins/blitz/footer.txt.
1 2 | </div> <!-- end div container --> </div> <!-- end div middle max-full-width --> | | | | 1 2 3 4 5 6 7 8 9 10 | </div> <!-- end div container --> </div> <!-- end div middle max-full-width --> <footer class="footer"> <div class="container"> <div class="pull-right"> <a href="https://www.fossil-scm.org/">Fossil $release_version $manifest_version $manifest_date</a> </div> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s </div> </footer> |
Changes to skins/blitz/header.txt.
|
| | | 1 2 3 4 5 6 7 8 | <header class="header"> <div class="container"> <!-- Header --> <div class="login pull-right"> <th1> if {[info exists login]} { html "<b>$login</b> — <a class='button' href='$home/login'>Logout</a>\n" |
︙ | ︙ | |||
18 19 20 21 22 23 24 | html "<a class='rss' href='$home/timeline.rss'></a>" } </th1> <small> $<title></small></h1> </div> <!-- Main Menu --> | | | | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | html "<a class='rss' href='$home/timeline.rss'></a>" } </th1> <small> $<title></small></h1> </div> <!-- Main Menu --> <nav class="mainmenu"> <ul><th1> html "<li><a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a></li>\n" builtin_request_js hbmenu.js set once 1 foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {$once && [string match $url\[/?#\]* /$current_page/]} { set class "active $class" set once 0 } html "<li class='$class'>" if {[string match /* $url]} {set url $home$url} html "<a href='$url'>$name</a></li>\n" } </th1></ul> </nav> <!-- end div mainmenu --> <nav id='hbdrop' title="Sitemap"></nav> </div> <!-- end div container --> </header> <!-- end div header --> <div class="middle max-full-width"> <div class="container"> |
Changes to skins/darkmode/css.txt.
︙ | ︙ | |||
32 33 34 35 36 37 38 | ** the area to show as blank. The purpose is to cause the ** title to be exactly centered. */ div.leftoftitle { visibility: hidden; } /* The header across the top of the page */ | | | | | | | | | | | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | ** the area to show as blank. The purpose is to cause the ** title to be exactly centered. */ div.leftoftitle { visibility: hidden; } /* The header across the top of the page */ header.header { display: table; width: 100%; } /* The main menu bar that appears at the top of the page beneath ** the header */ nav.mainmenu { padding: 0.25em 0.5em; font-size: 0.9em; font-weight: bold; text-align: center; border-top-left-radius: 0.5em; border-top-right-radius: 0.5em; border-bottom: 1px dotted rgba(200,200,200,0.3); z-index: 21; /* just above hbdrop */ } nav#hbdrop { background-color: #1f1f1f; border: 2px solid #303536; border-radius: 0 0 0.5em 0.5em; display: none; left: 2em; width: calc(100% - 4em); position: absolute; z-index: 20; /* just below mainmenu, but above timeline bubbles */ } nav.mainmenu, nav.submenu, div.sectionmenu { color: #ffffffcc; background-color: #303536/*#0000ff60*/; } /* The submenu bar that *sometimes* appears below the main menu */ nav.submenu, div.sectionmenu { padding: 0.15em 0.5em 0.15em 0; font-size: 0.9em; text-align: center; border-bottom-left-radius: 0.5em; border-bottom-right-radius: 0.5em; } a, a:visited { color: rgba(127, 201, 255, 0.9); display: inline; text-decoration: none; } a:visited {opacity: 0.8} nav.mainmenu a, nav.submenu a, div.sectionmenu>a.button, nav.submenu label, footer.footer a { padding: 0.15em 0.5em; } nav.mainmenu a.active { border-bottom: 1px solid #FF4500f0; } a:hover, a:visited:hover { background-color: #FF4500f0; color: rgba(24,24,24,0.8); border-radius: 0.1em; |
︙ | ︙ | |||
135 136 137 138 139 140 141 | input[type=submit]:focus { outline: 2px outset #333; border-color: #888; } /* All page content from the bottom of the menu or submenu down to ** the footer */ | | | 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | input[type=submit]:focus { outline: 2px outset #333; border-color: #888; } /* All page content from the bottom of the menu or submenu down to ** the footer */ main.content { padding: 0ex 1ex 1ex 1ex; } /* Some pages have section dividers */ div.section { margin-bottom: 0; margin-top: 1em; |
︙ | ︙ | |||
166 167 168 169 170 171 172 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ | | | 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ footer.footer { clear: both; font-size: 0.8em; padding: 0.15em 0.5em; text-align: right; background-color: #303536/*#0000ff60*/; border-top: 1px dotted rgba(200,200,200,0.3); border-bottom-left-radius: 0.5em; |
︙ | ︙ |
Changes to skins/darkmode/footer.txt.
|
| | | | 1 2 3 4 5 6 7 8 | <footer class="footer"> <div class="container"> <div class="pull-right"> <a href="https://www.fossil-scm.org/">Fossil $release_version $manifest_version $manifest_date</a> </div> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s </div> </footer> |
Changes to skins/darkmode/header.txt.
|
| | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <header class="header"> <div class="status leftoftitle"><th1> if {[info exists login]} { set logintext "<a href='$home/login'>$login</a>\n" } else { set logintext "<a href='$home/login'>Login</a>\n" } html $logintext </th1></div> <div class="title">$<title></div> <div class="status"><nobr><th1> html $logintext </th1></nobr></div> </header> <nav class="mainmenu"> <th1> html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>" builtin_request_js hbmenu.js foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} { if {[string match $url\[/?#\]* /$current_page/]} { set class "active $class" } set url $home$url } html "<a href='$url' class='$class'>$name</a>\n" } </th1></nav> <nav id='hbdrop' title="Sitemap"></nav> |
Changes to skins/default/css.txt.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* Overall page style */ body { margin: 0 auto; background-color: white; font-family: sans-serif; font-size: 14pt; -moz-text-size-adjust: none; -mx-text-size-adjust: none; -webkit-text-size-adjust: none; } a { | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /* Overall page style */ body { margin: 0 auto; background-color: white; font-family: sans-serif; font-size: 14pt; -moz-text-size-adjust: none; -mx-text-size-adjust: none; -webkit-text-size-adjust: none; } a { color: #2D5486; text-decoration: none; } a:hover { color: #2D5486; text-decoration: underline; } /* Page title, above menu bars */ .title { color: #3A76BB; float: left; } .title h1 { display: inline; } .title h1:after { content: " / "; color: #6B6B6B; font-weight: normal; } .status { float: right; font-size: 0.7em; } |
︙ | ︙ | |||
51 52 53 54 55 56 57 | overflow-x: auto; overflow-y: hidden; white-space: nowrap; z-index: 21; /* just above hbdrop */ } .mainmenu a { text-decoration: none; | | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | overflow-x: auto; overflow-y: hidden; white-space: nowrap; z-index: 21; /* just above hbdrop */ } .mainmenu a { text-decoration: none; color: #6B6B6B; border-right: 1px solid #eaeaea; } .mainmenu a.active, .mainmenu a:hover { color: #000; border-bottom: 2px solid #D26911; } nav#hbdrop { background-color: white; border: 1px solid black; border-top: white; border-radius: 0 0 0.5em 0.5em; display: none; font-size: 80%; left: 2em; |
︙ | ︙ | |||
81 82 83 84 85 86 87 | font-size: .7em; padding: 10px; border-bottom: 1px solid #ccc; } .submenu a, .submenu label { padding: 10px 11px; text-decoration: none; | | | > > > > > > > > > > > > > > > > > > > | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | font-size: .7em; padding: 10px; border-bottom: 1px solid #ccc; } .submenu a, .submenu label { padding: 10px 11px; text-decoration: none; color: #6B6B6B; } .submenu label { white-space: nowrap; } .submenu a:hover, .submenu label:hover { padding: 6px 10px; border: 1px solid #ccc; border-radius: 5px; color: #000; } span.submenuctrl, span.submenuctrl input, select.submenuctrl { color: #6B6B6B; } span.submenuctrl { white-space: nowrap; } div.searchForm { text-align: left; } .searchForm { padding: 10px; border-bottom: 1px solid #ccc; } .searchForm label { padding: 10px 11px; text-decoration: none; color: #6B6B6B; white-space: nowrap; } .searchForm label:hover { padding: 6px 10px; border: 1px solid #ccc; border-radius: 5px; color: #000; } /* Main document area; elements common to most pages. */ .content { padding-top: 10px; font-size: 0.8em; color: #444; |
︙ | ︙ | |||
154 155 156 157 158 159 160 | /* Page footer */ .footer { border-top: 1px solid #ccc; padding: 10px; font-size: 0.7em; margin-top: 10px; | | | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | /* Page footer */ .footer { border-top: 1px solid #ccc; padding: 10px; font-size: 0.7em; margin-top: 10px; color: #757575; } /* Forum */ .forum a:visited { color: #6A7F94; } |
︙ | ︙ |
Changes to skins/default/footer.txt.
|
| | | | 1 2 3 4 5 | <footer class="footer"> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by Fossil $release_version $manifest_version $manifest_date </footer> |
Changes to skins/default/header.txt.
|
| | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <header class="header"> <div class="title"><h1>$<project_name></h1>$<title></div> <div class="status"><th1> if {[info exists login]} { html "<a href='$home/login' title='Logout'>$login</a>\n" } else { html "<a href='$home/login'>Login</a>\n" } </th1></div> </header> <nav class="mainmenu" title="Main Menu"> <th1> html "<a id='hbbtn' href='$home/sitemap' title='Site Map'>☰</a>" builtin_request_js hbmenu.js foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} { if {[string match $url\[/?#\]* /$current_page/]} { set class "active $class" } set url $home$url } html "<a href='$url' class='$class'>$name</a>\n" } </th1></nav> <nav id='hbdrop' title="Sitemap"></nav> |
Changes to skins/eagle/css.txt.
︙ | ︙ | |||
45 46 47 48 49 50 51 | color: white; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ | | | | | | | | | | | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | color: white; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ header.header { display: table; width: 100%; } /* The main menu bar that appears at the top of the page beneath ** the header */ nav.mainmenu { padding: 5px 10px 5px 10px; font-size: 0.9em; font-weight: bold; text-align: center; letter-spacing: 1px; background-color: #76869D; border-top-left-radius: 8px; border-top-right-radius: 8px; color: white; } nav#hbdrop { background-color: #485D7B; border-radius: 0 0 15px 15px; border-left: 0.5em solid #76869d; border-bottom: 1.2em solid #76869d; display: none; width: 98%; position: absolute; z-index: 20; } /* The submenu bar that *sometimes* appears below the main menu */ nav.submenu, div.sectionmenu { padding: 3px 10px 3px 0px; font-size: 0.9em; font-weight: bold; text-align: center; background-color: #485D7B; color: white; } nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited, div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited, nav.submenu label { padding: 3px 10px 3px 10px; color: white; text-decoration: none; } nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover, nav.submenu label:hover { text-decoration: underline; } /* All page content from the bottom of the menu or submenu down to ** the footer */ main.content { padding: 0ex 1ex 0ex 2ex; } /* Some pages have section dividers */ div.section { margin-bottom: 0px; margin-top: 1em; |
︙ | ︙ | |||
129 130 131 132 133 134 135 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ | | | 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ footer.footer { clear: both; font-size: 0.8em; margin-top: 12px; padding: 5px 10px 5px 10px; text-align: right; background-color: #485D7B; border-bottom-left-radius: 8px; |
︙ | ︙ |
Changes to skins/eagle/footer.txt.
|
| | | 1 2 3 4 5 6 7 8 | <footer class="footer"> <th1> proc getTclVersion {} { if {[catch {tclEval info patchlevel} tclVersion] == 0} { return "<a href=\"https://www.tcl.tk/\">Tcl</a> version $tclVersion" } return "" } |
︙ | ︙ | |||
17 18 19 20 21 22 23 | </th1> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by <a href="$fossilUrl/">Fossil</a> version $release_version $tclVersion <a href="$fossilUrl/index.html/info/$version">$manifest_version</a> <a href="$fossilUrl/index.html/timeline?c=$fossilDate&y=ci">$manifest_date</a> | | | 17 18 19 20 21 22 23 24 | </th1> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by <a href="$fossilUrl/">Fossil</a> version $release_version $tclVersion <a href="$fossilUrl/index.html/info/$version">$manifest_version</a> <a href="$fossilUrl/index.html/timeline?c=$fossilDate&y=ci">$manifest_date</a> </footer> |
Changes to skins/eagle/header.txt.
|
| | | 1 2 3 4 5 6 7 8 | <header class="header"> <div class="logo"> <th1> ## ## NOTE: The purpose of this procedure is to take the base URL of the ## Fossil project and return the root of the entire web site using ## the same URI scheme as the base URL (e.g. http or https). ## |
︙ | ︙ | |||
74 75 76 77 78 79 80 | <div class="status"><nobr><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></nobr><small><div id="clock"></div></small></div> | | | | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | <div class="status"><nobr><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></nobr><small><div id="clock"></div></small></div> </header> <th1>html "<script nonce='$nonce'>"</th1> (function updateClock(){ var e = document.getElementById("clock"); if(!e) return; if(!updateClock.fmt){ updateClock.fmt = function(n){ return n < 10 ? '0' + n : n; }; } var d = new Date(); e.innerHTML = d.getUTCFullYear()+ '-' + updateClock.fmt(d.getUTCMonth() + 1) + '-' + updateClock.fmt(d.getUTCDate()) + ' ' + updateClock.fmt(d.getUTCHours()) + ':' + updateClock.fmt(d.getUTCMinutes()); setTimeout(updateClock,(60-d.getUTCSeconds())*1000); })(); </script> <nav class="mainmenu"><th1> html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>\n" builtin_request_js hbmenu.js foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} {set url $home$url} html "<a href='$url' class='$class'>$name</a>\n" } </th1></nav> <nav id='hbdrop' title="Sitemap"></nav> |
Changes to skins/khaki/css.txt.
︙ | ︙ | |||
39 40 41 42 43 44 45 | padding: 5px 5px 0 0; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ | | | | | | | | | | | | | | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | padding: 5px 5px 0 0; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ header.header { display: table; width: 100%; } /* The main menu bar that appears at the top of the page beneath ** the header */ nav.mainmenu { padding: 5px 10px 5px 10px; font-size: 0.9em; font-weight: bold; text-align: center; letter-spacing: 1px; background-color: #a09048; color: black; z-index: 21; /* just above hbdrop */ } nav#hbdrop { background-color: #fef3bc; border: 2px solid #a09048; border-radius: 0 0 0.5em 0.5em; display: none; left: 2em; width: 90%; padding-right: 1em; position: absolute; z-index: 20; /* just below mainmenu, but above timeline bubbles */ } /* The submenu bar that *sometimes* appears below the main menu */ nav.submenu, div.sectionmenu { padding: 3px 10px 3px 0px; font-size: 0.9em; text-align: center; background-color: #c0af58; color: white; } nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited, div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited, nav.submenu label { padding: 3px 10px 3px 10px; color: white; text-decoration: none; } nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover, nav.submenu label:hover, nav#hbdrop a:hover { color: #a09048; background-color: white; } /* All page content from the bottom of the menu or submenu down to ** the footer */ main.content { padding: 1ex 5px; } main.content a, nav#hbdrop a { color: #706532; } main.content a:link, nav#hbdrop a:link { color: #706532; } main.content a:visited, nav#hbdrop a:visited { color: #704032; } main.content a:hover, nav#hbdrop a:hover { background-color: white; color: #706532; } a, a:visited { text-decoration: none; } |
︙ | ︙ | |||
131 132 133 134 135 136 137 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ | | | | | | | 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ footer.footer { font-size: 0.8em; margin-top: 12px; padding: 5px 10px 5px 10px; text-align: right; background-color: #a09048; color: white; } /* Hyperlink colors */ footer.footer a { color: white; } footer.footer a:link { color: white; } footer.footer a:visited { color: white; } footer.footer a:hover { background-color: white; color: #558195; } /* <verbatim> blocks */ pre.verbatim { background-color: #f5f5f5; padding: 0.5em; white-space: pre-wrap; } |
︙ | ︙ |
Changes to skins/khaki/footer.txt.
|
| | | | 1 2 3 | <footer class="footer"> Fossil $release_version $manifest_version $manifest_date </footer> |
Changes to skins/khaki/header.txt.
|
| | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <header class="header"> <div class="title">$<title></div> <div class="status"> <div class="logo">$<project_name></div><br/> <th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></div> </header> <nav class="mainmenu"><th1> html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>" builtin_request_js hbmenu.js foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} {set url $home$url} html "<a href='$url' class='$class'>$name</a>\n" } </th1></nav> <nav id='hbdrop' title="Sitemap"></nav> |
Changes to skins/original/css.txt.
︙ | ︙ | |||
40 41 42 43 44 45 46 | color: #558195; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ | | | | | | | | | | 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | color: #558195; font-size: 0.8em; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ header.header { display: table; width: 100%; } /* The main menu bar that appears at the top of the page beneath ** the header */ nav.mainmenu { padding: 5px; font-size: 0.9em; font-weight: bold; text-align: center; letter-spacing: 1px; background-color: #558195; border-top-left-radius: 8px; border-top-right-radius: 8px; color: white; } /* The submenu bar that *sometimes* appears below the main menu */ nav.submenu, div.sectionmenu { padding: 3px 10px 3px 0px; font-size: 0.9em; text-align: center; background-color: #456878; color: white; } nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited, div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited, nav.submenu label { padding: 3px 10px 3px 10px; color: white; text-decoration: none; } nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover, nav.submenu label:hover { color: #558195; background-color: white; } /* All page content from the bottom of the menu or submenu down to ** the footer */ main.content { padding: 0ex 1ex 1ex 1ex; border: solid #aaa; border-width: 1px; } /* Some pages have section dividers */ div.section { |
︙ | ︙ | |||
113 114 115 116 117 118 119 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ | | | | | | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ footer.footer { clear: both; font-size: 0.8em; padding: 5px 10px 5px 10px; text-align: right; background-color: #558195; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; color: white; } /* Hyperlink colors in the footer */ footer.footer a { color: white; } footer.footer a:link { color: white; } footer.footer a:visited { color: white; } footer.footer a:hover { background-color: white; color: #558195; } /* verbatim blocks */ pre.verbatim { background-color: #f5f5f5; padding: 0.5em; white-space: pre-wrap; } |
︙ | ︙ |
Changes to skins/original/footer.txt.
|
| | | 1 2 3 4 5 6 7 8 | <footer class="footer"> <th1> proc getTclVersion {} { if {[catch {tclEval info patchlevel} tclVersion] == 0} { return "<a href=\"https://www.tcl.tk/\">Tcl</a> version $tclVersion" } return "" } |
︙ | ︙ | |||
17 18 19 20 21 22 23 | </th1> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by <a href="$fossilUrl/">Fossil</a> version $release_version $tclVersion <a href="$fossilUrl/index.html/info/$version">$manifest_version</a> <a href="$fossilUrl/index.html/timeline?c=$fossilDate&y=ci">$manifest_date</a> | | | 17 18 19 20 21 22 23 24 | </th1> This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by <a href="$fossilUrl/">Fossil</a> version $release_version $tclVersion <a href="$fossilUrl/index.html/info/$version">$manifest_version</a> <a href="$fossilUrl/index.html/timeline?c=$fossilDate&y=ci">$manifest_date</a> </footer> |
Changes to skins/original/header.txt.
|
| | | 1 2 3 4 5 6 7 8 | <header class="header"> <div class="logo"> <th1> ## ## NOTE: The purpose of this procedure is to take the base URL of the ## Fossil project and return the root of the entire web site using ## the same URI scheme as the base URL (e.g. http or https). ## |
︙ | ︙ | |||
68 69 70 71 72 73 74 | <div class="status"><nobr><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></nobr><small><div id="clock"></div></small></div> | | | | | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | <div class="status"><nobr><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></nobr><small><div id="clock"></div></small></div> </header> <th1>html "<script nonce='$nonce'>"</th1> function updateClock(){ var e = document.getElementById("clock"); if(e){ var d = new Date(); function f(n) { return n < 10 ? '0' + n : n; } e.innerHTML = d.getUTCFullYear()+ '-' + f(d.getUTCMonth() + 1) + '-' + f(d.getUTCDate()) + ' ' + f(d.getUTCHours()) + ':' + f(d.getUTCMinutes()); setTimeout(updateClock,(60-d.getUTCSeconds())*1000); } } updateClock(); </script> <nav class="mainmenu"><th1> set sitemap 0 foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} {set url $home$url} html "<a href='$url' class='$class'>$name</a>\n" if {[string match */sitemap $url]} {set sitemap 1} } if {!$sitemap} { html "<a href='$home/sitemap'>...</a>" } </th1></nav> |
Changes to skins/plain_gray/css.txt.
︙ | ︙ | |||
26 27 28 29 30 31 32 | vertical-align: bottom; color: #404040; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ | | | | | | | | | | | | | | | | | | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | vertical-align: bottom; color: #404040; font-weight: bold; white-space: nowrap; } /* The header across the top of the page */ header.header { display: table; width: 100%; } /* The main menu bar that appears at the top of the page beneath ** the header */ nav.mainmenu { padding: 5px 10px 5px 10px; font-size: 0.9em; font-weight: bold; text-align: center; letter-spacing: 1px; background-color: #404040; color: white; z-index: 21; /* just above hbdrop */ } .hbdrop { background-color: white; border: 1px solid black; border-radius: 0.5em; display: none; width: 95%; position: absolute; z-index: 20; /* just below mainmenu, but above timeline bubbles */ } nav.hbdrop a { color: #604000; } nav.hbdrop a:link { color: #604000;} nav.hbdrop a:visited { color: #600000; } /* The submenu bar that *sometimes* appears below the main menu */ nav.submenu, div.sectionmenu { padding: 3px 10px 3px 0px; font-size: 0.9em; text-align: center; background-color: #606060; color: white; } nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited, div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited, nav.submenu label { padding: 3px 10px 3px 10px; color: white; text-decoration: none; } nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover, nav.submenu label:hover { color: #404040; background-color: white; } a, a:visited { text-decoration: none; } /* All page content from the bottom of the menu or submenu down to ** the footer */ main.content { padding: 0ex 0ex 0ex 0ex; } /* Hyperlink colors */ main.content a { color: #604000; } main.content a:link { color: #604000;} main.content a:visited { color: #600000; } /* <verbatim> blocks */ pre.verbatim { background-color: #ffffff; padding: 0.5em; white-space: pre-wrap; } |
︙ | ︙ | |||
129 130 131 132 133 134 135 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ | | | 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | margin: .2em 0 .2em 0; float: left; clear: left; white-space: nowrap; } /* The footer at the very bottom of the page */ footer.footer { font-size: 0.8em; margin-top: 12px; padding: 5px 10px 5px 10px; text-align: right; background-color: #404040; color: white; } |
︙ | ︙ |
Changes to skins/plain_gray/footer.txt.
|
| | | | 1 2 3 | <footer class="footer"> Fossil $release_version $manifest_version $manifest_date </footer> |
Changes to skins/plain_gray/header.txt.
|
| | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <header class="header"> <div class="title">$<project_name>: $<title></div> </header> <nav class="mainmenu"> <th1> html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>" builtin_request_js hbmenu.js foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} {set url $home$url} html "<a href='$url' class='$class'>$name</a>\n" } </th1></nav> <nav id='hbdrop' class='hbdrop' title="Sitemap"></nav> |
Changes to skins/xekri/css.txt.
︙ | ︙ | |||
73 74 75 76 77 78 79 | } /************************************** * Main Area */ | | | | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | } /************************************** * Main Area */ header.header, nav.mainmenu, nav.submenu, main.content, footer.footer { clear: both; margin: 0 auto; max-width: 90%; padding: 0.25rem 1rem; } /************************************** * Main Area: Header */ header.header { margin: 0.5rem auto 0 auto; display: flex; flex-direction: row; align-items: center; flex-wrap: wrap; } div.logo { |
︙ | ︙ | |||
144 145 146 147 148 149 150 | } /************************************** * Main Area: Global Menu */ | | | | | | | | | | | | | | | | | | 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | } /************************************** * Main Area: Global Menu */ nav.mainmenu, nav.submenu { background-color: #080; border-radius: 1rem 1rem 0 0; box-shadow: 3px 4px 1px #000; color: #000; font-weight: bold; font-size: 1.1rem; text-align: center; } nav.mainmenu { padding-top: 0.33rem; padding-bottom: 0.25rem; } nav.submenu { border-top: 1px solid #0a0; border-radius: 0; display: block; } nav.mainmenu a, nav.submenu a, nav.submenu label { color: #000; padding: 0 0.75rem; text-decoration: none; } nav.mainmenu a:hover, nav.submenu a:hover, nav.submenu label:hover { color: #fff; text-shadow: 0px 0px 6px #0f0; } nav.submenu * { margin: 0 0.5rem; vertical-align: middle; } nav.submenu select, nav.submenu input { background-color: #222; border: 1px inset #080; color: #eee; cursor: pointer; font-size: 0.9rem; } nav.submenu select { height: 1.75rem; } /************************************** * Main Area: Content */ main.content { background-color: #222; border-radius: 0 0 1rem 1rem; box-shadow: 3px 3px 1px #000; min-height:40%; padding-bottom: 1rem; padding-top: 0.5rem; } main.content table[bgcolor="white"] { color: #000; } .piechartLabel { fill: white; } .piechartLine { stroke: white; } /************************************** * Main Area: Footer */ footer.footer { color: #ee0; font-size: 0.75rem; padding: 0; text-align: right; width: 75%; } footer.footer div { background-color: #222; box-shadow: 3px 3px 1px #000; border-radius: 0 0 1rem 1rem; margin: 0 0 10px 0; padding: 0.25rem 0.75rem; } footer.footer div.page-time { float: left; } footer.footer div.fossil-info { float: right; } footer.footer a, footer.footer a:link, footer.footer a:visited { color: #ee0; } footer.footer a:hover { color: #fff; text-shadow: 0px 0px 6px #ee0; } /************************************** * Check-in |
︙ | ︙ | |||
1150 1151 1152 1153 1154 1155 1156 | } body.branch .brlist > table > tbody > tr:hover:not(.selected), body.branch .brlist > table > tbody > tr.selected { background-color: #444; } | | | | | | 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 | } body.branch .brlist > table > tbody > tr:hover:not(.selected), body.branch .brlist > table > tbody > tr.selected { background-color: #444; } body.chat header.header, body.chat footer.footer, body.chat nav.mainmenu, body.chat nav.submenu, body.chat main.content { margin-left: 0.5em; margin-right: 0.5em; margin-top: auto/*eliminates unnecessary scrollbars*/; } body.chat.chat-only-mode main.content { max-width: revert; } body.chat #chat-user-list .chat-user{ color: white; } |
Changes to skins/xekri/footer.txt.
1 | </div> | | | | 1 2 3 4 5 6 7 8 9 | </div> <footer class="footer"> <div class="page-time"> Generated in <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s </div> <div class="fossil-info"> Fossil v$release_version $manifest_version </div> </footer> |
Changes to skins/xekri/header.txt.
|
| | | 1 2 3 4 5 6 7 8 | <header class="header"> <div class="logo"> <th1> ## ## NOTE: The purpose of this procedure is to take the base URL of the ## Fossil project and return the root of the entire web site using ## the same URI scheme as the base URL (e.g. http or https). ## |
︙ | ︙ | |||
74 75 76 77 78 79 80 | <div class="status"><nobr><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></nobr><small><div id="clock"></div></small></div> | | | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | <div class="status"><nobr><th1> if {[info exists login]} { puts "Logged in as $login" } else { puts "Not logged in" } </th1></nobr><small><div id="clock"></div></small></div> </header> <th1>html "<script nonce='$nonce'>"</th1> function updateClock(){ var e = document.getElementById("clock"); if(e){ var d = new Date(); function f(n) { return n < 10 ? '0' + n : n; } e.innerHTML = d.getUTCFullYear()+ '-' + f(d.getUTCMonth() + 1) + '-' + f(d.getUTCDate()) + ' ' + f(d.getUTCHours()) + ':' + f(d.getUTCMinutes()); setTimeout(updateClock,(60-d.getUTCSeconds())*1000); } } updateClock(); </script> <nav class="mainmenu"><th1> set sitemap 0 foreach {name url expr class} $mainmenu { if {![capexpr $expr]} continue if {[string match /* $url]} { if {[string match $url\[/?#\]* /$current_page/]} { set class "active $class" } set url $home$url } html "<a href='$url' class='$class'>$name</a>\n" if {[string match */sitemap $url]} {set sitemap 1} } if {!$sitemap} { html "<a href='$home/sitemap'>...</a>\n" } </th1></nav> |
Changes to src/accordion.js.
︙ | ︙ | |||
38 39 40 41 42 43 44 45 46 47 48 49 50 51 | var img = document.createElement("img"); img.src = acc_svgdata[0]+acc_svgdata[2]+acc_svgdata[1]; img.className = "accordion_btn accordion_btn_plus"; a[i].insertBefore(img,a[i].firstChild); img = document.createElement("img"); img.src = acc_svgdata[0]+acc_svgdata[3]+acc_svgdata[1]; img.className = "accordion_btn accordion_btn_minus"; a[i].insertBefore(img,a[i].firstChild); a[i].addEventListener("click",function(){ var x = this.nextElementSibling; if( this.classList.contains("accordion_closed") ){ x.style.maxHeight = x.scrollHeight + "px"; setTimeout(function(){ x.style.maxHeight = ""; | > | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | var img = document.createElement("img"); img.src = acc_svgdata[0]+acc_svgdata[2]+acc_svgdata[1]; img.className = "accordion_btn accordion_btn_plus"; a[i].insertBefore(img,a[i].firstChild); img = document.createElement("img"); img.src = acc_svgdata[0]+acc_svgdata[3]+acc_svgdata[1]; img.className = "accordion_btn accordion_btn_minus"; img.alt = "Open/Close Section"; a[i].insertBefore(img,a[i].firstChild); a[i].addEventListener("click",function(){ var x = this.nextElementSibling; if( this.classList.contains("accordion_closed") ){ x.style.maxHeight = x.scrollHeight + "px"; setTimeout(function(){ x.style.maxHeight = ""; |
︙ | ︙ |
Changes to src/add.c.
︙ | ︙ | |||
360 361 362 363 364 365 366 | ** using the -f|--force option. ** ** The --case-sensitive option determines whether or not filenames should ** be treated case sensitive or not. If the option is not given, the default ** depends on the global setting, or the operating system default, if not set. ** ** Options: | < | 360 361 362 363 364 365 366 367 368 369 370 371 372 373 | ** using the -f|--force option. ** ** The --case-sensitive option determines whether or not filenames should ** be treated case sensitive or not. If the option is not given, the default ** depends on the global setting, or the operating system default, if not set. ** ** Options: ** --case-sensitive BOOL Override the case-sensitive setting ** --dotfiles Include files beginning with a dot (".") ** -f|--force Add files without prompting ** --ignore CSG Ignore unmanaged files matching patterns from ** the Comma Separated Glob (CSG) pattern list ** --clean CSG Also ignore files matching patterns from ** the Comma Separated Glob (CSG) list |
︙ | ︙ |
Changes to src/alerts.c.
︙ | ︙ | |||
289 290 291 292 293 294 295 | style_set_current_feature("alerts"); style_header("Email Notification Setup"); @ <h1>Status</h1> @ <table class="label-value"> if( alert_enabled() ){ stats_for_email(); }else{ | | | 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 | style_set_current_feature("alerts"); style_header("Email Notification Setup"); @ <h1>Status</h1> @ <table class="label-value"> if( alert_enabled() ){ stats_for_email(); }else{ @ <td>Disabled</td> } @ </table> @ <hr> @ <h1> Configuration </h1> @ <form action="%R/setup_notification" method="post"><div> @ <input type="submit" name="submit" value="Apply Changes" /><hr> login_insert_csrf_secret(); |
︙ | ︙ | |||
1110 1111 1112 1113 1114 1115 1116 | /* ** COMMAND: alerts* ** ** Usage: %fossil alerts SUBCOMMAND ARGS... ** ** Subcommands: | < < < < > < < < < | > < | 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 | /* ** COMMAND: alerts* ** ** Usage: %fossil alerts SUBCOMMAND ARGS... ** ** Subcommands: ** pending Show all pending alerts. Useful for debugging. ** reset Hard reset of all email notification tables ** in the repository. This erases all subscription ** information. ** Use with extreme care ** ** send Compose and send pending email alerts. ** Some installations may want to do this via ** a cron-job to make sure alerts are sent ** in a timely manner. ** ** Options: ** --digest Send digests ** --renewal Send subscription renewal ** notices ** --test Write to standard output ** settings [NAME VALUE] With no arguments, list all email settings. ** Or change the value of a single email setting. ** status Report on the status of the email alert ** subsystem ** subscribers [PATTERN] List all subscribers matching PATTERN. Either ** LIKE or GLOB wildcards can be used in PATTERN. ** test-message TO [OPTS] Send a single email message using whatever ** email sending mechanism is currently configured. ** Use this for testing the email notification ** configuration. ** ** Options: ** --body FILENAME Content from FILENAME ** --smtp-trace Trace SMTP processing ** --stdout Send msg to stdout ** -S|--subject SUBJECT Message "subject:" ** unsubscribe EMAIL Remove a single subscriber with the given EMAIL. */ void alert_cmd(void){ const char *zCmd; int nCmd; db_find_and_open_repository(0, 0); alert_schema(0); |
︙ | ︙ | |||
1601 1602 1603 1604 1605 1606 1607 | if( g.perm.RdWiki ) cgi_set_parameter_nocopy("sw","1",1); } @ <p>To receive email notifications for changes to this @ repository, fill out the form below and press the "Submit" button.</p> form_begin(0, "%R/subscribe"); @ <table class="subscribe"> @ <tr> | | | | | | | | | 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 | if( g.perm.RdWiki ) cgi_set_parameter_nocopy("sw","1",1); } @ <p>To receive email notifications for changes to this @ repository, fill out the form below and press the "Submit" button.</p> form_begin(0, "%R/subscribe"); @ <table class="subscribe"> @ <tr> @ <td class="form_label"><label for="e">Email Address:</label></td> @ <td><input type="text" id="e" name="e" value="%h(PD("e",""))" size="30"></td> @ <tr> if( eErr==1 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ </tr> if( needCaptcha ){ const char *zInit = ""; if( P("captchaseed")!=0 && eErr!=2 ){ uSeed = strtoul(P("captchaseed"),0,10); zInit = P("captcha"); }else{ uSeed = captcha_seed(); } zDecoded = captcha_decode(uSeed); zCaptcha = captcha_render(zDecoded); @ <tr> @ <td class="form_label"><label for="captcha">Security Code:</label></td> @ <td><input type="text" id="captcha" name="captcha" value="%h(zInit)" size="30"> captcha_speakit_button(uSeed, "Speak the code"); @ <input type="hidden" name="captchaseed" value="%u(uSeed)"></td> @ </tr> if( eErr==2 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ </tr> } if( g.perm.Admin ){ @ <tr> @ <td class="form_label"><label for="suname">User:</label></td> @ <td><input type="text" id="suname" name="suname" \ @ value="%h(PD("suname",g.zLogin))" size="30"></td> @ </tr> if( eErr==3 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ </tr> } @ <tr> |
︙ | ︙ | |||
1665 1666 1667 1668 1669 1670 1671 | if( g.perm.RdWiki ){ @ <label><input type="checkbox" name="sw" %s(PCK("sw"))> \ @ Wiki</label><br> } di = PB("di"); @ </td></tr> @ <tr> | | | | 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 | if( g.perm.RdWiki ){ @ <label><input type="checkbox" name="sw" %s(PCK("sw"))> \ @ Wiki</label><br> } di = PB("di"); @ </td></tr> @ <tr> @ <td class="form_label"><label for="di">Delivery:</label></td> @ <td><select size="1" id="di" name="di"> @ <option value="0" %s(di?"":"selected")>Individual Emails</option> @ <option value="1" %s(di?"selected":"")>Daily Digest</option> @ </select></td> @ </tr> if( g.perm.Admin ){ @ <tr> @ <td class="form_label">Admin Options:</td><td> |
︙ | ︙ | |||
1970 1971 1972 1973 1974 1975 1976 | } form_begin(0, "%R/alerts"); zHalfCode = db_text("x","SELECT hex(substr(subscriberCode,1,16))" " FROM subscriber WHERE subscriberId=%d", sid); @ <input type="hidden" name="name" value="%h(zHalfCode)"> @ <table class="subscribe"> @ <tr> | | | | 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 | } form_begin(0, "%R/alerts"); zHalfCode = db_text("x","SELECT hex(substr(subscriberCode,1,16))" " FROM subscriber WHERE subscriberId=%d", sid); @ <input type="hidden" name="name" value="%h(zHalfCode)"> @ <table class="subscribe"> @ <tr> @ <td class="form_label"><label for="semail">Email Address:</label></td> if( isLogin ){ @ <td><input type="text" id="semail" name="semail" value="%h(semail)" size="30">\ if( eErr==8 ){ @ <span class='loginError'>← not a valid email address!</span> }else if( g.perm.Admin ){ @ <a href="%R/announce?to=%t(semail)">\ @ (Send a message to %h(semail))</a>\ } @ </td> |
︙ | ︙ | |||
2007 2008 2009 2010 2011 2012 2013 | @ <td>%h(db_column_text(&q,9))</td> @ <tr> @ <tr> @ <td class='form_label'>Last Contact:</td> @ <td>%h(db_column_text(&q,10)) ← \ @ %,d(db_column_int(&q,11)) days ago</td> @ </tr> | | | | | 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 | @ <td>%h(db_column_text(&q,9))</td> @ <tr> @ <tr> @ <td class='form_label'>Last Contact:</td> @ <td>%h(db_column_text(&q,10)) ← \ @ %,d(db_column_int(&q,11)) days ago</td> @ </tr> @ <td class="form_label"><label for="suname">User:</label></td> @ <td><input type="text" id="suname" name="suname" \ @ value="%h(suname?suname:"")" size="30">\ uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", suname); if( uid ){ @ <a href='%R/setup_uedit?id=%d(uid)'>\ @ (login info for %h(suname))</a>\ } @ </tr> } |
︙ | ︙ | |||
2041 2042 2043 2044 2045 2046 2047 | } if( g.perm.RdWiki ){ @ <label><input type="checkbox" name="sw" %s(sw?"checked":"")>\ @ Wiki</label> } @ </td></tr> @ <tr> | | | | 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 | } if( g.perm.RdWiki ){ @ <label><input type="checkbox" name="sw" %s(sw?"checked":"")>\ @ Wiki</label> } @ </td></tr> @ <tr> @ <td class="form_label"><label for="sdigest">Delivery:</label></td> @ <td><select size="1" id="sdigest" name="sdigest"> @ <option value="0" %s(sdigest?"":"selected")>Individual Emails</option> @ <option value="1" %s(sdigest?"selected":"")>Daily Digest</option> @ </select></td> @ </tr> if( g.perm.Admin ){ @ <tr> @ <td class="form_label">Admin Options:</td><td> |
︙ | ︙ | |||
2274 2275 2276 2277 2278 2279 2280 | style_header("Unsubscribe Request"); @ <p>Fill out the form below to request an email message that will @ explain how to unsubscribe and/or change your subscription settings.</p> @ form_begin(0, "%R/unsubscribe"); @ <table class="subscribe"> @ <tr> | | | | | | 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 | style_header("Unsubscribe Request"); @ <p>Fill out the form below to request an email message that will @ explain how to unsubscribe and/or change your subscription settings.</p> @ form_begin(0, "%R/unsubscribe"); @ <table class="subscribe"> @ <tr> @ <td class="form_label"><label for="e">Email Address:</label></td> @ <td><input type="text" id="e" name="e" value="%h(zEAddr)" size="30"></td> if( eErr==1 ){ @ <td><span class="loginError">← %h(zErr)</span></td> } @ </tr> uSeed = captcha_seed(); zDecoded = captcha_decode(uSeed); zCaptcha = captcha_render(zDecoded); @ <tr> @ <td class="form_label"><label for="captcha">Security Code:</label></td> @ <td><input type="text" id="captcha" name="captcha" value="" size="30"> captcha_speakit_button(uSeed, "Speak the code"); @ <input type="hidden" name="captchaseed" value="%u(uSeed)"></td> if( eErr==2 ){ @ <td><span class="loginError">← %h(zErr)</span></td> } @ </tr> @ <tr> |
︙ | ︙ | |||
2696 2697 2698 2699 2700 2701 2702 | ** ** EVENTIDs are text. The first character is 'c', 'f', 't', or 'w' ** for check-in, forum, ticket, or wiki. The remaining text is a ** integer that references the EVENT.OBJID value for the event. ** Run /timeline?showid to see these OBJID values. ** ** Options: | < | 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 | ** ** EVENTIDs are text. The first character is 'c', 'f', 't', or 'w' ** for check-in, forum, ticket, or wiki. The remaining text is a ** integer that references the EVENT.OBJID value for the event. ** Run /timeline?showid to see these OBJID values. ** ** Options: ** --digest Generate digest alert text ** --needmod Assume all events are pending moderator approval */ void test_alert_cmd(void){ Blob out; int nEvent; int needMod; |
︙ | ︙ | |||
2757 2758 2759 2760 2761 2762 2763 | ** ** EVENTIDs are text. The first character is 'c', 'f', 't', or 'w' ** for check-in, forum, ticket, or wiki. The remaining text is a ** integer that references the EVENT.OBJID value for the event. ** Run /timeline?showid to see these OBJID values. ** ** Options: | < < < | 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 | ** ** EVENTIDs are text. The first character is 'c', 'f', 't', or 'w' ** for check-in, forum, ticket, or wiki. The remaining text is a ** integer that references the EVENT.OBJID value for the event. ** Run /timeline?showid to see these OBJID values. ** ** Options: ** --backoffice Run alert_backoffice() after all alerts have ** been added. This will cause the alerts to be ** sent out with the SENDALERT_TRACE option. ** --debug Like --backoffice, but add the SENDALERT_STDOUT ** so that emails are printed to standard output ** rather than being sent. ** --digest Process emails using SENDALERT_DIGEST */ void test_add_alert_cmd(void){ int i; int doAuto = find_option("backoffice",0,0)!=0; unsigned mFlags = 0; if( find_option("debug",0,0)!=0 ){ |
︙ | ︙ | |||
3229 3230 3231 3232 3233 3234 3235 | style_set_current_feature("alerts"); style_header("Message To Administrator"); form_begin(0, "%R/contact_admin"); @ <p>Enter a message to the repository administrator below:</p> @ <table class="subscribe"> if( zCaptcha ){ @ <tr> | | | | | | | | | | 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 | style_set_current_feature("alerts"); style_header("Message To Administrator"); form_begin(0, "%R/contact_admin"); @ <p>Enter a message to the repository administrator below:</p> @ <table class="subscribe"> if( zCaptcha ){ @ <tr> @ <td class="form_label"><label for="captcha">Security Code:</label></td> @ <td><input type="text" id="captcha" name="captcha" value="" size="10"> captcha_speakit_button(uSeed, "Speak the code"); @ <input type="hidden" name="captchaseed" value="%u(uSeed)"></td> @ </tr> } @ <tr> @ <td class="form_label"><label for="from">Your Email Address:</label></td> @ <td><input type="text" id="from" name="from" value="%h(PT("from"))" size="30"></td> @ </tr> @ <tr> @ <td class="form_label"><label for="subject">Subject:</label></td> @ <td><input type="text" id="subject" name="subject" value="%h(PT("subject"))"\ @ size="80"></td> @ </tr> @ <tr> @ <td class="form_label"><label for="msg">Message:</label></td> @ <td><textarea id="msg" name="msg" cols="80" rows="10" wrap="virtual">\ @ %h(PT("msg"))</textarea> @ </tr> @ <tr> @ <td></td> @ <td><input type="submit" name="submit" value="Send Message"> @ </tr> @ </table> |
︙ | ︙ | |||
3400 3401 3402 3403 3404 3405 3406 | int aa = PB("aa"); int all = PB("all"); int aMod = PB("mods"); const char *aack = aa ? "checked" : ""; const char *allck = all ? "checked" : ""; const char *modck = aMod ? "checked" : ""; @ <tr> | | | | | | | | 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 | int aa = PB("aa"); int all = PB("all"); int aMod = PB("mods"); const char *aack = aa ? "checked" : ""; const char *allck = all ? "checked" : ""; const char *modck = aMod ? "checked" : ""; @ <tr> @ <td class="form_label"><label for="to">To:</label></td> @ <td><input type="text" id="to" name="to" value="%h(PT("to"))" size="30"><br> @ <label><input type="checkbox" name="aa" %s(aack)> \ @ All "announcement" subscribers</label> \ @ <a href="%R/subscribers?only=a" target="_blank">(list)</a><br> @ <label><input type="checkbox" name="all" %s(allck)> \ @ All subscribers</label> \ @ <a href="%R/subscribers" target="_blank">(list)</a><br> @ <label><input type="checkbox" name="mods" %s(modck)> \ @ All moderators</label> \ @ <a href="%R/setup_ulist?with=5" target="_blank">(list)</a><br></td> @ </tr> } @ <tr> @ <td class="form_label"><label for="subject">Subject:</label></td> @ <td><input type="text" id="subject" name="subject" value="%h(PT("subject"))"\ @ size="80"></td> @ </tr> @ <tr> @ <td class="form_label"><label for="msg">Message:</label></td> @ <td><textarea id="msg" name="msg" cols="80" rows="10" wrap="virtual">\ @ %h(PT("msg"))</textarea> @ </tr> @ <tr> @ <td></td> if( fossil_strcmp(P("name"),"test2")==0 ){ @ <td><input type="submit" name="submit" value="Dry Run"> }else{ |
︙ | ︙ |
Changes to src/allrepo.c.
︙ | ︙ | |||
59 60 61 62 63 64 65 | ** user. This command performs certain operations on all repositories ** that can be useful before or after a period of disconnected operation. ** ** On Win32 systems, the file is named "_fossil" and is located in ** %LOCALAPPDATA%, %APPDATA% or %HOMEPATH%. ** ** Available operations are: | < < < < < < < < < < < < < < < < < < < < < < | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | ** user. This command performs certain operations on all repositories ** that can be useful before or after a period of disconnected operation. ** ** On Win32 systems, the file is named "_fossil" and is located in ** %LOCALAPPDATA%, %APPDATA% or %HOMEPATH%. ** ** Available operations are: ** backup Backup all repositories. The argument must be the name of ** a directory into which all backup repositories are written. ** cache Manages the cache used for potentially expensive web ** pages. Any additional arguments are passed on verbatim ** to the cache command. ** changes Shows all local checkouts that have uncommitted changes. ** This operation has no additional options. ** clean Delete all "extra" files in all local checkouts. Extreme ** caution should be exercised with this command because its ** effects cannot be undone. Use of the --dry-run option to ** carefully review the local checkouts to be operated upon ** and the --whatif option to carefully review the files to ** be deleted beforehand is highly recommended. The command ** line options supported by the clean command itself, if any ** are present, are passed along verbatim. ** config Only the "config pull AREA" command works. ** dbstat Run the "dbstat" command on all repositories. ** extras Shows "extra" files from all local checkouts. The command ** line options supported by the extra command itself, if any ** are present, are passed along verbatim. ** fts-config Run the "fts-config" command on all repositories. ** git CMD Do the "git export" or "git status" command (whichever ** is specified by CMD) on all repositories for which ** a Git mirror has been previously established. ** info Run the "info" command on all repositories. ** pull Run a "pull" operation on all repositories. Only the ** --verbose and --share-links options are supported. ** push Run a "push" on all repositories. Only the --verbose ** option is supported. ** rebuild Rebuild on all repositories. The command line options ** supported by the rebuild command itself, if any are ** present, are passed along verbatim. The --force and ** --randomize options are not supported. ** sync Run a "sync" on all repositories. Only the --verbose ** and --unversioned and --share-links options are supported. ** set Run the "setting" or "set" commands on all ** repositories. These command are particularly useful in ** conjunction with the "max-loadavg" setting which cannot ** otherwise be set globally. ** unset Run the "unset" command on all repositories ** server Run the "server" commands on all repositories. ** The root URI gives a listing of all repos. ** ui Run the "ui" command on all repositories. Like "server" ** but bind to the loopback TCP address only, enable ** the --localauth option and automatically launch a ** web-browser ** ** In addition, the following maintenance operations are supported: ** add Add all the repositories named to the set of repositories ** tracked by Fossil. Normally Fossil is able to keep up with ** this list by itself, but sometimes it can benefit from this ** hint if you rename repositories. ** ignore Arguments are repositories that should be ignored by ** subsequent clean, extras, list, pull, push, rebuild, and ** sync operations. The -c|--ckout option causes the listed ** local checkouts to be ignored instead. ** list | ls Display the location of all repositories. The -c|--ckout ** option causes all local checkouts to be listed instead. ** ** Repositories are automatically added to the set of known repositories ** when one of the following commands are run against the repository: ** clone, info, pull, push, or sync. Even previously ignored repositories ** are added back to the list of repositories by these commands. |
︙ | ︙ |
Changes to src/attach.c.
︙ | ︙ | |||
396 397 398 399 400 401 402 | @ <p class="generalError">Error: Incorrect security code.</p> } @ <h2>Add Attachment To %s(zTargetType)</h2> form_begin("enctype='multipart/form-data'", "%R/attachadd"); @ <div> @ File to Attach: @ <input type="file" name="f" size="60" /><br /> | | | | 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 | @ <p class="generalError">Error: Incorrect security code.</p> } @ <h2>Add Attachment To %s(zTargetType)</h2> form_begin("enctype='multipart/form-data'", "%R/attachadd"); @ <div> @ File to Attach: @ <input type="file" name="f" size="60" /><br /> @ <label>Description:<br /> @ <textarea name="comment" cols="80" rows="5" wrap="virtual"></textarea></label><br /> if( zTkt ){ @ <input type="hidden" name="tkt" value="%h(zTkt)" /> }else if( zTechNote ){ @ <input type="hidden" name="technote" value="%h(zTechNote)" /> }else{ @ <input type="hidden" name="page" value="%h(zPage)" /> } |
︙ | ︙ | |||
676 677 678 679 680 681 682 | /* ** COMMAND: attachment* ** ** Usage: %fossil attachment add ?PAGENAME? FILENAME ?OPTIONS? ** ** Add an attachment to an existing wiki page or tech note. | < > < | 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 | /* ** COMMAND: attachment* ** ** Usage: %fossil attachment add ?PAGENAME? FILENAME ?OPTIONS? ** ** Add an attachment to an existing wiki page or tech note. ** ** Options: ** -t|--technote DATETIME Specifies the timestamp of ** the technote to which the attachment ** is to be made. The attachment will be ** to the most recently modified tech note ** with the specified timestamp. ** -t|--technote TECHNOTE-ID Specifies the technote to be ** updated by its technote id. ** ** One of PAGENAME, DATETIME or TECHNOTE-ID must be specified. ** ** DATETIME may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in ** year-month-day form, it may be truncated, the "T" may be replaced by |
︙ | ︙ | |||
790 791 792 793 794 795 796 | ** ** List attachments for one or more attachment targets. The target ** name arguments are glob prefixes for the attachment.target ** field. If no names are provided then a prefix of [a-zA-Z] is used, ** which will match most wiki page names and some ticket hashes. ** ** Options: | < | 789 790 791 792 793 794 795 796 797 798 799 800 801 802 | ** ** List attachments for one or more attachment targets. The target ** name arguments are glob prefixes for the attachment.target ** field. If no names are provided then a prefix of [a-zA-Z] is used, ** which will match most wiki page names and some ticket hashes. ** ** Options: ** -latest List only the latest version of a given attachment. ** */ void test_list_attachments(void){ Stmt q; int i; const int fLatest = find_option("latest", 0, 0) != 0; |
︙ | ︙ |
Changes to src/backoffice.c.
︙ | ︙ | |||
677 678 679 680 681 682 683 | ** ** If only a single repository is named and --poll is omitted, then the ** backoffice work is done in-process. But if there are multiple repositories ** or if --poll is used, a separate sub-process is started for each poll of ** each repository. ** ** Standard options: | < < < < < < < | 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 | ** ** If only a single repository is named and --poll is omitted, then the ** backoffice work is done in-process. But if there are multiple repositories ** or if --poll is used, a separate sub-process is started for each poll of ** each repository. ** ** Standard options: ** --debug Show what this command is doing. ** --logfile FILE Append a log of backoffice actions onto FILE. ** --min N When polling, invoke backoffice at least ** once every N seconds even if the repository ** never changes. 0 or negative means disable ** this feature. Default: 3600 (once per hour). ** --poll N Repeat backoffice calls for repositories that ** change in appoximately N-second intervals. ** N less than 1 turns polling off (the default). ** Recommended polling interval: 60 seconds. ** --trace Enable debugging output on stderr ** ** Options intended for internal use only which may change or be ** discontinued in future releases: ** --nodelay Do not queue up or wait for a backoffice job ** to complete. If no work is available or if ** backoffice has run recently, return immediately. ** --nolease Always run backoffice, even if there is a lease ** conflict. This option implies --nodelay. This ** option is added to secondary backoffice commands ** that are invoked by the --poll option. */ void backoffice_command(void){ int nPoll; |
︙ | ︙ |
Changes to src/bisect.c.
︙ | ︙ | |||
468 469 470 471 472 473 474 | /* ** COMMAND: bisect ** ** Usage: %fossil bisect SUBCOMMAND ... ** ** Run various subcommands useful for searching back through the change ** history for a particular checkin that causes or fixes a problem. | < < < < < < < < < < < < < < | > < < < < < < < < | 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 | /* ** COMMAND: bisect ** ** Usage: %fossil bisect SUBCOMMAND ... ** ** Run various subcommands useful for searching back through the change ** history for a particular checkin that causes or fixes a problem. ** > fossil bisect bad ?VERSION? ** Identify version VERSION as non-working. If VERSION is omitted, ** the current checkout is marked as non-working. ** > fossil bisect good ?VERSION? ** Identify version VERSION as working. If VERSION is omitted, ** the current checkout is marked as working. ** > fossil bisect log ** > fossil bisect chart ** Show a log of "good", "bad", and "skip" versions. "bisect log" ** shows the events in the order that they were tested. ** "bisect chart" shows them in order of check-in. ** > fossil bisect next ** Update to the next version that is halfway between the working and ** non-working versions. ** > fossil bisect options ?NAME? ?VALUE? ** List all bisect options, or the value of a single option, or set the ** value of a bisect option. ** > fossil bisect reset ** Reinitialize a bisect session. This cancels prior bisect history ** and allows a bisect session to start over from the beginning. ** > fossil bisect run [OPTIONS] COMMAND ** Invoke COMMAND repeatedly to run the bisect. The exit code for ** COMMAND should be 0 for "good", 125 for "skip", and any other value ** for "bad". ** ** Options: ** -i|--interactive Prompt the user for the good/bad/skip decision ** after each step, rather than using the exit ** code from COMMAND ** > fossil bisect skip ?VERSION? ** Cause VERSION (or the current checkout if VERSION is omitted) to ** be ignored for the purpose of the current bisect. This might ** be done, for example, because VERSION does not compile correctly ** or is otherwise unsuitable to participate in this bisect. ** > fossil bisect vlist|ls|status ?-a|--all? ** List the versions in between the inner-most "bad" and "good". ** > fossil bisect ui ** Like "fossil ui" except start on a timeline that shows only the ** check-ins that are part of the current bisect. ** > fossil bisect undo ** Undo the most recent "good", "bad", or "skip" command. */ void bisect_cmd(void){ int n; const char *zCmd; int foundCmd = 0; db_must_be_within_tree(); |
︙ | ︙ |
Changes to src/blob.c.
︙ | ︙ | |||
1633 1634 1635 1636 1637 1638 1639 | ** ** Run each argument through blob_append_escaped_arg() and show the ** result. Append each argument to "fossil test-echo" and run that ** using fossil_system() to verify that it really does get escaped ** correctly. ** ** Other options: | < < < < | 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 | ** ** Run each argument through blob_append_escaped_arg() and show the ** result. Append each argument to "fossil test-echo" and run that ** using fossil_system() to verify that it really does get escaped ** correctly. ** ** Other options: ** --filename-args BOOL Subsequent arguments are assumed to be ** filenames if BOOL is true, or not if BOOL ** is false. Defaults on. ** --hex HEX Skip the --hex flag and instead decode HEX ** into ascii. This provides a way to insert ** unusual characters as an argument for testing. ** --compare HEX ASCII Verify that argument ASCII is identical to ** to decoded HEX. ** --fuzz N Run N fuzz cases. Each cases is a call ** to "fossil test-escaped-arg --compare HEX ARG" ** where HEX and ARG are the same argument. ** The argument is chosen at random. */ void test_escaped_arg_command(void){ int i; |
︙ | ︙ |
Changes to src/branch.c.
︙ | ︙ | |||
582 583 584 585 586 587 588 | /* ** COMMAND: branch ** ** Usage: %fossil branch SUBCOMMAND ... ?OPTIONS? ** ** Run various subcommands to manage branches of the open repository or ** of the repository identified by the -R or --repository option. | < < | > > < < < < < < < > | < < < | 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 | /* ** COMMAND: branch ** ** Usage: %fossil branch SUBCOMMAND ... ?OPTIONS? ** ** Run various subcommands to manage branches of the open repository or ** of the repository identified by the -R or --repository option. ** > fossil branch close|reopen ?OPTIONS? BRANCH-NAME ?...BRANCH-NAMES? ** Adds or cancels the "closed" tag to one or more branches. ** It accepts arbitrary unambiguous symbolic names but ** will only resolve checkin names and skips any which resolve ** to non-leaf checkins. ** ** Options: ** -n|--dry-run do not commit changes and dump artifact ** to stdout ** -v|--verbose output more information ** --date-override DATE DATE to use instead of 'now' ** --user-override USER USER to use instead of the current default ** > fossil branch current ** Print the name of the branch for the current check-out ** > fossil branch hide|unhide ?OPTIONS? BRANCH-NAME ?...BRANCH-NAMES? ** Adds or cancels the "hidden" tag for the specified branches or ** or checkin IDs. Accepts the same options as the close ** subcommand. ** > fossil branch info BRANCH-NAME ** Print information about a branch ** > fossil branch list|ls ?OPTIONS? ?GLOB? ** > fossil branch lsh ?OPTIONS? ?LIMIT? ** List all branches. ** ** Options: ** -a|--all List all branches. Default show only open branches ** -c|--closed List closed branches. ** -p List only private branches. ** -r Reverse the sort order ** -t Show recently changed branches first ** ** The current branch is marked with an asterisk. Private branches are ** marked with a hash sign. ** ** If GLOB is given, show only branches matching the pattern. ** ** The "lsh" variant of this subcommand shows recently changed branches, ** and accepts an optional LIMIT argument (defaults to 5) to cap output, ** but no GLOB argument. All other options are supported, with -t being ** an implied no-op. ** > fossil branch new BRANCH-NAME BASIS ?OPTIONS? ** Create a new branch BRANCH-NAME off of check-in BASIS. ** Supported options for this subcommand include: ** --private branch is private (i.e., remains local) ** --bgcolor COLOR use COLOR instead of automatic background ** ("auto" lets Fossil choose it automatically, ** even for private branches) ** --nosign do not sign contents on this branch ** --date-override DATE DATE to use instead of 'now' ** --user-override USER USER to use instead of the current default ** ** DATE may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in ** year-month-day form, it may be truncated, the "T" may be ** replaced by a space, and it may also name a timezone offset ** from UTC as "-HH:MM" (westward) or "+HH:MM" (eastward). ** Either no timezone suffix or "Z" means UTC. ** ** Options valid for all subcommands: ** -R|--repository REPO Run commands on repository REPO */ void branch_cmd(void){ int n; const char *zCmd = "list"; db_find_and_open_repository(0, 0); if( g.argc>=3 ) zCmd = g.argv[2]; |
︙ | ︙ | |||
807 808 809 810 811 812 813 | } } if( zBgClr && zBgClr[0] && show_colors ){ @ <tr style="background-color:%s(zBgClr)"> }else{ @ <tr> } | | | | 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 | } } if( zBgClr && zBgClr[0] && show_colors ){ @ <tr style="background-color:%s(zBgClr)"> }else{ @ <tr> } @ <td>%z(href("%R/timeline?r=%T",zBranch))%h(zBranch)</a><input type="checkbox" @ title="%h(zBranch)" aria-label="%h(zBranch)" disabled="disabled"/></td> @ <td data-sortkey="%016llx(iMtime)">%s(zAge)</td> @ <td>%d(nCkin)</td> fossil_free(zAge); @ <td>%s(isClosed?"closed":"")</td> if( zMergeTo ){ @ <td>merged into @ %z(href("%R/timeline?f=%!S",zLastCkin))%h(zMergeTo)</a></td> |
︙ | ︙ | |||
835 836 837 838 839 840 841 | /* ** WEBPAGE: brlist ** Show a list of branches. With no query parameters, a sortable table ** is used to show all branches. If query parameters are present a ** fixed bullet list is shown. ** ** Query parameters: | < | 826 827 828 829 830 831 832 833 834 835 836 837 838 839 | /* ** WEBPAGE: brlist ** Show a list of branches. With no query parameters, a sortable table ** is used to show all branches. If query parameters are present a ** fixed bullet list is shown. ** ** Query parameters: ** all Show all branches ** closed Show only closed branches ** open Show only open branches ** colortest Show all branches with automatic color ** ** When there are no query parameters, a new-style /brlist page shows ** all branches in a sortable table. The new-style /brlist page is |
︙ | ︙ | |||
966 967 968 969 970 971 972 | /* ** WEBPAGE: brtimeline ** ** Show a timeline of all branches ** ** Query parameters: | < | 956 957 958 959 960 961 962 963 964 965 966 967 968 969 | /* ** WEBPAGE: brtimeline ** ** Show a timeline of all branches ** ** Query parameters: ** ng No graph ** nohidden Hide check-ins with "hidden" tag ** onlyhidden Show only check-ins with "hidden" tag ** brbg Background color by branch name ** ubg Background color by user name */ void brtimeline_page(void){ |
︙ | ︙ |
Changes to src/browse.c.
︙ | ︙ | |||
124 125 126 127 128 129 130 | ** ** Show the files and subdirectories within a single directory of the ** source tree. Only files for a single check-in are shown if the ci= ** query parameter is present. If ci= is missing, the union of files ** across all check-ins is shown. ** ** Query parameters: | < | 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | ** ** Show the files and subdirectories within a single directory of the ** source tree. Only files for a single check-in are shown if the ci= ** query parameter is present. If ci= is missing, the union of files ** across all check-ins is shown. ** ** Query parameters: ** ci=LABEL Show only files in this check-in. Optional. ** name=PATH Directory to display. Optional. Top-level if missing ** re=REGEXP Show only files matching REGEXP ** type=TYPE TYPE=flat: use this display ** TYPE=tree: use the /tree display instead ** noreadme Do not attempt to display the README file. */ |
︙ | ︙ | |||
638 639 640 641 642 643 644 | ** then show only the files for the check-in identified. If ci= is omitted, ** then show the union of files over all check-ins. ** ** The type=tree query parameter is required or else the /dir format is ** used. ** ** Query parameters: | < | 637 638 639 640 641 642 643 644 645 646 647 648 649 650 | ** then show only the files for the check-in identified. If ci= is omitted, ** then show the union of files over all check-ins. ** ** The type=tree query parameter is required or else the /dir format is ** used. ** ** Query parameters: ** type=tree Required to prevent use of /dir format ** name=PATH Directory to display. Optional ** ci=LABEL Show only files in this check-in. Optional. ** re=REGEXP Show only files matching REGEXP. Optional. ** expand Begin with the tree fully expanded. ** nofiles Show directories (folders) only. Omit files. ** mtime Order directory elements by decreasing mtime |
︙ | ︙ | |||
762 763 764 765 766 767 768 | hyperlinked_path(zD, &dirname, zCI, "tree", zREx, 0); if( zRE ) blob_appendf(&dirname, " matching \"%s\"", zRE); style_submenu_element("Top-Level", "%s", url_render(&sURI, "name", 0, 0, 0)); }else if( zRE ){ blob_appendf(&dirname, "matching \"%s\"", zRE); } | | | 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 | hyperlinked_path(zD, &dirname, zCI, "tree", zREx, 0); if( zRE ) blob_appendf(&dirname, " matching \"%s\"", zRE); style_submenu_element("Top-Level", "%s", url_render(&sURI, "name", 0, 0, 0)); }else if( zRE ){ blob_appendf(&dirname, "matching \"%s\"", zRE); } style_submenu_binary("mtime","Sort By","Time","Filename", 0); if( zCI ){ style_submenu_element("All", "%s", url_render(&sURI, "ci", 0, 0, 0)); if( nD==0 && !showDirOnly ){ style_submenu_element("File Ages", "%R/fileage?name=%T", zCI); } } if( linkTrunk ){ |
︙ | ︙ |
Changes to src/builtin.c.
︙ | ︙ | |||
155 156 157 158 159 160 161 | } return; } /* ** WEBPAGE: builtin loadavg-exempt ** | | > | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | } return; } /* ** WEBPAGE: builtin loadavg-exempt ** ** Return one of many built-in content files. ** ** Query parameters: ** name=FILENAME Return the single file whose name is FILENAME. ** mimetype=TYPE Override the mimetype in the returned file to ** be TYPE. If this query parameter is omitted ** (the usual case) then the mimetype is inferred ** from the suffix on FILENAME ** m=IDLIST IDLIST is a comma-separated list of integers ** that specify multiple javascript files to be |
︙ | ︙ |
Changes to src/bundle.c.
︙ | ︙ | |||
717 718 719 720 721 722 723 | db_end_transaction(0); } /* ** COMMAND: bundle* ** ** Usage: %fossil bundle SUBCOMMAND ARGS... | < < < < < < < < < < < < < < < | 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 | db_end_transaction(0); } /* ** COMMAND: bundle* ** ** Usage: %fossil bundle SUBCOMMAND ARGS... ** > fossil bundle append BUNDLE FILE... ** Add files named on the command line to BUNDLE. This subcommand has ** little practical use and is mostly intended for testing. ** > fossil bundle cat BUNDLE HASH... ** Extract one or more artifacts from the bundle and write them ** consecutively on standard output. This subcommand was designed ** for testing and introspection of bundles and is not something ** commonly used. ** > fossil bundle export BUNDLE ?OPTIONS? ** Generate a new bundle, in the file named BUNDLE, that contains a ** subset of the check-ins in the repository (usually a single branch) ** described by the --branch, --from, --to, and/or --checkin options, ** at least one of which is required. If BUNDLE already exists, the ** specified content is added to the bundle. ** --branch BRANCH Package all check-ins on BRANCH ** --from TAG1 --to TAG2 Package check-ins between TAG1 and TAG2 ** --checkin TAG Package the single check-in TAG ** --standalone Do no use delta-encoding against ** artifacts not in the bundle ** > fossil bundle extend BUNDLE ** The BUNDLE must already exist. This subcommand adds to the bundle ** any check-ins that are descendants of check-ins already in the bundle, ** and any tags that apply to artifacts in the bundle. ** > fossil bundle import BUNDLE ?--publish? ** Import all content from BUNDLE into the repository. By default, the ** imported files are private and will not sync. Use the --publish ** option to make the import public. ** > fossil bundle ls BUNDLE ** List the contents of BUNDLE on standard output ** > fossil bundle purge BUNDLE ** Remove from the repository all files that are used exclusively ** by check-ins in BUNDLE. This has the effect of undoing a ** "fossil bundle import". ** ** See also: [[publish]] */ void bundle_cmd(void){ |
︙ | ︙ |
Changes to src/cache.c.
︙ | ︙ | |||
258 259 260 261 262 263 264 | /* ** COMMAND: cache* ** ** Usage: %fossil cache SUBCOMMAND ** ** Manage the cache used for potentially expensive web pages such as | | > < < < < | 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | /* ** COMMAND: cache* ** ** Usage: %fossil cache SUBCOMMAND ** ** Manage the cache used for potentially expensive web pages such as ** /zip and /tarball. ** ** SUBCOMMAND can be: ** clear Remove all entries from the cache. ** init Create the cache file if it does not already exist. ** list|ls List the keys and content sizes and other stats for ** all entries currently in the cache. ** size ?N? Query or set the maximum number of entries in the cache. ** status Show a summary of the cache status. ** ** The cache is stored in a file that is distinct from the repository ** but that is held in the same directory as the repository. The cache ** file can be deleted in order to completely disable the cache. */ void cache_cmd(void){ |
︙ | ︙ |
Changes to src/capabilities.c.
︙ | ︙ | |||
391 392 393 394 395 396 397 | " UNION ALL" " SELECT 'Adminstrator', fullcap(capunion(cap)), 300, count(*) FROM user" " WHERE cap GLOB '*[as]*'" " ORDER BY 3 ASC", zSelfCap, hasPubPages, zSelfCap ); @ <table id='capabilitySummary' cellpadding="0" cellspacing="0" border="1"> | | | 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 | " UNION ALL" " SELECT 'Adminstrator', fullcap(capunion(cap)), 300, count(*) FROM user" " WHERE cap GLOB '*[as]*'" " ORDER BY 3 ASC", zSelfCap, hasPubPages, zSelfCap ); @ <table id='capabilitySummary' cellpadding="0" cellspacing="0" border="1"> @ <tr><th>Role<th>Code<th>Forum<th>Tickets<th>Wiki<th>Chat\ @ <th>Unversioned Content</th></tr> while( db_step(&q)==SQLITE_ROW ){ const char *zId = db_column_text(&q, 0); const char *zCap = db_column_text(&q, 1); int n = db_column_int(&q, 3); int eType; static const char *const azType[] = { "off", "read", "write" }; |
︙ | ︙ |
Changes to src/captcha.c.
︙ | ︙ | |||
541 542 543 544 545 546 547 | if( !captcha_needed() ) return; uSeed = captcha_seed(); zDecoded = captcha_decode(uSeed); zCaptcha = captcha_render(zDecoded); @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> @ %h(zCaptcha) @ </pre> | | | | > | 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 | if( !captcha_needed() ) return; uSeed = captcha_seed(); zDecoded = captcha_decode(uSeed); zCaptcha = captcha_render(zDecoded); @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha"> @ %h(zCaptcha) @ </pre> @ <label for="captcha">Enter security code shown above:</label> @ <input type="hidden" name="captchaseed" value="%u(uSeed)" /> @ <input type="text" id="captcha" name="captcha" size=8 /> if( showButton ){ @ <input type="submit" value="Submit"> } @ <br/>\ captcha_speakit_button(uSeed, 0); @ </td></tr></table></div> } /* ** Add a "Speak the captcha" button. */ void captcha_speakit_button(unsigned int uSeed, const char *zMsg){ if( zMsg==0 ) zMsg = "Speak the text"; @ <input aria-label="%h(zMsg)" title="%h(zMsg)" type="button" value="%h(zMsg)" \ @ id="speakthetext"> @ <script nonce="%h(style_nonce())">/* captcha_speakit_button() */ @ document.getElementById("speakthetext").onclick = function(){ @ var audio = window.fossilAudioCaptcha \ @ || new Audio("%R/captcha-audio/%u(uSeed)"); @ window.fossilAudioCaptcha = audio; @ audio.currentTime = 0; @ audio.play(); @ } @ </script> } /* ** WEBPAGE: test-captcha ** ** Test the captcha-generator by rendering the value of the name= query ** parameter using ascii-art. If name= is omitted, show a random 16-digit ** hexadecimal number. */ void captcha_test(void){ const char *zPw = P("name"); if( zPw==0 || zPw[0]==0 ){ |
︙ | ︙ |
Changes to src/chat.c.
︙ | ︙ | |||
699 700 701 702 703 704 705 | ** WEBPAGE: chat-fetch-one hidden loadavg-exempt ** ** /chat-fetch-one/N ** ** Fetches a single message with the given ID, if available. ** ** Options: | < | 699 700 701 702 703 704 705 706 707 708 709 710 711 712 | ** WEBPAGE: chat-fetch-one hidden loadavg-exempt ** ** /chat-fetch-one/N ** ** Fetches a single message with the given ID, if available. ** ** Options: ** raw = the xmsg field will be returned unparsed. ** ** Response is either a single object in the format returned by ** /chat-poll (without the wrapper array) or a JSON-format error ** response, as documented for ajax_route_error(). */ void chat_fetch_one(void){ |
︙ | ︙ | |||
969 970 971 972 973 974 975 | ** on the default remote Fossil repository (the Fossil repository whose ** URL shows when you run the "fossil remote" command) or to the URL ** specified by the --remote option. If there is no default remote ** Fossil repository and the --remote option is omitted, then this ** command fails with an error. ** ** Subcommands: | < < < < < < < < < < | 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 | ** on the default remote Fossil repository (the Fossil repository whose ** URL shows when you run the "fossil remote" command) or to the URL ** specified by the --remote option. If there is no default remote ** Fossil repository and the --remote option is omitted, then this ** command fails with an error. ** ** Subcommands: ** > fossil chat ** When there is no SUBCOMMAND (when this command is simply "fossil chat") ** the response is to bring up a web-browser window to the chatroom ** on the default system web-browser. You can accomplish the same by ** typing the appropriate URL into the web-browser yourself. This ** command is merely a convenience for command-line oriented people. ** > fossil chat pull ** Copy chat content from the server down into the local clone, ** as a backup or archive. Setup privilege is required on the server. ** --all Download all chat content. Normally only ** previously undownloaded content is retrieved. ** --debug Additional debugging output. ** --out DATABASE Store CHAT table in separate database file ** DATABASE rather that adding to local clone ** --unsafe Allow the use of unencrypted http:// ** > fossil chat send [ARGUMENTS] ** This command sends a new message to the chatroom. The message ** to be sent is determined by arguments as follows: ** -f|--file FILENAME File to attach to the message ** --as FILENAME2 Causes --file FILENAME to be sent with ** the attachment name FILENAME2 ** -m|--message TEXT Text of the chat message ** --remote URL Send to this remote URL ** --unsafe Allow the use of unencrypted http:// ** > fossil chat url ** Show the default URL used to access the chat server. ** ** Additional subcommands may be added in the future. */ void chat_command(void){ const char *zUrl = find_option("remote",0,1); int urlFlags = 0; |
︙ | ︙ |
Changes to src/color.c.
︙ | ︙ | |||
167 168 169 170 171 172 173 | } @ <form method="POST"> @ <p>Enter candidate branch names below and see them displayed in their @ default background colors above.</p> for(i=0; i<10; i++){ sqlite3_snprintf(sizeof(zNm),zNm,"b%d",i); zBr = P(zNm); | > | > | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | } @ <form method="POST"> @ <p>Enter candidate branch names below and see them displayed in their @ default background colors above.</p> for(i=0; i<10; i++){ sqlite3_snprintf(sizeof(zNm),zNm,"b%d",i); zBr = P(zNm); @ <label>Branch %s(zNm): @ <input type="text" size="30" name='%s(zNm)' value='%h(PD(zNm,""))'> @ </label><br /> } @ <input type="submit" value="Submit"> @ <input type="submit" name="rand" value="Random"> @ </form> style_finish_page(); } |
Changes to src/configure.c.
︙ | ︙ | |||
722 723 724 725 726 727 728 | /* ** COMMAND: configuration* ** ** Usage: %fossil configuration METHOD ... ?OPTIONS? ** ** Where METHOD is one of: export import merge pull push reset. | < < < > < < < < < < < < < < < < | 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 | /* ** COMMAND: configuration* ** ** Usage: %fossil configuration METHOD ... ?OPTIONS? ** ** Where METHOD is one of: export import merge pull push reset. ** > fossil configuration export AREA FILENAME ** Write to FILENAME exported configuration information for AREA. ** ** AREA can be one of: ** all email interwiki project shun skin ** ticket user alias subscriber ** > fossil configuration import FILENAME ** Read a configuration from FILENAME, overwriting the current ** configuration. ** > fossil configuration merge FILENAME ** Read a configuration from FILENAME and merge its values into ** the current configuration. Existing values take priority over ** values read from FILENAME. ** > fossil configuration pull AREA ?URL? ** Pull and install the configuration from a different server ** identified by URL. If no URL is specified, then the default ** server is used. Use the --overwrite flag to completely ** replace local settings with content received from URL. ** > fossil configuration push AREA ?URL? ** Push the local configuration into the remote server identified ** by URL. Admin privilege is required on the remote server for ** this to work. When the same record exists both locally and on ** the remote end, the one that was most recently changed wins. ** > fossil configuration reset AREA ** Restore the configuration to the default. AREA as above. ** > fossil configuration sync AREA ?URL? ** Synchronize configuration changes in the local repository with ** the remote repository at URL. ** ** Options: ** -R|--repository REPO Affect repository REPO with changes ** ** See also: [[settings]], [[unset]] |
︙ | ︙ |
Changes to src/content.c.
︙ | ︙ | |||
955 956 957 958 959 960 961 | ** COMMAND: test-integrity ** ** Verify that all content can be extracted from the BLOB table correctly. ** If the BLOB table is correct, then the repository can always be ** successfully reconstructed using "fossil rebuild". ** ** Options: | < < < | 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 | ** COMMAND: test-integrity ** ** Verify that all content can be extracted from the BLOB table correctly. ** If the BLOB table is correct, then the repository can always be ** successfully reconstructed using "fossil rebuild". ** ** Options: ** -d|--db-only Run "PRAGMA integrity_check" on the database only. ** No other validation is performed. ** --parse Parse all manifests, wikis, tickets, events, and ** so forth, reporting any errors found. ** -q|--quick Run "PRAGMA quick_check" on the database only. ** No other validation is performed. */ void test_integrity(void){ Stmt q; Blob content; int n1 = 0; |
︙ | ︙ | |||
1195 1196 1197 1198 1199 1200 1201 | ** Usage: %fossil test-missing ** ** Look at every artifact in the repository and verify that ** all references are satisfied. Report any referenced artifacts ** that are missing or shunned. ** ** Options: | < | 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 | ** Usage: %fossil test-missing ** ** Look at every artifact in the repository and verify that ** all references are satisfied. Report any referenced artifacts ** that are missing or shunned. ** ** Options: ** --notshunned Do not report shunned artifacts ** --quiet Only show output if there are errors */ void test_missing(void){ Stmt q; Blob content; int nErr = 0; |
︙ | ︙ |
Changes to src/db.c.
︙ | ︙ | |||
865 866 867 868 869 870 871 | } /* ** COMMAND: test-db-prepare ** Usage: %fossil test-db-prepare ?OPTIONS? SQL-STATEMENT ** ** Options: | < | 865 866 867 868 869 870 871 872 873 874 875 876 877 878 | } /* ** COMMAND: test-db-prepare ** Usage: %fossil test-db-prepare ?OPTIONS? SQL-STATEMENT ** ** Options: ** --auth-report Enable the ticket report query authorizer. ** --auth-ticket Enable the ticket schema query authorizer. ** ** Invoke db_prepare() on the SQL input. Report any errors encountered. ** This command is used to verify error detection logic in the db_prepare() ** utility routine. */ |
︙ | ︙ | |||
4621 4622 4623 4624 4625 4626 4627 | ** configuration database. If both a local and a global value exists for a ** setting, the local value takes precedence. This command normally operates ** on the local settings. Use the --global option to change global settings. ** ** Options: ** --global set or unset the given property globally instead of ** setting or unsetting it for the open repository only. | < | 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 | ** configuration database. If both a local and a global value exists for a ** setting, the local value takes precedence. This command normally operates ** on the local settings. Use the --global option to change global settings. ** ** Options: ** --global set or unset the given property globally instead of ** setting or unsetting it for the open repository only. ** --exact only consider exact name matches. ** ** See also: [[configuration]] */ void setting_cmd(void){ int i; int globalFlag = find_option("global","g",0)!=0; |
︙ | ︙ |
Changes to src/default.css.
︙ | ︙ | |||
84 85 86 87 88 89 90 | .timelineModernCell[id], .timelineColumnarCell[id], .timelineDetailCell[id] { background-color: #efefef; } .timelineModernDetail { font-size: 80%; text-align: right; float: right; | < | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | .timelineModernCell[id], .timelineColumnarCell[id], .timelineDetailCell[id] { background-color: #efefef; } .timelineModernDetail { font-size: 80%; text-align: right; float: right; margin-top: 0.5em; margin-left: 1em; } .tl-canvas { margin: 0 6px 0 10px; } .tl-rail { |
︙ | ︙ | |||
459 460 461 462 463 464 465 | vertical-align: top; background-color: #d0d0d0; } td.tktTlOpen { color: #800; } td.tktTlClosed { | | | 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 | vertical-align: top; background-color: #d0d0d0; } td.tktTlOpen { color: #800; } td.tktTlClosed { color: #757575; } span.tktError { color: red; font-weight: bold; } table.rpteditex { float: right; |
︙ | ︙ | |||
561 562 563 564 565 566 567 | line-height: 1.275/*for mobile: forum post e6f4ee7de98b55c0*/; text-size-adjust: none /* ^^^ attempt to keep mobile from inflating some text */; } table.diff pre > ins, table.diff pre > del { /* Fill platform-dependent color gaps caused by | | | 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 | line-height: 1.275/*for mobile: forum post e6f4ee7de98b55c0*/; text-size-adjust: none /* ^^^ attempt to keep mobile from inflating some text */; } table.diff pre > ins, table.diff pre > del { /* Fill platform-dependent color gaps caused by inflated line-height */ padding: 0.062em 0 0.062em 0; } table.diff pre > ins > *, table.diff pre > del > *{ /* Avoid odd-looking color swatches in conjunction with (table.diff pre > ins/del) padding */ padding: inherit; |
︙ | ︙ | |||
705 706 707 708 709 710 711 | font-weight: bold; } td.difftxt ins > ins.edit { background-color: #c0c0ff; text-decoration: none; font-weight: bold; } | | | | | 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 | font-weight: bold; } td.difftxt ins > ins.edit { background-color: #c0c0ff; text-decoration: none; font-weight: bold; } body.tkt main.content li > table.udiff { margin-left: 1.5em; margin-top: 0.5em; } body.tkt main.content ol.tkt-changes > li:target > p > span { border-bottom: 3px solid gold; } body.tkt main.content ol.tkt-changes > li:target > ol { border-left: 1px solid gold; } span.modpending { color: #b03800; font-style: italic; } |
︙ | ︙ |
Changes to src/descendants.c.
︙ | ︙ | |||
534 535 536 537 538 539 540 | ** are listed. ** ** A "leaf" is a check-in with no children in the same branch. A ** "closed leaf" is a leaf that has a "closed" tag. An "open leaf" ** is a leaf without a "closed" tag. ** ** Query parameters: | < | 534 535 536 537 538 539 540 541 542 543 544 545 546 547 | ** are listed. ** ** A "leaf" is a check-in with no children in the same branch. A ** "closed leaf" is a leaf that has a "closed" tag. An "open leaf" ** is a leaf without a "closed" tag. ** ** Query parameters: ** all Show all leaves ** closed Show only closed leaves ** ng No graph ** nohidden Hide check-ins with "hidden" tag ** onlyhidden Show only check-ins with "hidden" tag ** brbg Background color by branch name ** ubg Background color by user name |
︙ | ︙ |
Changes to src/diff.c.
︙ | ︙ | |||
3537 3538 3539 3540 3541 3542 3543 | ** if the origin= query parameter is used to specify some future check-in ** (example: "origin=trunk") then these pages show changes moving towards ** that alternative origin. Thus using "origin=trunk" on an historical ** version of the file shows the first time each line in the file was changed ** or removed by any subsequent check-in. ** ** Query parameters: | < | 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 | ** if the origin= query parameter is used to specify some future check-in ** (example: "origin=trunk") then these pages show changes moving towards ** that alternative origin. Thus using "origin=trunk" on an historical ** version of the file shows the first time each line in the file was changed ** or removed by any subsequent check-in. ** ** Query parameters: ** checkin=ID The check-in at which to start the annotation ** filename=FILENAME The filename. ** filevers=BOOLEAN Show file versions rather than check-in versions ** limit=LIMIT Limit the amount of analysis. LIMIT can be one of: ** none No limit ** Xs As much as can be computed in X seconds ** N N versions |
︙ | ︙ |
Changes to src/dispatch.c.
︙ | ︙ | |||
796 797 798 799 800 801 802 | /* ** WEBPAGE: help ** URL: /help?name=CMD ** ** Show the built-in help text for CMD. CMD can be a command-line interface ** command or a page name from the web interface or a setting. | < > < < | 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 | /* ** WEBPAGE: help ** URL: /help?name=CMD ** ** Show the built-in help text for CMD. CMD can be a command-line interface ** command or a page name from the web interface or a setting. ** ** Query parameters: ** name=CMD Show help for CMD where CMD is a command name or ** webpage name or setting name. ** plaintext Show the help within <pre>...</pre>, as if it were ** displayed using the "fossil help" command. ** raw Show the raw help text without any formatting. ** (Used for debugging.) */ void help_page(void){ const char *zCmd = P("cmd"); if( zCmd==0 ) zCmd = P("name"); |
︙ | ︙ | |||
1139 1140 1141 1142 1143 1144 1145 | ** Usage: %fossil help [OPTIONS] [TOPIC] ** ** Display information on how to use TOPIC, which may be a command, webpage, or ** setting. Webpage names begin with "/". If TOPIC is omitted, a list of ** topics is returned. ** ** The following options can be used when TOPIC is omitted: | < < | 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 | ** Usage: %fossil help [OPTIONS] [TOPIC] ** ** Display information on how to use TOPIC, which may be a command, webpage, or ** setting. Webpage names begin with "/". If TOPIC is omitted, a list of ** topics is returned. ** ** The following options can be used when TOPIC is omitted: ** -a|--all List both common and auxiliary commands ** -o|--options List command-line options common to all commands ** -s|--setting List setting names ** -t|--test List unsupported "test" commands ** -v|--verbose List both names and help text ** -x|--aux List only auxiliary commands ** -w|--www List all web pages ** -f|--full List full set of commands (including auxiliary ** and unsupported "test" commands), options, ** settings, and web pages ** -e|--everything List all help on all topics ** ** These options can be used when TOPIC is present: ** -h|--html Format output as HTML rather than plain text ** -c|--commands Restrict TOPIC search to commands */ void help_cmd(void){ int rc; int mask = CMDFLAG_ANY; int isPage = 0; |
︙ | ︙ |
Changes to src/doc.c.
︙ | ︙ | |||
864 865 866 867 868 869 870 | ** WEBPAGE: doc ** URL: /uv/FILE ** URL: /doc/CHECKIN/FILE ** ** CHECKIN can be either tag or hash prefix or timestamp identifying a ** particular check-in, or the name of a branch (meaning the most recent ** check-in on that branch) or one of various magic words: | < < < | 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 | ** WEBPAGE: doc ** URL: /uv/FILE ** URL: /doc/CHECKIN/FILE ** ** CHECKIN can be either tag or hash prefix or timestamp identifying a ** particular check-in, or the name of a branch (meaning the most recent ** check-in on that branch) or one of various magic words: ** "tip" means the most recent check-in ** "ckout" means the current check-out, if the server is run from ** within a check-out, otherwise it is the same as "tip" ** "latest" means use the most recent check-in for the document ** regardless of what branch it occurs on. ** ** FILE is the name of a file to delivered up as a webpage. FILE is relative ** to the root of the source tree of the repository. The FILE must ** be a part of CHECKIN, except when CHECKIN=="ckout" when FILE is read ** directly from disk and need not be a managed file. For /uv, FILE |
︙ | ︙ | |||
1226 1227 1228 1229 1230 1231 1232 | ** WEBPAGE: docsrch ** ** Search for documents that match a user-supplied full-text search pattern. ** If no pattern is specified (by the s= query parameter) then the user ** is prompted to enter a search string. ** ** Query parameters: | < | 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 | ** WEBPAGE: docsrch ** ** Search for documents that match a user-supplied full-text search pattern. ** If no pattern is specified (by the s= query parameter) then the user ** is prompted to enter a search string. ** ** Query parameters: ** s=PATTERN Search for PATTERN */ void doc_search_page(void){ const int isSearch = P("s")!=0; login_check_credentials(); style_header("Document Search%s", isSearch ? " Results" : ""); search_screen(SRCH_DOC, 0); style_finish_page(); } |
Changes to src/etag.c.
︙ | ︙ | |||
250 251 252 253 254 255 256 | ** COMMAND: test-etag ** ** Usage: fossil test-etag -key KEY-NUMBER -hash HASH ** ** Generate an etag given a KEY-NUMBER and/or a HASH. ** ** KEY-NUMBER is some combination of: | < | 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | ** COMMAND: test-etag ** ** Usage: fossil test-etag -key KEY-NUMBER -hash HASH ** ** Generate an etag given a KEY-NUMBER and/or a HASH. ** ** KEY-NUMBER is some combination of: ** 1 ETAG_CONFIG The config table version number ** 2 ETAG_DATA The event table version number ** 4 ETAG_COOKIE The display cookie */ void test_etag_cmd(void){ const char *zHash = 0; const char *zKey; |
︙ | ︙ |
Changes to src/event.c.
︙ | ︙ | |||
50 51 52 53 54 55 56 | /* ** WEBPAGE: technote ** WEBPAGE: event ** ** Display a technical note (formerly called an "event"). ** ** PARAMETERS: | < | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /* ** WEBPAGE: technote ** WEBPAGE: event ** ** Display a technical note (formerly called an "event"). ** ** PARAMETERS: ** name=ID Identify the technical note to display. ID must be ** complete. ** aid=ARTIFACTID Which specific version of the tech-note. Optional. ** v=BOOLEAN Show details if TRUE. Default is FALSE. Optional. ** ** Display an existing tech-note identified by its ID, optionally at a ** specific version, and optionally with additional details. |
︙ | ︙ | |||
344 345 346 347 348 349 350 | /* ** WEBPAGE: technoteedit ** WEBPAGE: eventedit ** ** Revise or create a technical note (formerly called an "event"). ** ** Required query parameter: | < < | 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | /* ** WEBPAGE: technoteedit ** WEBPAGE: eventedit ** ** Revise or create a technical note (formerly called an "event"). ** ** Required query parameter: ** name=ID Hex hash ID of the technote. If omitted, a new ** tech-note is created. ** ** POST parameters from the "Cancel", "Preview", or "Submit" buttons: ** w=TEXT Complete text of the technote. ** t=TEXT Time of the technote on the timeline (ISO 8601) ** c=TEXT Timeline comment ** g=TEXT Tags associated with this technote ** mimetype=TEXT Mimetype for w= text ** newclr Use a background color ** clr=TEXT Background color to use if newclr |
︙ | ︙ | |||
524 525 526 527 528 529 530 | if( n<20 ) n = 20; if( n>40 ) n = 40; @ <form method="post" action="%R/technoteedit"><div> login_insert_csrf_secret(); @ <input type="hidden" name="name" value="%h(zId)" /> @ <table border="0" cellspacing="10"> | | | | | | > | | | | | > | > | | | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 | if( n<20 ) n = 20; if( n>40 ) n = 40; @ <form method="post" action="%R/technoteedit"><div> login_insert_csrf_secret(); @ <input type="hidden" name="name" value="%h(zId)" /> @ <table border="0" cellspacing="10"> @ <tr><th align="right" valign="top"><label for="t">Timestamp (UTC):</label></th> @ <td valign="top"> @ <input type="text" id="t" name="t" size="25" value="%h(zETime)" /> @ </td></tr> @ <tr><th align="right" valign="top"><label for="c">Timeline Comment:</label></th> @ <td valign="top"> @ <textarea id="c" name="c" class="technoteedit" cols="80" @ rows="3" wrap="virtual">%h(zComment)</textarea> @ </td></tr> @ <tr><th align="right" valign="top"> @ <label for='newclr'%s(zClrFlag)>Timeline Background Color:</label></th> @ <td valign="top"> @ <input type='checkbox' id='newclr'%s(zClrFlag) name='newclr'%s(zClrFlag) /> @ <label>Use custom color: \ @ <input type='color' name='clr' value='%s(zClr[0]?zClr:"#c0f0ff")'></label> @ </td></tr> @ <tr><th align="right" valign="top"><label for="g">Tags:</label></th> @ <td valign="top"> @ <input type="text" id="g" name="g" size="40" value="%h(zTags)" /> @ </td></tr> @ <tr><th align="right" valign="top">\ @ <label for="mimetype">Markup style</label> @ %z(href("%R/markup_help")) @ <span class="help-buttonlet processed" title="Help"></span></a>: @ <td valign="top"> mimetype_option_menu(zMimetype); @ </td></tr> @ <tr><th align="right" valign="top"><label for="w">Page Content:</label></th> @ <td valign="top"> @ <textarea id="w" name="w" class="technoteedit" cols="80" @ rows="%d(n)" wrap="virtual">%h(zBody)</textarea> @ </td></tr> @ <tr><td colspan="2"> @ <input type="submit" name="cancel" value="Cancel" /> @ <input type="submit" name="preview" value="Preview" /> if( P("preview") ){ |
︙ | ︙ |
Changes to src/export.c.
︙ | ︙ | |||
1814 1815 1816 1817 1818 1819 1820 | /* ** COMMAND: git* ** ** Usage: %fossil git SUBCOMMAND ** ** Do incremental import or export operations between Fossil and Git. ** Subcommands: | < < | 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 | /* ** COMMAND: git* ** ** Usage: %fossil git SUBCOMMAND ** ** Do incremental import or export operations between Fossil and Git. ** Subcommands: ** > fossil git export [MIRROR] [OPTIONS] ** Write content from the Fossil repository into the Git repository ** in directory MIRROR. The Git repository is created if it does not ** already exist. If the Git repository does already exist, then ** new content added to fossil since the previous export is appended. ** ** Repeat this command whenever new checkins are added to the Fossil ** repository in order to reflect those changes into the mirror. If |
︙ | ︙ | |||
1850 1851 1852 1853 1854 1855 1856 | ** Useful for debugging ** --mainbranch NAME Use NAME as the name of the main branch in Git. ** The "trunk" branch of the Fossil repository is ** mapped into this name. "master" is used if ** this option is omitted. ** -q|--quiet Reduce output. Repeat for even less output. ** -v|--verbose More output. | < < < < < | 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 | ** Useful for debugging ** --mainbranch NAME Use NAME as the name of the main branch in Git. ** The "trunk" branch of the Fossil repository is ** mapped into this name. "master" is used if ** this option is omitted. ** -q|--quiet Reduce output. Repeat for even less output. ** -v|--verbose More output. ** > fossil git import MIRROR ** TBD... ** > fossil git status ** Show the status of the current Git mirror, if there is one. ** -q|--quiet No output if there is nothing to report */ void gitmirror_command(void){ char *zCmd; int nCmd; if( g.argc<3 ){ usage("export ARGS..."); |
︙ | ︙ |
Changes to src/file.c.
︙ | ︙ | |||
1473 1474 1475 1476 1477 1478 1479 | ** ** Usage: %fossil test-file-environment FILENAME... ** ** Display the effective file handling subsystem "settings" and then ** display file system information about the files specified, if any. ** ** Options: | < | 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 | ** ** Usage: %fossil test-file-environment FILENAME... ** ** Display the effective file handling subsystem "settings" and then ** display file system information about the files specified, if any. ** ** Options: ** --allow-symlinks BOOLEAN Temporarily turn allow-symlinks on/off ** --open-config Open the configuration database first. ** --reset Reset cached stat() info for each file. ** --root ROOT Use ROOT as the root of the checkout ** --slash Trailing slashes, if any, are retained. */ void cmd_test_file_environment(void){ |
︙ | ︙ |
Changes to src/fileedit.c.
︙ | ︙ | |||
696 697 698 699 700 701 702 | ** ** Usage: %fossil test-ci-mini ?OPTIONS? FILENAME ** ** where FILENAME is a repo-relative name as it would appear in the ** vfile table. ** ** Options: | < | 696 697 698 699 700 701 702 703 704 705 706 707 708 709 | ** ** Usage: %fossil test-ci-mini ?OPTIONS? FILENAME ** ** where FILENAME is a repo-relative name as it would appear in the ** vfile table. ** ** Options: ** -R|--repository REPO The repository file to commit to. ** --as FILENAME The repository-side name of the input ** file, relative to the top of the ** repository. Default is the same as the ** input file name. ** -m|--comment COMMENT Required checkin comment. ** -M|--comment-file FILE Reads checkin comment from the given file. |
︙ | ︙ | |||
1536 1537 1538 1539 1540 1541 1542 | ** permissions has set the fileedit-glob setting to a list of glob ** patterns matching files which may be edited (e.g. "*.wiki,*.md"). ** Note that fileedit-glob, by design, is a local-only setting. ** It does not sync across repository clones, and must be explicitly ** set on any repositories where this page should be activated. ** ** Optional query parameters: | < | 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 | ** permissions has set the fileedit-glob setting to a list of glob ** patterns matching files which may be edited (e.g. "*.wiki,*.md"). ** Note that fileedit-glob, by design, is a local-only setting. ** It does not sync across repository clones, and must be explicitly ** set on any repositories where this page should be activated. ** ** Optional query parameters: ** filename=FILENAME Repo-relative path to the file. ** checkin=VERSION Checkin version, using any unambiguous ** symbolic version name. ** ** If passed a filename but no checkin then it will attempt to ** load that file from the most recent leaf checkin. ** |
︙ | ︙ | |||
1726 1727 1728 1729 1730 1731 1732 | 100, "100%", 100, "125%", 125, "150%", 150, "175%", 175, "200%", 200, NULL); CX("</div>"); CX("<div class='flex-container flex-column stretch'>"); CX("<textarea name='content' id='fileedit-content-editor' " | | | 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 | 100, "100%", 100, "125%", 125, "150%", 150, "175%", 175, "200%", 200, NULL); CX("</div>"); CX("<div class='flex-container flex-column stretch'>"); CX("<textarea name='content' id='fileedit-content-editor' " "class='fileedit' rows='25' aria-label='Content' title='Content'>"); CX("</textarea>"); CX("</div>"/*textarea wrapper*/); CX("</div>"/*#tab-file-content*/); } /****** Preview tab ******/ { |
︙ | ︙ | |||
1904 1905 1906 1907 1908 1909 1910 | NULL); CX("</div>"/*checkboxes*/); } { /******* Commit comment, button, and result manifest *******/ CX("<fieldset class='fileedit-options commit-message'>" | | | 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 | NULL); CX("</div>"/*checkboxes*/); } { /******* Commit comment, button, and result manifest *******/ CX("<fieldset class='fileedit-options commit-message'>" "<legend><label for='fileedit-comment'>Message (required)</label></legend><div>\n"); /* We have two comment input fields, defaulting to single-line ** mode. JS code sets up the ability to toggle between single- ** and multi-line modes. */ CX("<input type='text' name='comment' " "id='fileedit-comment'></input>"); CX("<textarea name='commentBig' class='hidden' " "rows='5' id='fileedit-comment-big'></textarea>\n"); |
︙ | ︙ |
Changes to src/finfo.c.
︙ | ︙ | |||
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 | } /* Values for the debug= query parameter to finfo */ #define FINFO_DEBUG_MLINK 0x01 /* ** WEBPAGE: finfo ** Usage: ** * /finfo?name=FILENAME ** * /finfo?name=FILENAME&ci=HASH ** ** Show the change history for a single file. The name=FILENAME query ** parameter gives the filename and is a required parameter. If the ** ci=HASH parameter is also supplied, then the FILENAME,HASH combination ** identifies a particular version of a file, and in that case all changes ** to that one file version are tracked across both edits and renames. ** If only the name=FILENAME parameter is supplied (if ci=HASH is omitted) ** then the graph shows all changes to any file while it happened ** to be called FILENAME and changes are not tracked across renames. ** ** Additional query parameters: | > < | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | } /* Values for the debug= query parameter to finfo */ #define FINFO_DEBUG_MLINK 0x01 /* ** WEBPAGE: finfo ** ** Usage: ** * /finfo?name=FILENAME ** * /finfo?name=FILENAME&ci=HASH ** ** Show the change history for a single file. The name=FILENAME query ** parameter gives the filename and is a required parameter. If the ** ci=HASH parameter is also supplied, then the FILENAME,HASH combination ** identifies a particular version of a file, and in that case all changes ** to that one file version are tracked across both edits and renames. ** If only the name=FILENAME parameter is supplied (if ci=HASH is omitted) ** then the graph shows all changes to any file while it happened ** to be called FILENAME and changes are not tracked across renames. ** ** Additional query parameters: ** a=DATETIME Only show changes after DATETIME ** b=DATETIME Only show changes before DATETIME ** ci=HASH identify a particular version of a file and then ** track changes to that file across renames ** m=HASH Mark this particular file version. ** n=NUM Show the first NUM changes only ** name=FILENAME (Required) name of file whose history to show |
︙ | ︙ |
Changes to src/forum.c.
︙ | ︙ | |||
499 500 501 502 503 504 505 | zEditorName = zPosterName; } zDate = db_text(0, "SELECT datetime(%.17g,toLocal())", p->rDate); if( p->pEditPrev ){ zPosterName = forum_post_display_name(p->pEditHead, 0); zEditorName = forum_post_display_name(p, pManifest); zHist = bHist ? "" : zQuery[0]==0 ? "?hist" : "&hist"; | | | | 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | zEditorName = zPosterName; } zDate = db_text(0, "SELECT datetime(%.17g,toLocal())", p->rDate); if( p->pEditPrev ){ zPosterName = forum_post_display_name(p->pEditHead, 0); zEditorName = forum_post_display_name(p, pManifest); zHist = bHist ? "" : zQuery[0]==0 ? "?hist" : "&hist"; @ <h2 class='forumPostHdr'>(%d(p->sid)\ @ .%0*d(fossil_num_digits(p->nEdit))(p->rev)) \ if( fossil_strcmp(zPosterName, zEditorName)==0 ){ @ By %s(zPosterName) on %h(zDate) edited from \ @ %z(href("%R/forumpost/%S?%s%s",p->pEditPrev->zUuid,zQuery,zHist))\ @ %d(p->sid).%0*d(fossil_num_digits(p->nEdit))(p->pEditPrev->rev)</a> }else{ @ Originally by %s(zPosterName) \ @ with edits by %s(zEditorName) on %h(zDate) from \ @ %z(href("%R/forumpost/%S%s%s",p->pEditPrev->zUuid,zQuery,zHist))\ @ %d(p->sid).%0*d(fossil_num_digits(p->nEdit))(p->pEditPrev->rev)</a> } }else{ zPosterName = forum_post_display_name(p, pManifest); @ <h2 class='forumPostHdr'>(%d(p->sid)) \ @ By %s(zPosterName) on %h(zDate) } fossil_free(zDate); /* If debugging is enabled, link to the artifact page. */ if( g.perm.Debug ){ |
︙ | ︙ | |||
551 552 553 554 555 556 557 | @ %z(href("%R/forumpost/%!S%s",p->zUuid,zQuery))[link]</a> } /* Provide a link to the raw source code. */ if( !bUnf ){ @ %z(href("%R/forumpost/%!S?raw",p->zUuid))[source]</a> } | | | 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 | @ %z(href("%R/forumpost/%!S%s",p->zUuid,zQuery))[link]</a> } /* Provide a link to the raw source code. */ if( !bUnf ){ @ %z(href("%R/forumpost/%!S?raw",p->zUuid))[source]</a> } @ </h2> } /* Check if this post is approved, also if it's by the current user. */ bPrivate = content_is_private(p->fpid); bSameUser = login_is_individual() && fossil_strcmp(pManifest->zUser, g.zLogin)==0; |
︙ | ︙ | |||
791 792 793 794 795 796 797 | ** ** Show a single forum posting. The posting is shown in context with ** its entire thread. The selected posting is enclosed within ** <div class='forumSel'>...</div>. Javascript is used to move the ** selected posting into view after the page loads. ** ** Query parameters: | < | 791 792 793 794 795 796 797 798 799 800 801 802 803 804 | ** ** Show a single forum posting. The posting is shown in context with ** its entire thread. The selected posting is enclosed within ** <div class='forumSel'>...</div>. Javascript is used to move the ** selected posting into view after the page loads. ** ** Query parameters: ** name=X REQUIRED. The hash of the post to display. ** t=a Automatic display mode, i.e. hierarchical for ** desktop and chronological for mobile. This is the ** default if the "t" query parameter is omitted. ** t=c Show posts in the order they were written. ** t=h Show posts using hierarchical indenting. ** t=s Show only the post specified by "name=X". |
︙ | ︙ | |||
818 819 820 821 822 823 824 | ** WEBPAGE: forumthread ** ** Show all forum messages associated with a particular message thread. ** The result is basically the same as /forumpost except that none of ** the postings in the thread are selected. ** ** Query parameters: | < | 817 818 819 820 821 822 823 824 825 826 827 828 829 830 | ** WEBPAGE: forumthread ** ** Show all forum messages associated with a particular message thread. ** The result is basically the same as /forumpost except that none of ** the postings in the thread are selected. ** ** Query parameters: ** name=X REQUIRED. The hash of any post of the thread. ** t=a Automatic display mode, i.e. hierarchical for ** desktop and chronological for mobile. This is the ** default if the "t" query parameter is omitted. ** t=c Show posts in the order they were written. ** t=h Show posts using hierarchical indenting. ** unf Show the original, unformatted source text. |
︙ | ︙ | |||
1053 1054 1055 1056 1057 1058 1059 | */ static void forum_post_widget( const char *zTitle, const char *zMimetype, const char *zContent ){ if( zTitle ){ | | | > | > | | | 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 | */ static void forum_post_widget( const char *zTitle, const char *zMimetype, const char *zContent ){ if( zTitle ){ @ <label>Title: <input type="input" name="title" value="%h(zTitle)" size="50" @ maxlength="125"></label><br> } @ <label>Markup style @ %z(href("%R/markup_help")) @ <span class="help-buttonlet processed" title="Help"></span></a>: mimetype_option_menu(zMimetype); @ </label><br><textarea aria-label="Content" title="Content" name="content" \ @ class="wikiedit" cols="80" rows="25" wrap="virtual">%h(zContent)</textarea><br> } /* ** WEBPAGE: forumnew ** WEBPAGE: forumedit ** ** Start a new thread on the forum or reply to an existing thread. |
︙ | ︙ | |||
1187 1188 1189 1190 1191 1192 1193 | style_finish_page(); } /* ** WEBPAGE: forume2 ** ** Edit an existing forum message. | < > | 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 | style_finish_page(); } /* ** WEBPAGE: forume2 ** ** Edit an existing forum message. ** ** Query parameters: ** fpid=X Hash of the post to be edited. REQUIRED */ void forumedit_page(void){ int fpid; int froot; Manifest *pPost = 0; Manifest *pRootPost = 0; |
︙ | ︙ | |||
1377 1378 1379 1380 1381 1382 1383 | ** WEBPAGE: forum ** ** The main page for the forum feature. Show a list of recent forum ** threads. Also show a search box at the top if search is enabled, ** and a button for creating a new thread, if enabled. ** ** Query parameters: | < | 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 | ** WEBPAGE: forum ** ** The main page for the forum feature. Show a list of recent forum ** threads. Also show a search box at the top if search is enabled, ** and a button for creating a new thread, if enabled. ** ** Query parameters: ** n=N The number of threads to show on each page ** x=X Skip the first X threads ** s=Y Search for term Y. */ void forum_main_page(void){ Stmt q; int iLimit, iOfst, iCnt; |
︙ | ︙ |
Changes to src/fossil.diff.js.
︙ | ︙ | |||
8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /info and similar pages. */ const D = window.fossil.dom; const addToggle = function(diffElem){ const sib = diffElem.previousElementSibling, btn = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0; if(!sib) return; D.append(sib,btn); btn.addEventListener('click', function(){ diffElem.classList.toggle('hidden'); }, false); }; document.querySelectorAll('table.diff').forEach(addToggle); }); | > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /info and similar pages. */ const D = window.fossil.dom; const addToggle = function(diffElem){ const sib = diffElem.previousElementSibling, btn = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0; if(!sib) return; D.attr(btn,'aria-label','Toggle Diff') D.attr(btn,'title','Toggle Diff') D.append(sib,btn); btn.addEventListener('click', function(){ diffElem.classList.toggle('hidden'); }, false); }; document.querySelectorAll('table.diff').forEach(addToggle); }); |
︙ | ︙ | |||
636 637 638 639 640 641 642 | */ window.fossil.onPageLoad(function(){ const SCROLL_LEN = 25; const F = window.fossil, D = F.dom, Diff = F.diff; var lastWidth; Diff.checkTableWidth = function f(force){ if(undefined === f.contentNode){ | | | 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 | */ window.fossil.onPageLoad(function(){ const SCROLL_LEN = 25; const F = window.fossil, D = F.dom, Diff = F.diff; var lastWidth; Diff.checkTableWidth = function f(force){ if(undefined === f.contentNode){ f.contentNode = document.querySelector('main.content'); } force = true; const parentCS = window.getComputedStyle(f.contentNode); const parentWidth = ( //document.body.clientWidth; //parentCS.width; f.contentNode.clientWidth |
︙ | ︙ |
Changes to src/fossil.dom.js.
︙ | ︙ | |||
260 261 262 263 264 265 266 | /** Creates and returns a FIELDSET element, optionaly with a LEGEND element added to it. If legendText is an HTMLElement then is is assumed to be a LEGEND and is appended as-is, else it is assumed (if truthy) to be a value suitable for passing to dom.append(aLegendElement,...). */ | | > | | | | > > > > > > > | | > | > > > > | > | 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 | /** Creates and returns a FIELDSET element, optionaly with a LEGEND element added to it. If legendText is an HTMLElement then is is assumed to be a LEGEND and is appended as-is, else it is assumed (if truthy) to be a value suitable for passing to dom.append(aLegendElement,...). */ dom.fieldset = function(legendText, labelFor){ const fs = this.create('fieldset'); if(legendText){ if(labelFor){ this.append( fs, (legendText instanceof HTMLElement) ? legendText : this.append(this.legend(legendText, labelFor)) ); } else { this.append( fs, (legendText instanceof HTMLElement) ? legendText : this.append(this.legend(legendText)) ); } } return fs; }; /** Returns a new LEGEND legend element. The given argument, if not falsy, is append()ed to the element (so it may be a string or DOM element. */ dom.legend = function(legendText, labelFor){ const rc = this.create('legend'); if(legendText) { if(labelFor){ legendText = this.label(labelFor,legendText) } this.append(rc, legendText); } return rc; }; /** Appends each argument after the first to the first argument (a DOM node) and returns the first argument. |
︙ | ︙ | |||
316 317 318 319 320 321 322 | || 'boolean'===typeof e || e instanceof Error) e = this.text(e); parent.appendChild(e); } return parent; }; | | > > > | > | 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 | || 'boolean'===typeof e || e instanceof Error) e = this.text(e); parent.appendChild(e); } return parent; }; dom.input = function(type, id){ if(id){ return this.attr(this.create('input'), 'type', type, 'id', id); } else { return this.attr(this.create('input'), 'type', type); } }; /** Returns a new CHECKBOX input element. Usages: ([boolean checked = false]) |
︙ | ︙ |
Changes to src/fossil.page.brlist.js.
︙ | ︙ | |||
8 9 10 11 12 13 14 | * According to MDN 'const' requires Android's WebView 37, * which may not be available. * For the time being, continueing without 'const' and 'indexOf' * (but that may be reconsidered later). */ window.addEventListener( 'load', function() { | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * According to MDN 'const' requires Android's WebView 37, * which may not be available. * For the time being, continueing without 'const' and 'indexOf' * (but that may be reconsidered later). */ window.addEventListener( 'load', function() { var submenu = document.querySelector("nav.submenu"); var anchor = document.createElement("A"); var brlistDataObj = document.getElementById("brlist-data"); var brlistDataTxt = brlistDataObj.textContent || brlistDataObj.innerText; var brlistData = JSON.parse(brlistDataTxt); anchor.classList.add("label"); anchor.classList.add("timeline-link"); anchor.href = brlistData.timelineUrl; |
︙ | ︙ |
Changes to src/fossil.page.chat.js.
︙ | ︙ | |||
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | let dbg = document.querySelector('#debugMsg'); if(dbg){ /* This can inadvertently influence our flexbox layouts, so move it out of the way. */ D.append(document.body,dbg); } })(); const ForceResizeKludge = (function(){ /* Workaround for Safari mayhem regarding use of vh CSS units.... We tried to use vh units to set the content area size for the chat layout, but Safari chokes on that, so we calculate that height here: 85% when in "normal" mode and 95% in chat-only mode. Larger than ~95% is too big for Firefox on Android, causing the input area to move off-screen. While we're here, we also use this to cap the max-height of the input field so that pasting huge text does not scroll the upper area of the input widget off-screen. */ | > > > > > > > > | | | < < < | | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | let dbg = document.querySelector('#debugMsg'); if(dbg){ /* This can inadvertently influence our flexbox layouts, so move it out of the way. */ D.append(document.body,dbg); } })(); /** Selectors for elements which are direct children of the BODY element but not part of the /chat UI. */ const selectorsOutsideChat = [ 'body > *:not(.content)' ]; const ForceResizeKludge = (function(){ /* Workaround for Safari mayhem regarding use of vh CSS units.... We tried to use vh units to set the content area size for the chat layout, but Safari chokes on that, so we calculate that height here: 85% when in "normal" mode and 95% in chat-only mode. Larger than ~95% is too big for Firefox on Android, causing the input area to move off-screen. While we're here, we also use this to cap the max-height of the input field so that pasting huge text does not scroll the upper area of the input widget off-screen. */ const elemsToCount = document.querySelectorAll( selectorsOutsideChat.join(',') ); const contentArea = E1('main.content'); const bcl = document.body.classList; const resized = function f(){ if(f.$disabled) return; const wh = window.innerHeight, com = bcl.contains('chat-only-mode'); var ht; var extra = 0; |
︙ | ︙ | |||
135 136 137 138 139 140 141 | viewMessages: E1('#chat-messages-wrapper'), btnSubmit: E1('#chat-button-submit'), btnAttach: E1('#chat-button-attach'), inputX: E1('#chat-input-field-x'), input1: E1('#chat-input-field-single'), inputM: E1('#chat-input-field-multi'), inputFile: E1('#chat-input-file'), | | | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | viewMessages: E1('#chat-messages-wrapper'), btnSubmit: E1('#chat-button-submit'), btnAttach: E1('#chat-button-attach'), inputX: E1('#chat-input-field-x'), input1: E1('#chat-input-field-single'), inputM: E1('#chat-input-field-multi'), inputFile: E1('#chat-input-file'), contentDiv: E1('main.content'), viewConfig: E1('#chat-config'), viewPreview: E1('#chat-preview'), previewContent: E1('#chat-preview-content'), btnPreview: E1('#chat-button-preview'), views: document.querySelectorAll('.chat-view'), activeUserListWrapper: E1('#chat-user-list-wrapper'), activeUserList: E1('#chat-user-list') |
︙ | ︙ | |||
320 321 322 323 324 325 326 | Enters (if passed a truthy value or no arguments) or leaves "chat-only" mode. That mode hides the page's header and footer, leaving only the chat application visible to the user. */ chatOnlyMode: function f(yes){ if(undefined === f.elemsToToggle){ | | < < < < < < < | 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 | Enters (if passed a truthy value or no arguments) or leaves "chat-only" mode. That mode hides the page's header and footer, leaving only the chat application visible to the user. */ chatOnlyMode: function f(yes){ if(undefined === f.elemsToToggle){ f.elemsToToggle = document.querySelectorAll(selectorsOutsideChat.join(',')); } if(!arguments.length) yes = true; if(yes === this.isChatOnlyMode()) return this; if(yes){ D.addClass(f.elemsToToggle, 'hidden'); D.addClass(document.body, 'chat-only-mode'); document.body.scroll(0,document.body.height); |
︙ | ︙ | |||
1722 1723 1724 1725 1726 1727 1728 | const menuEntry = D.addClass(D.div(), 'menu-entry'); if(true===indentOrIndex) D.addClass(menuEntry, 'child'); const label = op.label ? D.append(D.label(),op.label) : undefined; const labelWrapper = D.addClass(D.div(), 'label-wrapper'); var hint; if(op.hint){ | | > > | < | 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 | const menuEntry = D.addClass(D.div(), 'menu-entry'); if(true===indentOrIndex) D.addClass(menuEntry, 'child'); const label = op.label ? D.append(D.label(),op.label) : undefined; const labelWrapper = D.addClass(D.div(), 'label-wrapper'); var hint; if(op.hint){ hint = D.append(D.addClass(D.span(),'hint'),op.hint); } if(op.hasOwnProperty('select')){ const col0 = D.addClass(D.span(/*empty, but for spacing*/), 'toggle-wrapper'); D.append(menuEntry, labelWrapper, col0); D.attr(op.select,'aria-label',op.hint); D.attr(op.select,'title',op.hint); D.append(labelWrapper, op.select); if(hint) D.append(labelWrapper, hint); if(label) D.append(label); if(op.callback){ op.select.addEventListener('change', (ev)=>op.callback(ev), false); } }else if(op.hasOwnProperty('boolValue')){ if(undefined === f.$id) f.$id = 0; ++f.$id; if('string' ===typeof op.boolValue){ const key = op.boolValue; op.boolValue = ()=>Chat.settings.getBool(key); op.persistentSetting = key; } const check = op.checkbox = D.attr(D.checkbox(1, op.boolValue())); const id = 'cfgopt'+f.$id; const col0 = D.addClass(D.span(), 'toggle-wrapper'); check.checked = op.boolValue(); op.checkbox = check; D.attr(check, 'id', id); if(hint) D.attr(hint, 'for', id); D.append(menuEntry, labelWrapper, col0); |
︙ | ︙ |
Changes to src/fossil.page.fileedit.js.
︙ | ︙ | |||
390 391 392 393 394 395 396 | this.cache.branchNames = F.storage.getJSON(this.cache.branchKey, {}); const selCi = this.e.selectCi = D.addClass(D.select(), 'flex-grow'), selFiles = this.e.selectFiles = D.addClass(D.select(), 'file-list'), btnLoad = this.e.btnLoadFile = D.addClass(D.button("Load file"), "flex-shrink"), filesLabel = this.e.fileListLabel = | | | | > > | 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 | this.cache.branchNames = F.storage.getJSON(this.cache.branchKey, {}); const selCi = this.e.selectCi = D.addClass(D.select(), 'flex-grow'), selFiles = this.e.selectFiles = D.addClass(D.select(), 'file-list'), btnLoad = this.e.btnLoadFile = D.addClass(D.button("Load file"), "flex-shrink"), filesLabel = this.e.fileListLabel = D.addClass(D.label('editable-file-list'),'flex-shrink','file-list-label'), ciLabelWrapper = D.addClass( D.div(), 'flex-container','flex-row', 'flex-shrink', 'stretch', 'child-gap-small' ), btnReload = D.addClass( D.button('Reload'), 'flex-shrink' ), ciLabel = this.e.ciListLabel = D.addClass(D.label('open-leaf-list'),'flex-shrink','checkin-list-label') ; D.attr(selCi, 'id',"open-leaf-list"); D.attr(selCi, 'title',"The list of opened leaves."); D.attr(selFiles, 'title', "The list of editable files for the selected checkin."); D.attr(selFiles, 'id',"editable-file-list"); D.attr(btnLoad, 'title', "Load the selected file into the editor."); D.disable(selCi, selFiles, btnLoad); D.attr(selFiles, 'size', 12); D.append( this.e.container, ciLabel, |
︙ | ︙ | |||
470 471 472 473 474 475 476 | btnHelp = D.append( D.addClass(D.div(), "help-buttonlet"), 'Locally-edited files. Timestamps are the last local edit time. ', 'Only the ',P.config.defaultMaxStashSize,' most recent files ', 'are retained. Saving or reloading a file removes it from this list. ', D.append(D.code(),F.storage.storageImplName()), ' = ',F.storage.storageHelpDescription() | | | > | | 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 | btnHelp = D.append( D.addClass(D.div(), "help-buttonlet"), 'Locally-edited files. Timestamps are the last local edit time. ', 'Only the ',P.config.defaultMaxStashSize,' most recent files ', 'are retained. Saving or reloading a file removes it from this list. ', D.append(D.code(),F.storage.storageImplName()), ' = ',F.storage.storageHelpDescription() ), label = D.label('local-edits', "Local edits"); D.attr(sel, 'id', 'local-edits'); D.append(wrapper, label, " (", D.append(D.code(), F.storage.storageImplName()), "):", btnHelp, sel, btnClear); F.helpButtonlets.setup(btnHelp); D.option(D.disable(sel), undefined, "(empty)"); F.page.addEventListener('fileedit-stash-updated',(e)=>this.updateList(e.detail)); |
︙ | ︙ |
Changes to src/fossil.page.pikchrshow.js.
︙ | ︙ | |||
144 145 146 147 148 149 150 151 152 153 154 155 156 157 | // Set up selection list of predefined scripts... if(true){ const selectScript = P.e.selectScript = D.select(), cbAutoPreview = P.e.cbAutoPreview = D.attr(D.checkbox(true),'id', 'cb-auto-preview'), cbWrap = D.addClass(D.div(),'input-with-label') ; D.append( cbWrap, selectScript, cbAutoPreview, D.label(cbAutoPreview,"Auto-preview?"), F.helpButtonlets.create( D.append(D.div(), | > > | 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | // Set up selection list of predefined scripts... if(true){ const selectScript = P.e.selectScript = D.select(), cbAutoPreview = P.e.cbAutoPreview = D.attr(D.checkbox(true),'id', 'cb-auto-preview'), cbWrap = D.addClass(D.div(),'input-with-label') ; D.attr(selectScript, 'aria-label', 'Example Scripts'); D.attr(selectScript, 'title', 'Example Scripts'); D.append( cbWrap, selectScript, cbAutoPreview, D.label(cbAutoPreview,"Auto-preview?"), F.helpButtonlets.create( D.append(D.div(), |
︙ | ︙ |
Changes to src/fossil.page.pikchrshowasm.js.
︙ | ︙ | |||
369 370 371 372 373 374 375 376 377 378 379 380 381 382 | ); //////////////////////////////////////////////////////////// // Set up selection list of predefined scripts... if(true){ const selectScript = PS.e.selectScript = D.select(); D.append(PS.e.zoneInputButtons, selectScript); PS.predefinedPiks.forEach(function(script,ndx){ const opt = D.option(script.code ? script.code.trim() :'', script.name); D.append(selectScript, opt); if(!ndx) selectScript.selectedIndex = 0 /*timing/ordering workaround*/; if(ndx && !script.code){ /* Treat entries w/ no code as separators EXCEPT for the | > > | 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | ); //////////////////////////////////////////////////////////// // Set up selection list of predefined scripts... if(true){ const selectScript = PS.e.selectScript = D.select(); D.attr(selectScript, 'aria-label', 'Example Scripts'); D.attr(selectScript, 'title', 'Example Scripts'); D.append(PS.e.zoneInputButtons, selectScript); PS.predefinedPiks.forEach(function(script,ndx){ const opt = D.option(script.code ? script.code.trim() :'', script.name); D.append(selectScript, opt); if(!ndx) selectScript.selectedIndex = 0 /*timing/ordering workaround*/; if(ndx && !script.code){ /* Treat entries w/ no code as separators EXCEPT for the |
︙ | ︙ | |||
477 478 479 480 481 482 483 | that height here. Larger than ~95% is too big for Firefox on Android, causing the input area to move off-screen. */ const appViews = EAll('.app-view'); const elemsToCount = [ /* Elements which we need to always count in the visible body size. */ | < < | | < | < | 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 | that height here. Larger than ~95% is too big for Firefox on Android, causing the input area to move off-screen. */ const appViews = EAll('.app-view'); const elemsToCount = [ /* Elements which we need to always count in the visible body size. */ ...EAll('body > *:not(.content)') ]; const resized = function f(){ if(f.$disabled) return; const wh = window.innerHeight; let ht = wh; elemsToCount.forEach((e)=>ht -= F.dom.effectiveHeight(e)); appViews.forEach(function(e){ e.style.height = e.style.maxHeight = [ "calc(", (ht>=100 ? ht : 100), "px", " - 2em"/*fudge value*/,")" /* ^^^^ hypothetically not needed, but both Chrome/FF on Linux will force scrollbars on the |
︙ | ︙ |
Changes to src/fossil.page.wikiedit.js.
︙ | ︙ | |||
548 549 550 551 552 553 554 | init: function(parentElem){ const sel = D.select(), btn = D.addClass(D.button("Reload page list"), 'save'); this.e.select = sel; D.addClass(parentElem, 'WikiList'); D.clearElement(parentElem); D.append( parentElem, | | > | 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 | init: function(parentElem){ const sel = D.select(), btn = D.addClass(D.button("Reload page list"), 'save'); this.e.select = sel; D.addClass(parentElem, 'WikiList'); D.clearElement(parentElem); D.append( parentElem, D.append(D.fieldset("Select a page to edit", 'select-page'), sel) ); D.attr(sel, 'size', 12); D.attr(sel, 'id', 'select-page'); D.option(D.disable(D.clearElement(sel)), undefined, "Loading..."); /** Set up filter checkboxes for the various types of wiki pages... */ const fsFilter = D.addClass(D.fieldset("Page types"),"page-types-list"), fsFilterBody = D.div(), filters = ['normal', 'branch/...', 'tag/...', 'checkin/...'] |
︙ | ︙ | |||
625 626 627 628 629 630 631 | D.append( fsLegendBody, D.append(D.span(), getEditMarker(getEditMarker.NEW,false)," = new/unsaved"), D.append(D.span(), getEditMarker(getEditMarker.MODIFIED,false)," = has local edits"), D.append(D.span(), getEditMarker(getEditMarker.DELETED,false)," = is empty (deleted)") ); | | | | 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 | D.append( fsLegendBody, D.append(D.span(), getEditMarker(getEditMarker.NEW,false)," = new/unsaved"), D.append(D.span(), getEditMarker(getEditMarker.MODIFIED,false)," = has local edits"), D.append(D.span(), getEditMarker(getEditMarker.DELETED,false)," = is empty (deleted)") ); const fsNewPage = D.fieldset("Create new page", 'new-page'), fsNewPageBody = D.div(), newPageName = D.input('text', 'new-page'), newPageBtn = D.button("Add page locally") ; D.append(parentElem, fsNewPage); D.append(fsNewPage, fsNewPageBody); D.addClass(fsNewPageBody, 'flex-container', 'flex-column', 'new-page'); D.append( fsNewPageBody, newPageName, newPageBtn, |
︙ | ︙ | |||
695 696 697 698 699 700 701 | btnHelp = D.append( D.addClass(D.div(), "help-buttonlet"), 'Locally-edited wiki pages. Timestamps are the last local edit time. ', 'Only the ',P.config.defaultMaxStashSize,' most recent pages ', 'are retained. Saving or reloading a file removes it from this list. ', D.append(D.code(),F.storage.storageImplName()), ' = ',F.storage.storageHelpDescription() | | > > | | 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 | btnHelp = D.append( D.addClass(D.div(), "help-buttonlet"), 'Locally-edited wiki pages. Timestamps are the last local edit time. ', 'Only the ',P.config.defaultMaxStashSize,' most recent pages ', 'are retained. Saving or reloading a file removes it from this list. ', D.append(D.code(),F.storage.storageImplName()), ' = ',F.storage.storageHelpDescription() ), label = D.label('local-edits', "Local edits"); D.attr(sel, 'id', 'local-edits'); D.append(wrapper, label, " (", D.append(D.code(), F.storage.storageImplName()), "):", btnHelp, sel, btnClear); F.helpButtonlets.setup(btnHelp); D.option(D.disable(sel), undefined, "(empty)"); P.addEventListener('wiki-stash-updated',(e)=>this.updateList(e.detail)); |
︙ | ︙ |
Changes to src/hbmenu.js.
︙ | ︙ | |||
22 23 24 25 26 27 28 | ** using the "builtin_request_js" TH1 command. ** ** Operation: ** ** This script request that the HTML contain two elements: ** ** <a id="hbbtn"> <--- The hamburger menu button | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | ** using the "builtin_request_js" TH1 command. ** ** Operation: ** ** This script request that the HTML contain two elements: ** ** <a id="hbbtn"> <--- The hamburger menu button ** <nav id="hbdrop"> <--- Container for the hamburger menu ** ** Bindings are made on hbbtn so that when it is clicked, the following ** happens: ** ** 1. An XHR is made to /sitemap?popup to fetch the HTML for the ** popup menu. ** |
︙ | ︙ |
Changes to src/hname.c.
︙ | ︙ | |||
232 233 234 235 236 237 238 | /* ** COMMAND: hash-policy* ** ** Usage: fossil hash-policy ?NEW-POLICY? ** ** Query or set the hash policy for the current repository. Available hash ** policies are as follows: | < < < < < | 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | /* ** COMMAND: hash-policy* ** ** Usage: fossil hash-policy ?NEW-POLICY? ** ** Query or set the hash policy for the current repository. Available hash ** policies are as follows: ** sha1 New artifact names are created using SHA1 ** auto New artifact names are created using SHA1, but ** automatically change the policy to "sha3" when ** any SHA3 artifact enters the repository. ** sha3 New artifact names are created using SHA3, but ** older artifacts with SHA1 names may be reused. ** sha3-only Use only SHA3 artifact names. Do not reuse legacy ** SHA1 names. ** shun-sha1 Shun any SHA1 artifacts received by sync operations ** other than clones. Older legacy SHA1 artifacts are ** allowed during a clone. ** ** The default hash policy for existing repositories is "auto", which will ** immediately promote to "sha3" if the repository contains one or more ** artifacts with SHA3 names. The default hash policy for new repositories |
︙ | ︙ |
Changes to src/hook.c.
︙ | ︙ | |||
195 196 197 198 199 200 201 | /* ** COMMAND: hook* ** ** Usage: %fossil hook COMMAND ... ** ** Commands include: | < < < < < < < < < < < < < > < | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | /* ** COMMAND: hook* ** ** Usage: %fossil hook COMMAND ... ** ** Commands include: ** > fossil hook add --command COMMAND --type TYPE --sequence NUMBER ** Create a new hook. The --command and --type arguments are ** required. --sequence is optional. ** > fossil hook delete ID ... ** Delete one or more hooks by their IDs. ID can be "all" ** to delete all hooks. Caution: There is no "undo" for ** this operation. Deleted hooks are permanently lost. ** > fossil hook edit --command COMMAND --type TYPE --sequence NUMBER ID ... ** Make changes to one or more existing hooks. The ID argument ** is either a hook-id, or a list of hook-ids, or the keyword ** "all". For example, to disable hook number 2, use: ** ** fossil hook edit --type disabled 2 ** > fossil hook list ** Show all current hooks ** > fossil hook status ** Print the values of CONFIG table entries that are relevant to ** hook processing. Used for debugging. ** > fossil hook test [OPTIONS] ID ** Run the hook script given by ID for testing purposes. ** ** Options: ** --dry-run Print the script on stdout rather than run it ** --base-rcvid N Pretend that the hook-last-rcvid value is N ** --new-rcvid M Pretend that the last rcvid valud is M ** --aux-file NAME NAME is substituted for %A in the script ** The --base-rcvid and --new-rcvid options are silently ignored if ** the hook type is not "after-receive". The default values for ** --base-rcvid and --new-rcvid cause the last receive to be processed. */ void hook_cmd(void){ const char *zCmd; int nCmd; |
︙ | ︙ |
Changes to src/http.c.
︙ | ︙ | |||
538 539 540 541 542 543 544 | ** ** If a second filename (OUTPUT) is given after PAYLOAD, then the reply ** is written into that second file instead of being written on standard ** output. Use the "--out OUTPUT" option to specify an output file for ** a GET request where there is no PAYLOAD. ** ** Options: | < | 538 539 540 541 542 543 544 545 546 547 548 549 550 551 | ** ** If a second filename (OUTPUT) is given after PAYLOAD, then the reply ** is written into that second file instead of being written on standard ** output. Use the "--out OUTPUT" option to specify an output file for ** a GET request where there is no PAYLOAD. ** ** Options: ** --compress Use ZLIB compression on the payload ** --mimetype TYPE Mimetype of the payload ** --out FILE Store the reply in FILE ** -v Verbose output ** --xfer PAYLOAD in a Fossil xfer protocol message */ void test_httpmsg_command(void){ |
︙ | ︙ |
Changes to src/http_ssl.c.
︙ | ︙ | |||
903 904 905 906 907 908 909 | ** Usage: %fossil ssl-config [SUBCOMMAND] [OPTIONS...] [ARGS...] ** ** This command is used to view or modify the TLS (Transport Layer ** Security) configuration for Fossil. TLS (formerly SSL) is the ** encryption technology used for secure HTTPS transport. ** ** Sub-commands: | < < < | 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 | ** Usage: %fossil ssl-config [SUBCOMMAND] [OPTIONS...] [ARGS...] ** ** This command is used to view or modify the TLS (Transport Layer ** Security) configuration for Fossil. TLS (formerly SSL) is the ** encryption technology used for secure HTTPS transport. ** ** Sub-commands: ** remove-exception DOMAINS Remove TLS cert exceptions for the domains ** listed. Or remove them all if the --all ** option is specified. ** scrub ?--force? Remove all SSL configuration data from the ** repository. Use --force to omit the ** confirmation. ** show ?-v? Show the TLS configuration. Add -v to see ** additional explaination */ void test_tlsconfig_info(void){ const char *zCmd; size_t nCmd; int nHit = 0; |
︙ | ︙ |
Changes to src/import.c.
︙ | ︙ | |||
1659 1660 1661 1662 1663 1664 1665 | ** ** Read interchange format generated by another VCS and use it to ** construct a new Fossil repository named by the NEW-REPOSITORY ** argument. If no input file is supplied the interchange format ** data is read from standard input. ** ** The following formats are currently understood by this command | < > < > < | 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 | ** ** Read interchange format generated by another VCS and use it to ** construct a new Fossil repository named by the NEW-REPOSITORY ** argument. If no input file is supplied the interchange format ** data is read from standard input. ** ** The following formats are currently understood by this command ** --git Import from the git-fast-export file format (default) ** ** Options: ** --import-marks FILE Restore marks table from FILE ** --export-marks FILE Save marks table to FILE ** --rename-master NAME Renames the master branch to NAME ** --use-author Uses author as the committer ** --attribute "EMAIL USER" Attribute commits to USER ** instead of Git committer EMAIL address ** --svn Import from the svnadmin-dump file format. The default ** behaviour (unless overridden by --flat) is to treat 3 ** folders in the SVN root as special, following the ** common layout of SVN repositories. These are (by ** default) trunk/, branches/ and tags/. The SVN --deltas ** format is supported but not required. ** ** Options: ** --trunk FOLDER Name of trunk folder ** --branches FOLDER Name of branches folder ** --tags FOLDER Name of tags folder ** --base PATH Path to project root in repository ** --flat The whole dump is a single branch ** --rev-tags Tag each revision, implied by -i ** --no-rev-tags Disables tagging effect of -i ** --rename-rev PAT Rev tag names, default "svn-rev-%" ** --ignore-tree DIR Ignores subtree rooted at DIR ** Common Options: ** -i|--incremental allow importing into an existing repository ** -f|--force overwrite repository if already exists ** -q|--quiet omit progress output ** --no-rebuild skip the "rebuilding metadata" step ** --no-vacuum skip the final VACUUM of the database file ** --rename-trunk NAME use NAME as name of imported trunk branch |
︙ | ︙ |
Changes to src/info.c.
︙ | ︙ | |||
185 186 187 188 189 190 191 | ** to access the repository. The --verbose is (currently) a no-op if ** the argument is the name of an object within the repository. ** ** Use the "finfo" command to get information about a specific ** file in a checkout. ** ** Options: | < | 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | ** to access the repository. The --verbose is (currently) a no-op if ** the argument is the name of an object within the repository. ** ** Use the "finfo" command to get information about a specific ** file in a checkout. ** ** Options: ** -R|--repository REPO Extract info from repository REPO ** -v|--verbose Show extra information about repositories ** ** See also: [[annotate]], [[artifact]], [[finfo]], [[timeline]] */ void info_cmd(void){ i64 fsize; |
︙ | ︙ | |||
1152 1153 1154 1155 1156 1157 1158 | ** WEBPAGE: vdiff ** URL: /vdiff?from=TAG&to=TAG ** ** Show the difference between two check-ins identified by the from= and ** to= query parameters. ** ** Query parameters: | < | 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 | ** WEBPAGE: vdiff ** URL: /vdiff?from=TAG&to=TAG ** ** Show the difference between two check-ins identified by the from= and ** to= query parameters. ** ** Query parameters: ** from=TAG Left side of the comparison ** to=TAG Right side of the comparison ** branch=TAG Show all changes on a particular branch ** diff=INTEGER 0: none, 1: unified, 2: side-by-side ** glob=STRING only diff files matching this glob ** dc=N show N lines of context around each diff ** w=BOOLEAN ignore whitespace when computing diffs |
︙ | ︙ | |||
1654 1655 1656 1657 1658 1659 1660 | /* ** SETTING: preferred-diff-type width=16 default=0 ** ** The preferred-diff-type setting determines the preferred diff format ** for web pages if the format is not otherwise specified, for example ** by a query parameter or cookie. Allowed values: | < | 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 | /* ** SETTING: preferred-diff-type width=16 default=0 ** ** The preferred-diff-type setting determines the preferred diff format ** for web pages if the format is not otherwise specified, for example ** by a query parameter or cookie. Allowed values: ** 1 Unified diff ** 2 Side-by-side diff ** ** If this setting is omitted or has a value of 0 or less, then it ** is ignored. */ /* |
︙ | ︙ | |||
1705 1706 1707 1708 1709 1710 1711 | ** ** If the "from" and "to" query parameters are both present, then they are ** the names of two files within the check-in "ci" that are diffed. If the ** "ci" parameter is omitted, then the most recent check-in ("tip") is ** used. ** ** Additional parameters: | < | 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 | ** ** If the "from" and "to" query parameters are both present, then they are ** the names of two files within the check-in "ci" that are diffed. If the ** "ci" parameter is omitted, then the most recent check-in ("tip") is ** used. ** ** Additional parameters: ** dc=N Show N lines of context around each diff ** patch Use the patch diff format ** regex=REGEX Only show differences that match REGEX ** sbs=BOOLEAN Turn side-by-side diffs on and off (default: on) ** verbose=BOOLEAN Show more detail when describing artifacts ** w=BOOLEAN Ignore whitespace */ |
︙ | ︙ | |||
1832 1833 1834 1835 1836 1837 1838 | /* ** WEBPAGE: raw ** URL: /raw/ARTIFACTID ** URL: /raw?ci=BRANCH&filename=NAME ** ** Additional query parameters: | < | 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 | /* ** WEBPAGE: raw ** URL: /raw/ARTIFACTID ** URL: /raw?ci=BRANCH&filename=NAME ** ** Additional query parameters: ** m=MIMETYPE The mimetype is MIMETYPE ** at=FILENAME Content-disposition; attachment; filename=FILENAME; ** ** Return the uninterpreted content of an artifact. Used primarily ** to view artifacts that are images. */ void rawartifact_page(void){ |
︙ | ︙ | |||
2091 2092 2093 2094 2095 2096 2097 | ** WEBPAGE: hexdump ** URL: /hexdump?name=ARTIFACTID ** ** Show the complete content of a file identified by ARTIFACTID ** as preformatted text. ** ** Other parameters: | < | 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 | ** WEBPAGE: hexdump ** URL: /hexdump?name=ARTIFACTID ** ** Show the complete content of a file identified by ARTIFACTID ** as preformatted text. ** ** Other parameters: ** verbose Show more detail when describing the object */ void hexdump_page(void){ int rid; Blob content; Blob downloadName; char *zUuid; |
︙ | ︙ | |||
2356 2357 2358 2359 2360 2361 2362 | ** Typical usage: ** ** /artifact/HASH ** /whatis/HASH ** /file/NAME ** ** Additional query parameters: | < | | | | | | | | | | | | | 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 | ** Typical usage: ** ** /artifact/HASH ** /whatis/HASH ** /file/NAME ** ** Additional query parameters: ** ln show line numbers ** ln=N highlight line number N ** ln=M-N highlight lines M through N inclusive ** ln=M-N+Y-Z highlight lines M through N and Y through Z (inclusive) ** verbose show more detail in the description ** download redirect to the download (artifact page only) ** name=NAME filename or hash as a query parameter ** filename=NAME alternative spelling for "name=" ** fn=NAME alternative spelling for "name=" ** ci=VERSION The specific check-in to use with "name=" to ** identify the file. ** txt Force display of unformatted source text ** ** The /artifact page show the complete content of a file ** identified by HASH. The /whatis page shows only a description ** of how the artifact is used. The /file page shows the most recent ** version of the file or directory called NAME, or a list of the ** top-level directory if NAME is omitted. ** |
︙ | ︙ | |||
3103 3104 3105 3106 3107 3108 3109 | ** WEBPAGE: ci_edit ** ** Edit a check-in. (Check-ins are immutable and do not really change. ** This page really creates supplemental tags that affect the display ** of the check-in.) ** ** Query parameters: | < < < | 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 | ** WEBPAGE: ci_edit ** ** Edit a check-in. (Check-ins are immutable and do not really change. ** This page really creates supplemental tags that affect the display ** of the check-in.) ** ** Query parameters: ** rid=INTEGER Record ID of the check-in to edit (REQUIRED) ** ** POST parameters after pressing "Preview", "Cancel", or "Apply": ** c=TEXT New check-in comment ** u=TEXT New user name ** newclr Apply a background color ** clr=TEXT New background color (only if newclr) ** pclr Propagate new background color (only if newclr) ** dt=TEXT New check-in date/time (ISO8610 format) ** newtag Add a new tag to the check-in ** tagname=TEXT Name of the new tag to be added (only if newtag) ** newbr Put the check-in on a new branch ** brname=TEXT Name of the new branch (only if newbr) ** close Close this check-in ** hide Hide this check-in ** cNNN Cancel tag with tagid=NNN ** cancel Cancel the edit. Return to the check-in view ** preview Show a preview of the edited check-in comment ** apply Apply changes */ void ci_edit_page(void){ int rid; const char *zComment; /* Current comment on the check-in */ |
︙ | ︙ | |||
3278 3279 3280 3281 3282 3283 3284 | @ <p>Make changes to attributes of check-in @ [%z(href("%R/ci/%!S",zUuid))%s(zUuid)</a>]:</p> form_begin(0, "%R/ci_edit"); login_insert_csrf_secret(); @ <div><input type="hidden" name="r" value="%s(zUuid)" /> @ <table border="0" cellspacing="10"> | | | | | | | | > | | 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 | @ <p>Make changes to attributes of check-in @ [%z(href("%R/ci/%!S",zUuid))%s(zUuid)</a>]:</p> form_begin(0, "%R/ci_edit"); login_insert_csrf_secret(); @ <div><input type="hidden" name="r" value="%s(zUuid)" /> @ <table border="0" cellspacing="10"> @ <tr><th align="right" valign="top"><label for="u">User:</label></th> @ <td valign="top"> @ <input type="text" id="u" name="u" size="20" value="%h(zNewUser)" /> @ </td></tr> @ <tr><th align="right" valign="top"><label for="c">Comment:</label></th> @ <td valign="top"> @ <textarea id="c" name="c" rows="10" cols="80">%h(zNewComment)</textarea> @ </td></tr> @ <tr><th align="right" valign="top"><label for="dt">Check-in Time:</label></th> @ <td valign="top"> @ <input type="text" id="dt" name="dt" size="20" value="%h(zNewDate)" /> @ </td></tr> if( zChngTime ){ @ <tr><th align="right" valign="top"> @ <label for="chngtime">Timestamp of this change:</label></th> @ <td valign="top"> @ <input type="text" id="chngtime" name="chngtime" size="20" value="%h(zChngTime)" /> @ </td></tr> } @ <tr><th align="right" valign="top">Background Color:</th> @ <td valign="top"> @ <div><label><input type='checkbox' name='newclr'%s(zNewColorFlag) /> @ Change background color: \ |
︙ | ︙ | |||
3323 3324 3325 3326 3327 3328 3329 | @ colors automatically so that it can take the skin's @ preferences into account.</div> @ </td></tr> @ <tr><th align="right" valign="top">Tags:</th> @ <td valign="top"> @ <label><input type="checkbox" id="newtag" name="newtag"%s(zNewTagFlag) /> | | | | 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 | @ colors automatically so that it can take the skin's @ preferences into account.</div> @ </td></tr> @ <tr><th align="right" valign="top">Tags:</th> @ <td valign="top"> @ <label><input type="checkbox" id="newtag" name="newtag"%s(zNewTagFlag) /> @ Add the following</label> <label>new tag name to this check-in: @ <input type="text" size='15' name="tagname" value="%h(zNewTag)" \ @ id='tagname' /></label> zBranchName = db_text(0, "SELECT value FROM tagxref, tag" " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid" " AND tagxref.tagid=%d", rid, TAG_BRANCH); db_prepare(&q, "SELECT tag.tagid, tagname, tagxref.value FROM tagxref, tag" " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid" " ORDER BY CASE WHEN tagname GLOB 'sym-*' THEN substr(tagname,5)" |
︙ | ︙ | |||
3378 3379 3380 3381 3382 3383 3384 | if( !zNewBranch || !zNewBranch[0]){ zNewBranch = zBranchName; } @ <tr><th align="right" valign="top">Branching:</th> @ <td valign="top"> @ <label><input id="newbr" type="checkbox" name="newbr" \ @ data-branch='%h(zBranchName)'%s(zNewBrFlag) /> | | | | 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 | if( !zNewBranch || !zNewBranch[0]){ zNewBranch = zBranchName; } @ <tr><th align="right" valign="top">Branching:</th> @ <td valign="top"> @ <label><input id="newbr" type="checkbox" name="newbr" \ @ data-branch='%h(zBranchName)'%s(zNewBrFlag) /> @ Make this check-in the start of a</label> <label>new branch named: @ <input id="brname" type="text" style="width:15;" name="brname" \ @ value="%h(zNewBranch)" /></label></td></tr> if( !fHasHidden ){ @ <tr><th align="right" valign="top">Branch Hiding:</th> @ <td valign="top"> @ <label><input type="checkbox" id="hidebr" name="hide"%s(zHideFlag) /> @ Hide branch @ <span style="font-weight:bold" id="hbranch">%h(zBranchName)</span> @ from the timeline starting from this check-in</label> |
︙ | ︙ | |||
3469 3470 3471 3472 3473 3474 3475 | ** COMMAND: amend ** ** Usage: %fossil amend HASH OPTION ?OPTION ...? ** ** Amend the tags on check-in HASH to change how it displays in the timeline. ** ** Options: | < | 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 | ** COMMAND: amend ** ** Usage: %fossil amend HASH OPTION ?OPTION ...? ** ** Amend the tags on check-in HASH to change how it displays in the timeline. ** ** Options: ** --author USER Make USER the author for check-in ** -m|--comment COMMENT Make COMMENT the check-in comment ** -M|--message-file FILE Read the amended comment from FILE ** -e|--edit-comment Launch editor to revise comment ** --date DATETIME Make DATETIME the check-in time ** --bgcolor COLOR Apply COLOR to this check-in ** --branchcolor COLOR Apply and propagate COLOR to the branch |
︙ | ︙ | |||
3811 3812 3813 3814 3815 3816 3817 | ** If no VERSION is provided, describe the current checked-out version. ** ** If VERSION and the found ancestor refer to the same commit, the last two ** components are omitted, unless --long is provided. When no fitting tagged ** ancestor is found, show only the short hash of VERSION. ** ** Options: | < | 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 | ** If no VERSION is provided, describe the current checked-out version. ** ** If VERSION and the found ancestor refer to the same commit, the last two ** components are omitted, unless --long is provided. When no fitting tagged ** ancestor is found, show only the short hash of VERSION. ** ** Options: ** --digits Display so many hex digits of the hash ** (default: the larger of 6 and the 'hash-digit' setting) ** -d|--dirty Show whether there are changes to be committed ** --long Always show all three components ** --match GLOB Consider only non-propagating tags matching GLOB */ void describe_cmd(void){ |
︙ | ︙ |
Changes to src/interwiki.c.
︙ | ︙ | |||
158 159 160 161 162 163 164 | /* ** COMMAND: interwiki* ** ** Usage: %fossil interwiki COMMAND ... ** ** Manage the "intermap" that defines the mapping from interwiki tags ** to complete URLs for interwiki links. | < < < < < < | 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | /* ** COMMAND: interwiki* ** ** Usage: %fossil interwiki COMMAND ... ** ** Manage the "intermap" that defines the mapping from interwiki tags ** to complete URLs for interwiki links. ** > fossil interwiki delete TAG ... ** Delete one or more interwiki maps. ** > fossil interwiki edit TAG --base URL --hash PATH --wiki PATH ** Create an interwiki referenced call TAG. The base URL is ** the --base option, which is required. The --hash and --wiki ** paths are optional. The TAG must be lower-case alphanumeric ** and must be unique. A new entry is created if it does not ** already exit. ** > fossil interwiki list ** Show all interwiki mappings. */ void interwiki_cmd(void){ const char *zCmd; int nCmd; db_find_and_open_repository(0, 0); if( g.argc<3 ){ |
︙ | ︙ | |||
395 396 397 398 399 400 401 | @ tag field but leave the "Base URL" field blank.</p> if( zErr ){ @ <p class="error">%h(zErr)</p> } @ <form method="POST" action="%R/intermap"> login_insert_csrf_secret(); @ <table border="0"> | | | | | | | | | | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 | @ tag field but leave the "Base URL" field blank.</p> if( zErr ){ @ <p class="error">%h(zErr)</p> } @ <form method="POST" action="%R/intermap"> login_insert_csrf_secret(); @ <table border="0"> @ <tr><td class="form_label"><label for="tag">Tag:</label></td> @ <td><input type="text" id="tag" name="tag" \ @ size="15" value="%h(zTag)"></td></tr> @ <tr><td class="form_label"><label for="base">Base URL:</label></td> @ <td><input type="text" id="base" name="base" \ @ size="70" value="%h(zBase)"></td></tr> @ <tr><td class="form_label"><label for="hash">Hash-path:</label></td> @ <td><input type="text" id="hash" name="hash" \ @ size="20" value="%h(zHash)"> @ (use "<tt>/info/</tt>" when the target is Fossil)</td></tr> @ <tr><td class="form_label"><label for="wiki">Wiki-path:</label></td> @ <td><input type="text" id="wiki" name="wiki" \ @ size="20" value="%h(zWiki)"> @ (use "<tt>/wiki?name=</tt>" when the target is Fossil)</td></tr> @ <tr><td></td> @ <td><input type="submit" name="submit" value="Apply Changes"></td></tr> @ </table> @ </form> style_finish_page(); } |
Changes to src/login.c.
︙ | ︙ | |||
532 533 534 535 536 537 538 | ** removed. Use this page as a placeholder in older installations. ** ** WEBPAGE: login ** WEBPAGE: logout ** WEBPAGE: my ** ** The login/logout page. Parameters: | < | 532 533 534 535 536 537 538 539 540 541 542 543 544 545 | ** removed. Use this page as a placeholder in older installations. ** ** WEBPAGE: login ** WEBPAGE: logout ** WEBPAGE: my ** ** The login/logout page. Parameters: ** g=URL Jump back to this URL after login completes ** anon The g=URL is not accessible by "nobody" but is ** accessible by "anonymous" */ void login_page(void){ const char *zUsername, *zPasswd; const char *zNew1, *zNew2; |
︙ | ︙ | |||
734 735 736 737 738 739 740 | if( !g.sslNotAvailable ){ @ Consider logging in at @ <a href='%s(g.zHttpsURL)'>%h(g.zHttpsURL)</a> instead. } @ </span></td></tr> } @ <tr> | | | | | | 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 | if( !g.sslNotAvailable ){ @ Consider logging in at @ <a href='%s(g.zHttpsURL)'>%h(g.zHttpsURL)</a> instead. } @ </span></td></tr> } @ <tr> @ <td class="form_label" id="userlabel1"><label for="u">User ID:</label></td> @ <td><input type="text" id="u" id="u" name="u" \ @ size="30" value="%s(anonFlag?"anonymous":"")"></td> @ </tr> @ <tr> @ <td class="form_label" id="pswdlabel"><label for="p">Password:</label></td> @ <td><input type="password" id="p" \ @ name="p" value="" size="30" />\ if( zAnonPw && !noAnon ){ captcha_speakit_button(uSeed, "Speak password for \"anonymous\""); } @ </td> @ </tr> @ <tr> |
︙ | ︙ | |||
803 804 805 806 807 808 809 | } if( g.perm.Password ){ char *zRPW = fossil_random_password(12); @ <hr> @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p> form_begin(0, "%R/login"); @ <table> | | | | | | > | | 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 | } if( g.perm.Password ){ char *zRPW = fossil_random_password(12); @ <hr> @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p> form_begin(0, "%R/login"); @ <table> @ <tr><td class="form_label" id="oldpw"><label for="p">Old Password:</label></td> @ <td><input type="password" id="p" name="p" \ @ size="30"/></td></tr> @ <tr><td class="form_label" id="newpw"><label for="n1">New Password:</label></td> @ <td><input type="password" id="n1" name="n1" \ @ size="30" /> Suggestion: %z(zRPW)</td></tr> @ <tr><td class="form_label" id="reppw"> @ <label for="n2">Repeat New Password:</label></td> @ <td><input type="password" id="n2" name="n2" \ @ size="30" /></td></tr> @ <tr><td></td> @ <td><input type="submit" value="Change Password" /></td></tr> @ </table> @ </form> } } |
︙ | ︙ | |||
1779 1780 1781 1782 1783 1784 1785 | form_begin(0, "%R/register"); if( P("g") ){ @ <input type="hidden" name="g" value="%h(P("g"))" /> } @ <p><input type="hidden" name="captchaseed" value="%u(uSeed)" /> @ <table class="login_out"> @ <tr> | | | | > | | > | | > | | | | | | | | 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 | form_begin(0, "%R/register"); if( P("g") ){ @ <input type="hidden" name="g" value="%h(P("g"))" /> } @ <p><input type="hidden" name="captchaseed" value="%u(uSeed)" /> @ <table class="login_out"> @ <tr> @ <td class="form_label" align="right" id="uid"><label for="u">User ID:</label></td> @ <td><input type="text" id="u" name="u" \ @ value="%h(zUserID)" size="30"></td> @ if( iErrLine==1 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ <tr> @ <td class="form_label" align="right" id="dpyname"> @ <label for="dn">Display Name:</label></td> @ <td><input type="text" id="dn" name="dn" \ @ value="%h(zDName)" size="30"></td> @ </tr> if( iErrLine==2 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ </tr> @ <tr> @ <td class="form_label" align="right" id="emaddr"> @ <label for="ea">Email Address:</label></td> @ <td><input type="text" id="ea" name="ea" \ @ value="%h(zEAddr)" size="30"></td> @ </tr> if( iErrLine==3 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } if( canDoAlerts ){ int a = atoi(PD("alerts","1")); @ <tr> @ <td class="form_label" align="right" id="emalrt"> @ <label for="alerts">Email Alerts?</label></td> @ <td><select size='1' id='alerts' name='alerts'> @ <option value="1" %s(a?"selected":"")>Yes</option> @ <option value="0" %s(!a?"selected":"")>No</option> @ </select></td></tr> } @ <tr> @ <td class="form_label" align="right" id="pswd"><label for="p">Password:</label></td> @ <td><input type="password" id="p" name="p" \ @ value="%h(zPasswd)" size="30"> \ if( zPasswd[0]==0 ){ char *zRPW = fossil_random_password(12); @ Password suggestion: %z(zRPW)</td> }else{ @ </td> } @ <tr> if( iErrLine==4 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ <tr> @ <td class="form_label" align="right" id="pwcfrm"><label for="cp">Confirm:</label></td> @ <td><input type="password" id="cp" name="cp" \ @ value="%h(zConfirm)" size="30"></td> @ </tr> if( iErrLine==5 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } @ <tr> @ <td class="form_label" align="right" id="cptcha"><label for="captcha">Captcha:</label></td> @ <td><input type="text" id="captcha" name="captcha" \ @ value="%h(captchaIsCorrect?zDecoded:"")" size="30"> captcha_speakit_button(uSeed, "Speak the captcha text"); @ </td> @ </tr> if( iErrLine==6 ){ @ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr> } |
︙ | ︙ | |||
2120 2121 2122 2123 2124 2125 2126 | /* ** COMMAND: login-group* ** ** Usage: %fossil login-group ?SUBCOMMAND? ?OPTIONS? ** ** Run various subcommands to manage login-group related settings of the open ** repository or of the repository identified by the -R or --repository option. | < < < < < < < | 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 | /* ** COMMAND: login-group* ** ** Usage: %fossil login-group ?SUBCOMMAND? ?OPTIONS? ** ** Run various subcommands to manage login-group related settings of the open ** repository or of the repository identified by the -R or --repository option. ** > fossil login-group ?-R REPO? ** Show the login-group to which REPO, or if invoked from within a checkout ** the repository on which the current checkout is based, belongs. ** > fossil login-group join ?-R? REPO ?--name NAME? ** This subcommand must be invoked from within a checkout to either: add ** the open repository to the login group that REPO is a member, in which ** case the optional "--name" argument is not required; or create a new ** login group between the open repository and REPO, in which case the new ** group NAME is determined by the mandatory "--name" option. REPO may be ** specified with or without the -R flag. ** > fossil login-group leave ?-R REPO? ** Take the repository REPO, or if invoked from within a checkout the ** repository on which the current checkout is based, out of whatever ** login group it is a member. ** About Login Groups: ** ** A login-group is a set of repositories that share user credentials. ** If a user is logged into one member of the group, then that user can ** access any other group member as long as they have an entry in the USER ** table of that member. If a user changes their password using web ** interface, their password is also automatically changed in every other |
︙ | ︙ |
Changes to src/main.c.
︙ | ︙ | |||
1322 1323 1324 1325 1326 1327 1328 | /* ** WEBPAGE: version ** ** Show the version information for Fossil. ** ** Query parameters: | < | 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 | /* ** WEBPAGE: version ** ** Show the version information for Fossil. ** ** Query parameters: ** verbose Show details */ void test_version_page(void){ Blob versionInfo; int verboseFlag; login_check_credentials(); |
︙ | ︙ | |||
2222 2223 2224 2225 2226 2227 2228 | ** ** The command name, "cgi", may be omitted if the GATEWAY_INTERFACE ** environment variable is set to "CGI", which should always be the ** case for CGI scripts run by a webserver. Fossil ignores any lines ** that begin with "#". ** ** The following control lines are recognized: | < < < < < < < < < < < < < < < < | 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 | ** ** The command name, "cgi", may be omitted if the GATEWAY_INTERFACE ** environment variable is set to "CGI", which should always be the ** case for CGI scripts run by a webserver. Fossil ignores any lines ** that begin with "#". ** ** The following control lines are recognized: ** repository: PATH Name of the Fossil repository ** directory: PATH Name of a directory containing many Fossil ** repositories whose names all end with ".fossil". ** There should only be one of "repository:" ** or "directory:" ** notfound: URL When in "directory:" mode, redirect to ** URL if no suitable repository is found. ** repolist When in "directory:" mode, display a page ** showing a list of available repositories if ** the URL is "/". ** localauth Grant administrator privileges to connections ** from 127.0.0.1 or ::1. ** skin: LABEL Use the built-in skin called LABEL rather than ** the default. If there are no skins called LABEL ** then this line is a no-op. ** files: GLOBLIST GLOBLIST is a comma-separated list of GLOB ** patterns that specify files that can be ** returned verbatim. This feature allows Fossil ** to act as a web server returning static ** content. ** setenv: NAME VALUE Set environment variable NAME to VALUE. Or ** if VALUE is omitted, unset NAME. ** HOME: PATH Shorthand for "setenv: HOME PATH" ** cgi-debug: FILE Causing debugging information to be written ** into FILE. ** errorlog: FILE Warnings, errors, and panics written to FILE. ** timeout: SECONDS Do not run for longer than SECONDS. The default ** timeout is FOSSIL_DEFAULT_TIMEOUT (600) seconds. ** extroot: DIR Directory that is the root of the sub-CGI tree ** on the /ext page. ** redirect: REPO URL Extract the "name" query parameter and search ** REPO for a check-in or ticket that matches the ** value of "name", then redirect to URL. There ** can be multiple "redirect:" lines that are ** processed in order. If the REPO is "*", then ** an unconditional redirect to URL is taken. ** jsmode: VALUE Specifies the delivery mode for JavaScript ** files. See the help text for the --jsmode ** flag of the http command. ** mainmenu: FILE Override the mainmenu config setting with the ** contents of the given file. ** ** Most CGI files contain only a "repository:" line. It is uncommon to ** use any other option. ** ** The lines are processed in the order they are read, which is most |
︙ | ︙ | |||
2607 2608 2609 2610 2611 2612 2613 | /* ** WEBPAGE: test-pid ** ** Return the process identifier of the running Fossil server instance. ** ** Query parameters: | < | 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 | /* ** WEBPAGE: test-pid ** ** Return the process identifier of the running Fossil server instance. ** ** Query parameters: ** usepidkey When present and available, also return the ** address and size, within this server process, ** of the saved database encryption key. This ** is only supported when using SEE on Windows. */ void test_pid_page(void){ login_check_credentials(); |
︙ | ︙ | |||
3422 3423 3424 3425 3426 3427 3428 | } /* ** WEBPAGE: test-warning ** ** Test error and warning log operation. This webpage is accessible to ** the administrator only. | < | 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 | } /* ** WEBPAGE: test-warning ** ** Test error and warning log operation. This webpage is accessible to ** the administrator only. ** case=1 Issue a fossil_warning() while generating the page. ** case=2 Extra db_begin_transaction() ** case=3 Extra db_end_transaction() ** case=4 Error during SQL processing ** case=5 Call the segfault handler ** case=6 Call webpage_assert() ** case=7 Call webpage_error() |
︙ | ︙ |
Changes to src/manifest.c.
︙ | ︙ | |||
1288 1289 1290 1291 1292 1293 1294 | ** ** Parse all entries in the BLOB table that are believed to be non-data ** artifacts and report any errors. Run this test command on historical ** repositories after making any changes to the manifest_parse() ** implementation to confirm that the changes did not break anything. ** ** Options: | < | 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 | ** ** Parse all entries in the BLOB table that are believed to be non-data ** artifacts and report any errors. Run this test command on historical ** repositories after making any changes to the manifest_parse() ** implementation to confirm that the changes did not break anything. ** ** Options: ** --limit N Parse no more than N artifacts before stopping ** --wellformed Use all BLOB table entries as input, not just ** those entries that are believed to be valid ** artifacts, and verify that the result the ** manifest_is_well_formed() agrees with the ** result of manifest_parse(). */ |
︙ | ︙ |
Changes to src/merge.c.
︙ | ︙ | |||
293 294 295 296 297 298 299 | ** a recent fork on the current branch to merge. ** ** Only file content is merged. The result continues to use the ** file and directory names from the current checkout even if those ** names might have been changed in the branch being merged in. ** ** Options: | < < < < < < < < < < | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 | ** a recent fork on the current branch to merge. ** ** Only file content is merged. The result continues to use the ** file and directory names from the current checkout even if those ** names might have been changed in the branch being merged in. ** ** Options: ** --backout Do a reverse cherrypick merge against VERSION. ** In other words, back out the changes that were ** added by VERSION. ** --baseline BASELINE Use BASELINE as the "pivot" of the merge instead ** of the nearest common ancestor. This allows ** a sequence of changes in a branch to be merged ** without having to merge the entire branch. ** --binary GLOBPATTERN Treat files that match GLOBPATTERN as binary ** and do not try to merge parallel changes. This ** option overrides the "binary-glob" setting. ** --cherrypick Do a cherrypick merge VERSION into the current ** checkout. A cherrypick merge pulls in the changes ** of the single check-in VERSION, rather than all ** changes back to the nearest common ancestor. ** -f|--force Force the merge even if it would be a no-op. ** --force-missing Force the merge even if there is missing content. ** --integrate Merged branch will be closed when committing. ** -K|--keep-merge-files On merge conflict, retain the temporary files ** used for merging, named *-baseline, *-original, ** and *-merge. ** -n|--dry-run If given, display instead of run actions ** -v|--verbose Show additional details of the merge */ void merge_cmd(void){ int vid; /* Current version "V" */ int mid; /* Version we are merging from "M" */ int pid = 0; /* The pivot version - most recent common ancestor P */ int nid = 0; /* The name pivot version "N" */ |
︙ | ︙ |
Changes to src/name.c.
︙ | ︙ | |||
1024 1025 1026 1027 1028 1029 1030 | ** Usage: %fossil whatis NAME ** ** Resolve the symbol NAME into its canonical artifact hash ** artifact name and provide a description of what role that artifact ** plays. ** ** Options: | < | 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 | ** Usage: %fossil whatis NAME ** ** Resolve the symbol NAME into its canonical artifact hash ** artifact name and provide a description of what role that artifact ** plays. ** ** Options: ** --type TYPE Only find artifacts of TYPE (one of: 'ci', 't', ** 'w', 'g', or 'e') ** -v|--verbose Provide extra information (such as the RID) */ void whatis_cmd(void){ int rid; const char *zName; |
︙ | ︙ | |||
1440 1441 1442 1443 1444 1445 1446 | zRange = mprintf("BETWEEN %d AND %d", iFrom, iFrom+iCnt-1); describe_artifacts_to_stdout(zRange, 0); } /* ** WEBPAGE: bloblist ** | | > | 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 | zRange = mprintf("BETWEEN %d AND %d", iFrom, iFrom+iCnt-1); describe_artifacts_to_stdout(zRange, 0); } /* ** WEBPAGE: bloblist ** ** Return a page showing all artifacts in the repository. ** ** Query parameters: ** n=N Show N artifacts ** s=S Start with artifact number S ** priv Show only unpublished or private artifacts ** phan Show only phantom artifacts ** hclr Color code hash types (SHA1 vs SHA3) */ void bloblist_page(void){ |
︙ | ︙ | |||
1658 1659 1660 1661 1662 1663 1664 | } /* ** WEBPAGE: bigbloblist ** ** Return a page showing the largest artifacts in the repository in order ** of decreasing size. | < | 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 | } /* ** WEBPAGE: bigbloblist ** ** Return a page showing the largest artifacts in the repository in order ** of decreasing size. ** n=N Show the top N artifacts */ void bigbloblist_page(void){ Stmt q; int n = atoi(PD("n","250")); login_check_credentials(); |
︙ | ︙ |
Changes to src/patch.c.
︙ | ︙ | |||
835 836 837 838 839 840 841 | ** ** Usage: %fossil patch SUBCOMMAND ?ARGS ..? ** ** This command is used to create, view, and apply Fossil binary patches. ** A Fossil binary patch is a single (binary) file that captures all of the ** uncommitted changes of a check-out. Use Fossil binary patches to transfer ** proposed or incomplete changes between machines for testing or analysis. | < < < < < | > < < < < < < < < < < < < < | 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 | ** ** Usage: %fossil patch SUBCOMMAND ?ARGS ..? ** ** This command is used to create, view, and apply Fossil binary patches. ** A Fossil binary patch is a single (binary) file that captures all of the ** uncommitted changes of a check-out. Use Fossil binary patches to transfer ** proposed or incomplete changes between machines for testing or analysis. ** > fossil patch create [DIRECTORY] FILENAME ** Create a new binary patch in FILENAME that captures all uncommitted ** changes in the check-out at DIRECTORY, or the current directory if ** DIRECTORY is omitted. If FILENAME is "-" then the binary patch ** is written to standard output. ** -f|--force Overwrite an existing patch with the same name. ** > fossil patch apply [DIRECTORY] FILENAME ** Apply the changes in FILENAME to the check-out at DIRECTORY, or ** in the current directory if DIRECTORY is omitted. ** ** Options: ** -f|--force Apply the patch even though there are unsaved ** changes in the current check-out. Unsaved changes ** are reverted and permanently lost. ** -n|--dry-run Do nothing, but print what would have happened. ** -v|--verbose Extra output explaining what happens. ** > fossil patch diff [DIRECTORY] FILENAME ** Show a human-readable diff for the patch. All the usual ** diff flags described at "fossil help diff" apply. In addition: ** -f|--force Continue trying to perform the diff even if ** baseline information is missing from the current ** repository ** > fossil patch push REMOTE-CHECKOUT ** Create a patch for the current check-out, transfer that patch to ** a remote machine (using ssh) and apply the patch there. The ** REMOTE-CHECKOUT is in one of the following formats: ** * DIRECTORY ** * HOST:DIRECTORY ** * USER@HOST:DIRECTORY ** ** Command-line options: ** -f|--force Apply the patch even though there are unsaved ** changes in the current check-out. Unsaved ** changes will be reverted and then the patch is ** applied. ** --fossilcmd EXE Name of the "fossil" executable on the remote ** -n|--dry-run Do nothing, but print what would have happened. ** -v|--verbose Extra output explaining what happens. ** > fossil patch pull REMOTE-CHECKOUT ** Like "fossil patch push" except that the transfer is from remote ** to local. All the same command-line options apply. ** > fossil patch view FILENAME ** View a summary of the changes in the binary patch FILENAME. ** Use "fossil patch diff" for detailed patch content. ** -v|--verbose Show extra detail about the patch. ** */ void patch_cmd(void){ const char *zCmd; size_t n; if( g.argc<3 ){ |
︙ | ︙ |
Changes to src/piechart.c.
︙ | ︙ | |||
313 314 315 316 317 318 319 | if( n>1 ){ @ <svg width=%d(width) height=%d(height) style="border:1px solid #d3d3d3;"> piechart_render(width,height, PIE_OTHER|PIE_PERCENT); @ </svg> @ <hr /> } @ <form method="POST" action='%R/test-piechart'> | | | | | | 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 | if( n>1 ){ @ <svg width=%d(width) height=%d(height) style="border:1px solid #d3d3d3;"> piechart_render(width,height, PIE_OTHER|PIE_PERCENT); @ </svg> @ <hr /> } @ <form method="POST" action='%R/test-piechart'> @ <p><label>Comma-separated list of slice widths:<br /> @ <input type='text' name='data' size='80' value='%h(zData)'/></label><br /> @ <label>Width: <input type='text' size='8' name='width' value='%d(width)'/></label> @ <label>Height: <input type='text' size='8' name='height' value='%d(height)'/></label><br /> @ <input type='submit' value='Draw The Pie Chart'/> @ </form> @ <p>Interesting test cases: @ <ul> @ <li> <a href='test-piechart?data=44,2,2,2,2,2,3,2,2,2,2,2,44'>Case 1</a> @ <li> <a href='test-piechart?data=2,2,2,2,2,44,44,2,2,2,2,2'>Case 2</a> @ <li> <a href='test-piechart?data=20,2,2,2,2,2,2,2,2,2,2,80'>Case 3</a> |
︙ | ︙ |
Changes to src/pikchrshow.c.
︙ | ︙ | |||
285 286 287 288 289 290 291 | "box rad 10px \"Markdown\" \"Formatter\" \"(markdown.c)\" fit\n" "arrow right 200% \"HTML+SVG\" \"Output\"\n" "arrow <-> down from last box.s\n" "box same \"Pikchr\" \"Formatter\" \"(pikchr.c)\" fit\n"; } style_header("PikchrShow Client/Server"); CX("<style>"); { | | | 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | "box rad 10px \"Markdown\" \"Formatter\" \"(markdown.c)\" fit\n" "arrow right 200% \"HTML+SVG\" \"Output\"\n" "arrow <-> down from last box.s\n" "box same \"Pikchr\" \"Formatter\" \"(pikchr.c)\" fit\n"; } style_header("PikchrShow Client/Server"); CX("<style>"); { CX("main.content { padding-top: 0.5em }\n"); CX("#sbs-wrapper {" "display: flex; flex-direction: column;" "}\n"); CX("#sbs-wrapper > * {" "margin: 0 0.25em 0.5em 0; flex: 1 10 auto;" "align-self: stretch;" "}\n"); |
︙ | ︙ | |||
339 340 341 342 343 344 345 | "margin-right: 0.5em; vertical-align: middle;" "}\n"); CX("body.pikchrshow .v-align-middle{" "vertical-align: middle" "}\n"); CX(".dragover {border: 3px dotted rgba(0,255,0,0.6)}\n"); } CX("</style>"); | | | | 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 | "margin-right: 0.5em; vertical-align: middle;" "}\n"); CX("body.pikchrshow .v-align-middle{" "vertical-align: middle" "}\n"); CX(".dragover {border: 3px dotted rgba(0,255,0,0.6)}\n"); } CX("</style>"); CX("<div><label for='content'>Input pikchr code</label> and tap Preview (or " "Shift-Enter) to render it. <a href='?wasm'>Switch to WASM mode</a>.</div>"); CX("<div id='sbs-wrapper'>"); { CX("<div id='pikchrshow-form'>"); { CX("<textarea id='content' name='content' rows='15'>" "%s</textarea>",zContent/*safe-for-%s*/); CX("<div id='pikchrshow-controls'>"); { CX("<button id='pikchr-submit-preview'>Preview</button>"); CX("<div class='input-with-label'>"); { |
︙ | ︙ | |||
523 524 525 526 527 528 529 | ** ** Accepts a pikchr script as input and outputs the rendered script as ** an SVG graphic. The INFILE and OUTFILE options default to stdin ** resp. stdout, and the names "-" can be used as aliases for those ** streams. ** ** Options: | < < < < < < < < < < < < < < | 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 | ** ** Accepts a pikchr script as input and outputs the rendered script as ** an SVG graphic. The INFILE and OUTFILE options default to stdin ** resp. stdout, and the names "-" can be used as aliases for those ** streams. ** ** Options: ** -div On success, add a DIV wrapper around the ** resulting SVG output which limits its max-width to ** its computed maximum ideal size. ** -div-indent Like -div but indent the div. ** -div-center Like -div but center the div. ** -div-left Like -div but float the div left. ** -div-right Like -div but float the div right. ** -div-toggle Set the 'toggle' CSS class on the div (used by the ** JavaScript-side post-processor). ** -div-source Set the 'source' CSS class on the div, which tells ** CSS to hide the SVG and reveal the source by default. ** -src Store the input pikchr's source code in the output as ** a separate element adjacent to the SVG one. Implied ** by -div-source. ** -th Process the input using TH1 before passing it to pikchr. ** -th-novar Disable $var and $<var> TH1 processing. Use this if the ** pikchr script uses '$' for its own purposes and that ** causes issues. This only affects parsing of '$' outside ** of TH1 script blocks. Code in such blocks is unaffected. ** -th-nosvg When using -th, output the post-TH1'd script ** instead of the pikchr-rendered output. ** -th-trace Trace TH1 execution (for debugging purposes). ** ** The -div-indent/center/left/right flags may not be combined. ** ** TH1-related Notes and Caveats: ** ** If the -th flag is used, this command must open a fossil database ** for certain functionality to work (via a checkout or the -R REPO |
︙ | ︙ |
Changes to src/purge.c.
︙ | ︙ | |||
453 454 455 456 457 458 459 | ** ** WARNING: This command can potentially destroy historical data and ** leave your repository in a goofy state. Know what you are doing! ** Make a backup of your repository before using this command! ** ** FURTHER WARNING: This command is a work-in-progress and may yet ** contain bugs. | < < < < < < < < < < < < < < < < < < < | 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 | ** ** WARNING: This command can potentially destroy historical data and ** leave your repository in a goofy state. Know what you are doing! ** Make a backup of your repository before using this command! ** ** FURTHER WARNING: This command is a work-in-progress and may yet ** contain bugs. ** > fossil purge artifacts HASH... ?OPTIONS? ** Move arbitrary artifacts identified by the HASH list into the ** graveyard. ** > fossil purge cat HASH... ** Write the content of one or more artifacts in the graveyard onto ** standard output. ** > fossil purge checkins TAGS... ?OPTIONS? ** Move the check-ins or branches identified by TAGS and all of ** their descendants out of the repository and into the graveyard. ** If TAGS includes a branch name then it means all the check-ins ** on the most recent occurrence of that branch. ** > fossil purge files NAME ... ?OPTIONS? ** Move all instances of files called NAME into the graveyard. ** NAME should be the name of the file relative to the root of the ** repository. If NAME is a directory, then all files within that ** directory are moved. ** > fossil purge list|ls ?-l? ** Show the graveyard of prior purges. The -l option gives more ** detail in the output. ** > fossil purge obliterate ID... ?--force? ** Remove one or more purge events from the graveyard. Once a purge ** event is obliterated, it can no longer be undone. The --force ** option suppresses the confirmation prompt. ** > fossil purge tickets NAME ... ?OPTIONS? ** TBD... ** > fossil purge undo ID ** Restore the content previously removed by purge ID. ** > fossil purge wiki NAME ... ?OPTIONS? ** TBD... ** ** COMMON OPTIONS: ** --explain Make no changes, but show what would happen ** --dry-run An alias for --explain */ void purge_cmd(void){ int purgeFlags = PURGE_MOVETO_GRAVEYARD | PURGE_PRINT_SUMMARY; const char *zSubcmd; int n; |
︙ | ︙ |
Changes to src/regexp.c.
︙ | ︙ | |||
807 808 809 810 811 812 813 | ** ** Usage: %fossil test-grep REGEXP [FILE...] ** ** Run a regular expression match over the named disk files, or against ** standard input if no disk files are named on the command-line. ** ** Options: | < | 807 808 809 810 811 812 813 814 815 816 817 818 819 820 | ** ** Usage: %fossil test-grep REGEXP [FILE...] ** ** Run a regular expression match over the named disk files, or against ** standard input if no disk files are named on the command-line. ** ** Options: ** -i|--ignore-case Ignore case */ void re_test_grep(void){ ReCompiled *pRe; const char *zErr; int ignoreCase = find_option("ignore-case","i",0)!=0; if( g.argc<3 ){ |
︙ | ︙ | |||
851 852 853 854 855 856 857 | ** be specified, in which case all named files are searched in reverse ** chronological order. ** ** For details of the supported regular expression dialect, see ** https://fossil-scm.org/fossil/doc/trunk/www/grep.md ** ** Options: | < | 850 851 852 853 854 855 856 857 858 859 860 861 862 863 | ** be specified, in which case all named files are searched in reverse ** chronological order. ** ** For details of the supported regular expression dialect, see ** https://fossil-scm.org/fossil/doc/trunk/www/grep.md ** ** Options: ** -c|--count Suppress normal output; instead print a count ** of the number of matching files ** -i|--ignore-case Ignore case ** -l|--files-with-matches List only hash for each match ** --once Stop searching after the first match ** -s|--no-messages Suppress error messages about nonexistent ** or unreadable files |
︙ | ︙ |
Changes to src/report.c.
︙ | ︙ | |||
378 379 380 381 382 383 384 | } /* ** WEBPAGE: rptnew ** WEBPAGE: rptedit ** ** Create (/rptnew) or edit (/rptedit) a ticket report format. | < > | 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 | } /* ** WEBPAGE: rptnew ** WEBPAGE: rptedit ** ** Create (/rptnew) or edit (/rptedit) a ticket report format. ** ** Query parameters: ** rn=N Ticket report number. (required) ** t=TITLE Title of the report format ** w=USER Owner of the report format ** s=SQL SQL text used to implement the report ** k=KEY Color key */ void view_edit(void){ |
︙ | ︙ | |||
509 510 511 512 513 514 515 | } style_header("%s", rn>0 ? "Edit Report Format":"Create New Report Format"); if( zErr ){ @ <blockquote class="reportError">%h(zErr)</blockquote> } @ <form action="rptedit" method="post"><div> @ <input type="hidden" name="rn" value="%d(rn)" /> | | | > | | | | > | | | 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | } style_header("%s", rn>0 ? "Edit Report Format":"Create New Report Format"); if( zErr ){ @ <blockquote class="reportError">%h(zErr)</blockquote> } @ <form action="rptedit" method="post"><div> @ <input type="hidden" name="rn" value="%d(rn)" /> @ <p><label for="t">Report Title:</label><br /> @ <input type="text" id="t" name="t" value="%h(zTitle)" size="60" /></p> @ <p><label for="s"> @ Enter a complete SQL query statement against the "TICKET" table:</label><br /> @ <textarea id="s" name="s" rows="20" cols="80">%h(zSQL)</textarea> @ </p> login_insert_csrf_secret(); if( g.perm.Admin ){ @ <p><label for="w">Report owner:</label> @ <input type="text" id="w" name="w" size="20" value="%h(zOwner)" /> @ </p> } else { @ <input type="hidden" name="w" value="%h(zOwner)" /> } @ <p><label for="k"> @ Enter an optional color key in the following box.</label> (If blank, no @ color key is displayed.) Each line contains the text for a single @ entry in the key. The first token of each line is the background @ color for that line.<br /> @ <textarea id="k" name="k" rows="8" cols="50">%h(zClrKey)</textarea> @ </p> @ <p><label><input type="checkbox" name="dflt" %s(dflt?"checked":"")> \ @ Make this the default report</label></p> if( !g.perm.Admin && fossil_strcmp(zOwner,g.zLogin)!=0 ){ @ <p>This report format is owned by %h(zOwner). You are not allowed @ to change it.</p> @ </form> |
︙ | ︙ | |||
558 559 560 561 562 563 564 | static void report_format_hints(void){ char *zSchema; zSchema = db_text(0,"SELECT sql FROM sqlite_schema WHERE name='ticket'"); if( zSchema==0 ){ zSchema = db_text(0,"SELECT sql FROM repository.sqlite_schema" " WHERE name='ticket'"); } | | | 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 | static void report_format_hints(void){ char *zSchema; zSchema = db_text(0,"SELECT sql FROM sqlite_schema WHERE name='ticket'"); if( zSchema==0 ){ zSchema = db_text(0,"SELECT sql FROM repository.sqlite_schema" " WHERE name='ticket'"); } @ <hr /><h2>TICKET Schema</h2> @ <blockquote><pre> @ <code class="language-sql">%h(zSchema)</code> @ </pre></blockquote> @ <h3>Notes</h3> @ <ul> @ <li><p>The SQL must consist of a single SELECT statement</p></li> @ |
︙ | ︙ | |||
771 772 773 774 775 776 777 | @ <thead><tr> zTid = 0; for(i=0; i<nArg; i++){ const char *zName = azName[i]; if( i==pState->iBg ) continue; if( pState->iNewRow>=0 && i>=pState->iNewRow ){ if( g.perm.Write && zTid ){ | | | | 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 | @ <thead><tr> zTid = 0; for(i=0; i<nArg; i++){ const char *zName = azName[i]; if( i==pState->iBg ) continue; if( pState->iNewRow>=0 && i>=pState->iNewRow ){ if( g.perm.Write && zTid ){ @ <td> </td> zTid = 0; } if( zName[0]=='_' ) zName++; @ </tr><tr><th colspan=%d(pState->nCol)>%h(zName)</th> }else{ if( zName[0]=='#' ){ zTid = zName; } @ <th>%h(zName)</th> } } if( g.perm.Write && zTid ){ @ <td> </td> } @ </tr></thead><tbody> } if( azArg==0 ){ @ <tr><td colspan="%d(pState->nCol)"> @ <i>No records match the report criteria</i> @ </td></tr> |
︙ | ︙ |
Changes to src/rss.c.
︙ | ︙ | |||
228 229 230 231 232 233 234 | /* ** COMMAND: rss* ** ** Usage: %fossil rss ?OPTIONS? ** ** The CLI variant of the /timeline.rss page, this produces an RSS | | > < < < < < < | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | /* ** COMMAND: rss* ** ** Usage: %fossil rss ?OPTIONS? ** ** The CLI variant of the /timeline.rss page, this produces an RSS ** feed of the timeline to stdout. ** ** Options: ** -type|y FLAG May be: all (default), ci (show check-ins only), ** t (show tickets only), w (show wiki only). ** -limit|n LIMIT The maximum number of items to show. ** -tkt HASH Filter for only those events for the specified ticket. ** -tag TAG Filter for a tag ** -wiki NAME Filter on a specific wiki page. ** ** Only one of -tkt, -tag, or -wiki may be used. ** -name FILENAME Filter for a specific file. This may be combined ** with one of the other filters (useful for looking ** at a specific branch). ** -url STRING Set the RSS feed's root URL to the given string. ** The default is "URL-PLACEHOLDER" (without quotes). */ void cmd_timeline_rss(void){ Stmt q; int nLine=0; char *zPubDate, *zProjectName, *zProjectDescr, *zFreeProjectName=0; |
︙ | ︙ |
Changes to src/search.c.
︙ | ︙ | |||
332 333 334 335 336 337 338 | ** ** Usage: %fossil test-match SEARCHSTRING FILE1 FILE2 ... ** ** Run the full-scan search algorithm using SEARCHSTRING against ** the text of the files listed. Output matches and snippets. ** ** Options: | < | 332 333 334 335 336 337 338 339 340 341 342 343 344 345 | ** ** Usage: %fossil test-match SEARCHSTRING FILE1 FILE2 ... ** ** Run the full-scan search algorithm using SEARCHSTRING against ** the text of the files listed. Output matches and snippets. ** ** Options: ** --begin TEXT Text to insert before each match ** --end TEXT Text to insert after each match ** --gap TEXT Text to indicate elided content ** --html Input is HTML ** --static Use the static Search object */ void test_match_cmd(void){ |
︙ | ︙ | |||
581 582 583 584 585 586 587 | ** Outputs, by default, some top-N fraction of the results. The -all ** option can be used to output all matches, regardless of their search ** score. The -limit option can be used to limit the number of entries ** returned. The -width option can be used to set the output width used ** when printing matches. ** ** Options: | < | 580 581 582 583 584 585 586 587 588 589 590 591 592 593 | ** Outputs, by default, some top-N fraction of the results. The -all ** option can be used to output all matches, regardless of their search ** score. The -limit option can be used to limit the number of entries ** returned. The -width option can be used to set the output width used ** when printing matches. ** ** Options: ** -a|--all Output all matches, not just best matches. ** -n|--limit N Limit output to N matches. ** -W|--width WIDTH Set display width to WIDTH columns, 0 for ** unlimited. Defaults the terminal's width. */ void search_cmd(void){ Blob pattern; |
︙ | ︙ | |||
1139 1140 1141 1142 1143 1144 1145 | } @ <form method='GET' action='%R/%T(g.zPath)'> if( zClass ){ @ <div class='searchForm searchForm%s(zClass)'> }else{ @ <div class='searchForm'> } | > | | | | 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 | } @ <form method='GET' action='%R/%T(g.zPath)'> if( zClass ){ @ <div class='searchForm searchForm%s(zClass)'> }else{ @ <div class='searchForm'> } @ <label>Search for: @ <input type="text" name="s" size="40" value="%h(zPattern)"%s(zDisable1)></label> if( (mFlags & 0x01)!=0 && (srchFlags & (srchFlags-1))!=0 ){ static const struct { const char *z; const char *zNm; unsigned m; } aY[] = { { "all", "All", SRCH_ALL }, { "c", "Check-ins", SRCH_CKIN }, { "d", "Docs", SRCH_DOC }, { "t", "Tickets", SRCH_TKT }, { "w", "Wiki", SRCH_WIKI }, { "e", "Tech Notes", SRCH_TECHNOTE }, { "f", "Forum", SRCH_FORUM }, }; const char *zY = PD("y","all"); unsigned newFlags = srchFlags; int i; @ <label> Elements: <select size='1' name='y'> for(i=0; i<count(aY); i++){ if( (aY[i].m & srchFlags)==0 ) continue; cgi_printf("<option value='%s'", aY[i].z); if( fossil_strcmp(zY,aY[i].z)==0 ){ newFlags &= aY[i].m; cgi_printf(" selected"); } cgi_printf(">%s</option>\n", aY[i].zNm); } @ </select></label> srchFlags = newFlags; } if( fDebug ){ @ <input type="hidden" name="debug" value="1"> } @ <input type="submit" value="Search%s(zType)"%s(zDisable2)> if( srchFlags==0 ){ |
︙ | ︙ | |||
1195 1196 1197 1198 1199 1200 1201 | } /* ** WEBPAGE: search ** ** Search for check-in comments, documents, tickets, or wiki that ** match a user-supplied pattern. | < | 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 | } /* ** WEBPAGE: search ** ** Search for check-in comments, documents, tickets, or wiki that ** match a user-supplied pattern. ** s=PATTERN Specify the full-text pattern to search for ** y=TYPE What to search. ** c -> check-ins ** d -> documentation ** t -> tickets ** w -> wiki ** e -> tech notes |
︙ | ︙ | |||
1848 1849 1850 1851 1852 1853 1854 | /* ** COMMAND: fts-config* ** ** Usage: fossil fts-config ?SUBCOMMAND? ?ARGUMENT? ** ** The "fossil fts-config" command configures the full-text search capabilities | | > < < < < | 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 | /* ** COMMAND: fts-config* ** ** Usage: fossil fts-config ?SUBCOMMAND? ?ARGUMENT? ** ** The "fossil fts-config" command configures the full-text search capabilities ** of the repository. ** ** Subcommands: ** reindex Rebuild the search index. This is a no-op if ** index search is disabled ** index (on|off) Turn the search index on or off ** enable cdtwe Enable various kinds of search. c=Check-ins, ** d=Documents, t=Tickets, w=Wiki, e=Tech Notes. ** disable cdtwe Disable various kinds of search ** stemmer (on|off) Turn the Porter stemmer on or off for indexed ** search. (Unindexed search is never stemmed.) ** ** The current search settings are displayed after any changes are applied. ** Run this command with no arguments to simply see the settings. */ void fts_config_cmd(void){ |
︙ | ︙ |
Changes to src/setup.c.
︙ | ︙ | |||
207 208 209 210 211 212 213 | db_protect_pop(); setup_incr_cfgcnt(); admin_log("Set option [%q] to [%q].", zVar, iQ ? "on" : "off"); iVal = iQ; } } | > > > | > | > > > > | > | 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | db_protect_pop(); setup_incr_cfgcnt(); admin_log("Set option [%q] to [%q].", zVar, iQ ? "on" : "off"); iVal = iQ; } } if( zLabel[0] ) { @ <label> } @ <input type="checkbox" name="%s(zQParm)" \ if( !zLabel[0] ) { @ aria-label="%h(zLabel[0]?zLabel:zQParm)" \ } @ title="%h(zLabel[0]?zLabel:zQParm)" \ if( iVal ){ @ checked="checked" \ } if( disabled ){ @ disabled="disabled" \ } @ /> if( zLabel[0] ) { @ <b>%s(zLabel)</b></label> } } /* ** Generate an entry box for an attribute. */ void entry_attribute( const char *zLabel, /* The text label on the entry box */ |
︙ | ︙ | |||
242 243 244 245 246 247 248 | db_protect_only(PROTECT_NONE); db_set(zVar/*works-like:"x"*/, zQ, 0); db_protect_pop(); admin_log("Set entry_attribute %Q to: %.*s%s", zVar, 20, zQ, (nZQ>20 ? "..." : "")); zVal = zQ; } | > > > > > | > > > > | > | 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 | db_protect_only(PROTECT_NONE); db_set(zVar/*works-like:"x"*/, zQ, 0); db_protect_pop(); admin_log("Set entry_attribute %Q to: %.*s%s", zVar, 20, zQ, (nZQ>20 ? "..." : "")); zVal = zQ; } if( zLabel[0] ) { @ <label> } @ <input if( !zLabel[0] ) { @ aria-label="%h(zLabel[0]?zLabel:zQParm)" } @ title="%h(zLabel[0]?zLabel:zQParm)" type="text" \ @ id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" \ if( disabled ){ @ disabled="disabled" \ } @ /> if( zLabel[0] ) { @ <b>%s(zLabel)</b></label> } } /* ** Generate a text box for an attribute. */ const char *textarea_attribute( const char *zLabel, /* The text label on the textarea */ |
︙ | ︙ | |||
276 277 278 279 280 281 282 283 | db_protect_pop(); setup_incr_cfgcnt(); admin_log("Set textarea_attribute %Q to: %.*s%s", zVar, 20, zQ, (nZQ>20 ? "..." : "")); z = zQ; } if( rows>0 && cols>0 ){ @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" \ | > > > > | > > | | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 | db_protect_pop(); setup_incr_cfgcnt(); admin_log("Set textarea_attribute %Q to: %.*s%s", zVar, 20, zQ, (nZQ>20 ? "..." : "")); z = zQ; } if( rows>0 && cols>0 ){ if( *zLabel ){ @ <label> } @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" \ if( !*zLabel ){ @ aria-label="%h(zLabel[0]?zLabel:zQP)" \ } @ title="%h(zLabel[0]?zLabel:zQP)" \ if( disabled ){ @ disabled="disabled" \ } @ cols="%d(cols)">%h(z)</textarea> if( *zLabel ){ @ <span class="textareaLabel">%s(zLabel)</span></label> } } return z; } /* ** Generate a text box for an attribute. |
︙ | ︙ | |||
314 315 316 317 318 319 320 | db_set(zVar/*works-like:"x"*/, zQ, 0); setup_incr_cfgcnt(); db_protect_pop(); admin_log("Set multiple_choice_attribute %Q to: %.*s%s", zVar, 20, zQ, (nZQ>20 ? "..." : "")); z = zQ; } | | | | 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 | db_set(zVar/*works-like:"x"*/, zQ, 0); setup_incr_cfgcnt(); db_protect_pop(); admin_log("Set multiple_choice_attribute %Q to: %.*s%s", zVar, 20, zQ, (nZQ>20 ? "..." : "")); z = zQ; } @ <label><select title="%h(zLabel)" size="1" name="%s(zQP)" id="id%s(zQP)"> for(i=0; i<nChoice*2; i+=2){ const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : ""; @ <option value="%h(azChoice[i])"%s(zSel)>%h(azChoice[i+1])</option> } @ </select> <b>%h(zLabel)</b></label> } /* ** Insert code into the current page that allows the user to configure ** auto-hyperlink related robot defense settings. */ static void addAutoHyperlinkSettings(void){ |
︙ | ︙ | |||
692 693 694 695 696 697 698 | @ is not currently part of any login-group. @ To join a login group, fill out the form below.</p> @ @ <form action="%R/setup_login_group" method="post"><div> login_insert_csrf_secret(); @ <blockquote><table border="0"> @ | | | | | | | | | | | | | | 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 | @ is not currently part of any login-group. @ To join a login group, fill out the form below.</p> @ @ <form action="%R/setup_login_group" method="post"><div> login_insert_csrf_secret(); @ <blockquote><table border="0"> @ @ <tr><th align="right" id="rfigtj"><label for="repo">Repository filename \ @ in group to join:</label></th> @ <td width="5"></td><td> @ <input type="text" size="50" \ @ value="%h(zRepo)" id="repo" name="repo"></td></tr> @ @ <tr><th align="right" id="lotar"><label for="login">Login on the above repo:</label></th> @ <td width="5"></td><td> @ <input type="text" size="20" \ @ value="%h(zLogin)" id="login" name="login"></td></tr> @ @ <tr><th align="right" id="lgpw"><label for="pw">Password:</label></th> @ <td width="5"></td><td> @ <input type="password" size="20" id="pw" name="pw">\ @ </td></tr> @ @ <tr><th align="right" id="nolg"><label for="newname">Name of login-group:</label></th> @ <td width="5"></td><td> @ <input type="text" size="30" \ @ value="%h(zNewName)" id="newname" name="newname"> @ (only used if creating a new login-group).</td></tr> @ @ <tr><td colspan="3" align="center"> @ <input type="submit" value="Join" name="join"></td></tr> @ </table></blockquote></div></form> }else{ Stmt q; |
︙ | ︙ | |||
1651 1652 1653 1654 1655 1656 1657 | @ <p>The logo is accessible to all users at this URL: @ <a href="%s(g.zBaseURL)/logo">%s(g.zBaseURL)/logo</a>. @ The logo may or may not appear on each @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and @ <a href="setup_skinedit?w=2">header setup</a>. @ To change the logo image, use the following form:</p> login_insert_csrf_secret(); | | | | 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 | @ <p>The logo is accessible to all users at this URL: @ <a href="%s(g.zBaseURL)/logo">%s(g.zBaseURL)/logo</a>. @ The logo may or may not appear on each @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and @ <a href="setup_skinedit?w=2">header setup</a>. @ To change the logo image, use the following form:</p> login_insert_csrf_secret(); @ <label>Logo Image file: @ <input type="file" name="logoim" size="60" accept="image/*" /></label> @ <p align="center"> @ <input type="submit" name="setlogo" value="Change Logo" /> @ <input type="submit" name="clrlogo" value="Revert To Default" /></p> @ <p>(Properties: "logo-image" and "logo-mimetype") @ </div></form> @ <hr /> @ |
︙ | ︙ | |||
1675 1676 1677 1678 1679 1680 1681 | @ <p>The background image is accessible to all users at this URL: @ <a href="%s(g.zBaseURL)/background">%s(g.zBaseURL)/background</a>. @ The background image may or may not appear on each @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and @ <a href="setup_skinedit?w=2">header setup</a>. @ To change the background image, use the following form:</p> login_insert_csrf_secret(); | | | | 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 | @ <p>The background image is accessible to all users at this URL: @ <a href="%s(g.zBaseURL)/background">%s(g.zBaseURL)/background</a>. @ The background image may or may not appear on each @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and @ <a href="setup_skinedit?w=2">header setup</a>. @ To change the background image, use the following form:</p> login_insert_csrf_secret(); @ <label>Background image file: @ <input type="file" name="bgim" size="60" accept="image/*" /></label> @ <p align="center"> @ <input type="submit" name="setbg" value="Change Background" /> @ <input type="submit" name="clrbg" value="Revert To Default" /></p> @ </div></form> @ <p>(Properties: "background-image" and "background-mimetype") @ <hr /> @ |
︙ | ︙ | |||
1699 1700 1701 1702 1703 1704 1705 | @ <p>The icon image is accessible to all users at this URL: @ <a href="%s(g.zBaseURL)/favicon.ico">%s(g.zBaseURL)/favicon.ico</a>. @ The icon image may or may not appear on each @ page depending on the web browser in use and the MIME-Types that it @ supports for icon images. @ To change the icon image, use the following form:</p> login_insert_csrf_secret(); | | | | 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 | @ <p>The icon image is accessible to all users at this URL: @ <a href="%s(g.zBaseURL)/favicon.ico">%s(g.zBaseURL)/favicon.ico</a>. @ The icon image may or may not appear on each @ page depending on the web browser in use and the MIME-Types that it @ supports for icon images. @ To change the icon image, use the following form:</p> login_insert_csrf_secret(); @ <label>Icon image file: @ <input type="file" name="iconim" size="60" accept="image/*" /></label> @ <p align="center"> @ <input type="submit" name="seticon" value="Change Icon" /> @ <input type="submit" name="clricon" value="Revert To Default" /></p> @ </div></form> @ <p>(Properties: "icon-image" and "icon-mimetype") @ <hr /> @ |
︙ | ︙ | |||
1791 1792 1793 1794 1795 1796 1797 | "FROM config\n" "-- ORDER BY mtime DESC; -- optional"; go = 1; } @ @ <form method="post" action="%R/admin_sql"> login_insert_csrf_secret(); | | | | 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 | "FROM config\n" "-- ORDER BY mtime DESC; -- optional"; go = 1; } @ @ <form method="post" action="%R/admin_sql"> login_insert_csrf_secret(); @ <label>SQL:<br /> @ <textarea name="q" rows="8" cols="80">%h(zQ)</textarea></label><br /> @ <input type="submit" name="go" value="Run SQL"> @ <input type="submit" name="schema" value="Show Schema"> @ <input type="submit" name="tablelist" value="List Tables"> @ <input type="submit" name="configtab" value="CONFIG Table Query"> @ </form> if( P("schema") ){ zQ = sqlite3_mprintf( |
︙ | ︙ | |||
1900 1901 1902 1903 1904 1905 1906 | style_header("Raw TH1 Commands"); @ <p><b>Caution:</b> There are no restrictions on the TH1 that can be @ run by this page. If Tcl integration was enabled at compile-time and @ the "tcl" setting is enabled, Tcl commands may be run as well.</p> @ @ <form method="post" action="%R/admin_th1"> login_insert_csrf_secret(); | | | | 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 | style_header("Raw TH1 Commands"); @ <p><b>Caution:</b> There are no restrictions on the TH1 that can be @ run by this page. If Tcl integration was enabled at compile-time and @ the "tcl" setting is enabled, Tcl commands may be run as well.</p> @ @ <form method="post" action="%R/admin_th1"> login_insert_csrf_secret(); @ <label>TH1:<br /> @ <textarea name="q" rows="5" cols="80">%h(zQ)</textarea></label><br /> @ <input type="submit" name="go" value="Run TH1"> @ </form> if( go ){ const char *zR; int rc; int n; @ <hr /> |
︙ | ︙ | |||
2172 2173 2174 2175 2176 2177 2178 | @ <table border=0 cellpadding=5> @ <tr><th>Alias<th>URI That The Alias Maps Into blob_init(&namelist, 0, 0); while( db_step(&q)==SQLITE_ROW ){ const char *zName = db_column_text(&q, 0); const char *zValue = db_column_text(&q, 1); @ <tr><td> | | | | 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 | @ <table border=0 cellpadding=5> @ <tr><th>Alias<th>URI That The Alias Maps Into blob_init(&namelist, 0, 0); while( db_step(&q)==SQLITE_ROW ){ const char *zName = db_column_text(&q, 0); const char *zValue = db_column_text(&q, 1); @ <tr><td> @ <input type='text' size='20' value='%h(zName)' name='n%d(cnt)' title='Alias %d(cnt)'> @ </td><td> @ <input type='text' size='80' value='%h(zValue)' name='v%d(cnt)' title='URI %d(cnt)'> @ </td></tr> cnt++; if( blob_size(&namelist)>0 ) blob_append(&namelist, " ", 1); blob_append(&namelist, zName, -1); } db_finalize(&q); @ <tr><td> |
︙ | ︙ |
Changes to src/setupuser.c.
︙ | ︙ | |||
29 30 31 32 33 34 35 | /* ** WEBPAGE: setup_ulist ** ** Show a list of users. Clicking on any user jumps to the edit ** screen for that user. Requires Admin privileges. ** ** Query parameters: | < | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | /* ** WEBPAGE: setup_ulist ** ** Show a list of users. Clicking on any user jumps to the edit ** screen for that user. Requires Admin privileges. ** ** Query parameters: ** with=CAP Only show users that have one or more capabilities in CAP. ** ubg Color backgrounds by username hash */ void setup_ulist(void){ Stmt s; double rNow; const char *zWith = P("with"); |
︙ | ︙ | |||
602 603 604 605 606 607 608 | @ <input type="hidden" name="login" value="%s(zLogin)"> @ <input type="hidden" name="info" value=""> @ <input type="hidden" name="pw" value="*"> } @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))"> @ <table width="100%%"> @ <tr> | | | | | | | > | | 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 | @ <input type="hidden" name="login" value="%s(zLogin)"> @ <input type="hidden" name="info" value=""> @ <input type="hidden" name="pw" value="*"> } @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))"> @ <table width="100%%"> @ <tr> @ <td class="usetupEditLabel" id="suuid"><label for="id">User ID:</label></td> if( uid ){ @ <td>%d(uid) <input type="hidden" \ @ name="id" value="%d(uid)"/>\ @ </td> }else{ @ <td>(new user)<input type="hidden" name="id" \ @ value="0" /></td> } @ </tr> @ <tr> @ <td class="usetupEditLabel" id="sulgn"><label for="login">Login:</label></td> if( login_is_special(zLogin) ){ @ <td><b>%h(zLogin)</b></td> }else{ @ <td><input type="text" id="login" name="login" \ @ value="%h(zLogin)" /> if( alert_tables_exist() ){ int sid; sid = db_int(0, "SELECT subscriberId FROM subscriber" " WHERE suname=%Q", zLogin); if( sid>0 ){ @ <a href="%R/alerts?sid=%d(sid)">\ @ (subscription info for %h(zLogin))</a>\ } } @ </td></tr> @ <tr> @ <td class="usetupEditLabel" id="sucnfo"> @ <label for="info">Contact Info:</label></td> @ <td><textarea id="info" name="info" cols="40" \ @ rows="2">%h(zInfo)</textarea></td> } @ </tr> @ <tr> @ <td class="usetupEditLabel">Capabilities:</td> @ <td width="100%%"> #define B(x) inherit[x] |
︙ | ︙ | |||
727 728 729 730 731 732 733 | @ <td> @ <span id="usetupEditCapability">(missing JS?)</span> @ <a href="%R/setup_ucap_list">(key)</a> @ </td> @ </tr> if( !login_is_special(zLogin) ){ @ <tr> | | | | | | 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 | @ <td> @ <span id="usetupEditCapability">(missing JS?)</span> @ <a href="%R/setup_ucap_list">(key)</a> @ </td> @ </tr> if( !login_is_special(zLogin) ){ @ <tr> @ <td align="right" id="supw"><label for="pw">Password:</label></td> if( zPw[0] ){ /* Obscure the password for all users */ @ <td><input type="password" autocomplete="off" \ @ id="pw" name="pw" value="**********" /></td> }else{ /* Show an empty password as an empty input field */ char *zRPW = fossil_random_password(12); @ <td><input type="password" id="pw" name="pw" \ @ autocomplete="off" value="" /> Password suggestion: %z(zRPW)</td> } @ </tr> } zGroup = login_group_name(); if( zGroup ){ @ <tr> |
︙ | ︙ |
Changes to src/sha1.c.
︙ | ︙ | |||
499 500 501 502 503 504 505 | /* ** COMMAND: sha1sum* ** ** Usage: %fossil sha1sum FILE... ** ** Compute an SHA1 checksum of all files named on the command-line. ** If a file is named "-" then take its content from standard input. | < > | 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 | /* ** COMMAND: sha1sum* ** ** Usage: %fossil sha1sum FILE... ** ** Compute an SHA1 checksum of all files named on the command-line. ** If a file is named "-" then take its content from standard input. ** ** Options: ** -h|--dereference If FILE is a symbolic link, compute the hash ** on the object that the link points to. Normally, ** the hash is over the name of the object that ** the link points to. ** ** See also: [[md5sum]], [[sha3sum]] */ |
︙ | ︙ |
Changes to src/sha3.c.
︙ | ︙ | |||
626 627 628 629 630 631 632 | ** Compute an SHA3 checksum of all files named on the command-line. ** If a file is named "-" then take its content from standard input. ** ** To be clear: The official NIST FIPS-202 implementation of SHA3 ** with the added 01 padding is used, not the original Keccak submission. ** ** Options: | < | 626 627 628 629 630 631 632 633 634 635 636 637 638 639 | ** Compute an SHA3 checksum of all files named on the command-line. ** If a file is named "-" then take its content from standard input. ** ** To be clear: The official NIST FIPS-202 implementation of SHA3 ** with the added 01 padding is used, not the original Keccak submission. ** ** Options: ** --224 Compute a SHA3-224 hash ** --256 Compute a SHA3-256 hash (the default) ** --384 Compute a SHA3-384 hash ** --512 Compute a SHA3-512 hash ** --size N An N-bit hash. N must be a multiple of 32 between ** 128 and 512. ** -h|--dereference If FILE is a symbolic link, compute the hash on |
︙ | ︙ |
Changes to src/shun.c.
︙ | ︙ | |||
166 167 168 169 170 171 172 | } @ <p>A shunned artifact will not be pushed nor accepted in a pull and the @ artifact content will be purged from the repository the next time the @ repository is rebuilt. A list of shunned artifacts can be seen at the @ bottom of this page.</p> @ @ <a name="addshun"></a> | | | | | | | | 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | } @ <p>A shunned artifact will not be pushed nor accepted in a pull and the @ artifact content will be purged from the repository the next time the @ repository is rebuilt. A list of shunned artifacts can be seen at the @ bottom of this page.</p> @ @ <a name="addshun"></a> @ <p><label for="shun-uuid">To shun artifacts, enter their artifact hashes (the 40- or @ 64-character lowercase hexadecimal hash of the artifact content) in the @ following box and press the "Shun" button.</label> This will cause the artifacts @ to be removed from the repository and will prevent the artifacts from being @ readded to the repository by subsequent sync operation.</p> @ @ <p>Note that you must enter full artifact hashes, not abbreviations @ or symbolic tags.</p> @ @ <p>Warning: Shunning should only be used to remove inappropriate content @ from the repository. Inappropriate content includes such things as @ spam added to Wiki, files that violate copyright or patent agreements, @ or artifacts that by design or accident interfere with the processing @ of the repository. Do not shun artifacts merely to remove them from @ sight - set the "hidden" tag on such artifacts instead.</p> @ @ <blockquote> @ <form method="post" action="%R/%s(g.zPath)"><div> login_insert_csrf_secret(); @ <textarea class="fullsize-text" cols="70" rows="%d(numRows)" name="uuid" id="shun-uuid"> if( zShun ){ if( strlen(zShun) ){ @ %h(zShun) }else if( nRcvid ){ db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid); while( db_step(&q)==SQLITE_ROW ){ @ %s(db_column_text(&q, 0)) } db_finalize(&q); } } @ </textarea> @ <input type="submit" name="add" value="Shun" /> @ </div></form> @ </blockquote> @ @ <a name="delshun"></a> @ <p><label for="accept-uuid">Enter the UUIDs of previously shunned artifacts to cause them to be @ accepted again in the repository.</label> The artifacts content is not @ restored because the content is unknown. The only change is that @ the formerly shunned artifacts will be accepted on subsequent sync @ operations.</p> @ @ <blockquote> @ <form method="post" action="%R/%s(g.zPath)"><div> login_insert_csrf_secret(); @ <textarea class="fullsize-text" cols="70" rows="%d(numRows)" name="uuid" id="accept-uuid"> if( zAccept ){ if( strlen(zAccept) ){ @ %h(zAccept) }else if( nRcvid ){ db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid); while( db_step(&q)==SQLITE_ROW ){ @ %s(db_column_text(&q, 0)) |
︙ | ︙ |
Changes to src/sitemap.c.
︙ | ︙ | |||
163 164 165 166 167 168 169 | @ <ul> @ <li>%z(href("%R/tree?type=tree&ci=trunk"))Tree-view, @ Trunk Check-in</a></li> @ <li>%z(href("%R/tree?type=flat"))Flat-view</a></li> @ <li>%z(href("%R/fileage?name=trunk"))File ages for Trunk</a></li> @ <li>%z(href("%R/uvlist"))Unversioned Files</a> if( g.perm.Write && zEditGlob[0]!=0 ){ | | | 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | @ <ul> @ <li>%z(href("%R/tree?type=tree&ci=trunk"))Tree-view, @ Trunk Check-in</a></li> @ <li>%z(href("%R/tree?type=flat"))Flat-view</a></li> @ <li>%z(href("%R/fileage?name=trunk"))File ages for Trunk</a></li> @ <li>%z(href("%R/uvlist"))Unversioned Files</a> if( g.perm.Write && zEditGlob[0]!=0 ){ @ <li>%z(href("%R/fileedit"))On-line File Editor</a></li> } @ </ul> } if( g.perm.Read ){ @ <li>%z(href("%R/timeline"))Project Timeline</a> @ <ul> @ <li>%z(href("%R/reports"))Activity Reports</a></li> |
︙ | ︙ |
Changes to src/skins.c.
︙ | ︙ | |||
439 440 441 442 443 444 445 | if( ex ){ @ <p><span class="generalError">There is already another skin @ named "%h(zNewName)". Choose a different name.</span></p> } @ <form action="%R/setup_skin_admin" method="post"><div> @ <table border="0"><tr> @ <tr><td align="right">Current name:<td align="left"><b>%h(zOldName)</b> | | | | 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 | if( ex ){ @ <p><span class="generalError">There is already another skin @ named "%h(zNewName)". Choose a different name.</span></p> } @ <form action="%R/setup_skin_admin" method="post"><div> @ <table border="0"><tr> @ <tr><td align="right">Current name:<td align="left"><b>%h(zOldName)</b> @ <tr><td align="right"><label for="newname">New name:</label><td align="left"> @ <input type="text" size="35" id="newname" name="newname" value="%h(zNewName)"> @ <tr><td><td> @ <input type="hidden" name="sn" value="%h(zOldName)"> @ <input type="submit" name="rename" value="Rename"> @ <input type="submit" name="canren" value="Cancel"> @ </table> login_insert_csrf_secret(); @ </div></form> |
︙ | ︙ | |||
481 482 483 484 485 486 487 | style_header("Save Current Skin"); if( ex ){ @ <p><span class="generalError">There is already another skin @ named "%h(zNewName)". Choose a different name.</span></p> } @ <form action="%R/setup_skin_admin" method="post"><div> @ <table border="0"><tr> | | | | 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 | style_header("Save Current Skin"); if( ex ){ @ <p><span class="generalError">There is already another skin @ named "%h(zNewName)". Choose a different name.</span></p> } @ <form action="%R/setup_skin_admin" method="post"><div> @ <table border="0"><tr> @ <tr><td align="right"><label for="svname">Name for this skin:</label><td align="left"> @ <input type="text" size="35" id="svname" name="svname" value="%h(zNewName)"> @ <tr><td><td> @ <input type="submit" name="save" value="Save"> @ <input type="submit" name="cansave" value="Cancel"> @ </table> login_insert_csrf_secret(); @ </div></form> style_finish_page(); |
︙ | ︙ | |||
772 773 774 775 776 777 778 | } cssDefaultList[]; /* ** WEBPAGE: setup_skinedit ** ** Edit aspects of a skin determined by the w= query parameter. ** Requires Admin or Setup privileges. | < | 772 773 774 775 776 777 778 779 780 781 782 783 784 785 | } cssDefaultList[]; /* ** WEBPAGE: setup_skinedit ** ** Edit aspects of a skin determined by the w= query parameter. ** Requires Admin or Setup privileges. ** w=NUM -- 0=CSS, 1=footer, 2=header, 3=details, 4=js ** sk=NUM -- the draft skin number */ void setup_skinedit(void){ static const struct sSkinAddr { const char *zFile; const char *zTitle; |
︙ | ︙ | |||
851 852 853 854 855 856 857 | style_submenu_element(aSkinAttr[j].zSubmenu, "%R/setup_skinedit?w=%d&basis=%h&sk=%d",j,zBasis,iSkin); } @ <form action="%R/setup_skinedit" method="post"><div> login_insert_csrf_secret(); @ <input type='hidden' name='w' value='%d(ii)'> @ <input type='hidden' name='sk' value='%d(iSkin)'> | | | | > | 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 | style_submenu_element(aSkinAttr[j].zSubmenu, "%R/setup_skinedit?w=%d&basis=%h&sk=%d",j,zBasis,iSkin); } @ <form action="%R/setup_skinedit" method="post"><div> login_insert_csrf_secret(); @ <input type='hidden' name='w' value='%d(ii)'> @ <input type='hidden' name='sk' value='%d(iSkin)'> @ <h2><label for="%s(zFile)">Edit %s(zTitle):</label></h2> if( P("submit") && cgi_csrf_safe(0) && (zOrig==0 || strcmp(zOrig,zContent)!=0) ){ db_set_mprintf(zContent, 0, "draft%d-%s",iSkin,zFile); } @ <textarea id="%s(zFile)" name="%s(zFile)" rows="10" cols="80">\ @ %h(zContent)</textarea> @ <br /> @ <input type="submit" name="submit" value="Apply Changes" /> if( isRevert ){ @ ← Press to complete reversion to "%s(zBasis)" }else if( fossil_strcmp(zContent,zDflt)!=0 ){ @ <input type="submit" name="revert" value='Revert To "%s(zBasis)"' /> } @ <hr /> @ <label>Baseline: \ skin_emit_skin_selector("basis", zBasis, zDraft); @ </label> @ <input type="submit" name="diff" value="Unified Diff" /> @ <input type="submit" name="sbsdiff" value="Side-by-Side Diff" /> if( P("diff")!=0 || P("sbsdiff")!=0 ){ Blob from, to, out; DiffConfig DCfg; construct_diff_flags(1, &DCfg); DCfg.diffFlags |= DIFF_STRIP_EOLCR; |
︙ | ︙ | |||
1030 1031 1032 1033 1034 1035 1036 | @ @ <p>The main skin of Fossil cannot be edited directly. Instead, @ edits are made to one of nine draft skins. A draft skin can then @ be published to become the default skin. @ Nine separate drafts are available to facilitate A/B testing.</p> @ @ <form method='POST' action='%R/setup_skin#step2' id='f01'> | | | | | | 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 | @ @ <p>The main skin of Fossil cannot be edited directly. Instead, @ edits are made to one of nine draft skins. A draft skin can then @ be published to become the default skin. @ Nine separate drafts are available to facilitate A/B testing.</p> @ @ <form method='POST' action='%R/setup_skin#step2' id='f01'> @ <p class='skinInput'><label>Draft skin to edit: @ <select size='1' name='sk' id='skStep1'> for(i=1; i<=9; i++){ if( i==iSkin ){ @ <option value='%d(i)' selected>draft%d(i)</option> }else{ @ <option value='%d(i)'>draft%d(i)</option> } } @ </select></label> @ </p> @ @ <a name='step2'></a> @ <h1>Step 2: Authenticate</h1> @ if( isSetup ){ @ <p>As an administrator, you can make any edits you like to this or @ any other skin. You can also authorize other users to edit this @ skin. Any user whose login name matches the comma-separated list @ of GLOB expressions below is given special permission to edit @ the draft%d(iSkin) skin: @ @ <form method='POST' action='%R/setup_skin#step2' id='f02'> @ <p class='skinInput'> @ <input type='hidden' name='sk' value='%d(iSkin)'> @ <label>Authorized editors for skin draft%d(iSkin): @ <input type='text' name='editors' value='%h(zAllowedEditors)'\ @ width='40'></label> @ <input type='submit' name='submit2' value='Change'> @ </p> @ </form> }else if( isEditor ){ @ <p>You are authorized to make changes to the draft%d(iSkin) skin. @ Continue to the <a href='#step3'>next step</a>.</p> }else{ |
︙ | ︙ | |||
1083 1084 1085 1086 1087 1088 1089 | }else{ @ <p>Initialize the draft%d(iSkin) skin to one of the built-in skins @ or a preexisting skin, to use as a baseline.</p> @ @ <form method='POST' action='%R/setup_skin#step4' id='f03'> @ <p class='skinInput'> @ <input type='hidden' name='sk' value='%d(iSkin)'> | | | | 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 | }else{ @ <p>Initialize the draft%d(iSkin) skin to one of the built-in skins @ or a preexisting skin, to use as a baseline.</p> @ @ <form method='POST' action='%R/setup_skin#step4' id='f03'> @ <p class='skinInput'> @ <input type='hidden' name='sk' value='%d(iSkin)'> @ <label>Initialize skin <b>draft%d(iSkin)</b> using skin_emit_skin_selector("initskin", "current", 0); @ </label><input type='submit' name='init3' value='Go'> @ </p> @ </form> } @ @ <a name='step4'></a> @ <h1>Step 4: Make Edits</h1> @ |
︙ | ︙ | |||
1153 1154 1155 1156 1157 1158 1159 | @ <p>When the draft%d(iSkin) skin is ready for production use, @ make it the default skin by clicking the acknowledgements and @ pressing the button below:</p> @ @ <form method='POST' action='%R/setup_skin#step7'> @ <p class='skinInput'> @ <input type='hidden' name='sk' value='%d(iSkin)'> | | | | | | 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 | @ <p>When the draft%d(iSkin) skin is ready for production use, @ make it the default skin by clicking the acknowledgements and @ pressing the button below:</p> @ @ <form method='POST' action='%R/setup_skin#step7'> @ <p class='skinInput'> @ <input type='hidden' name='sk' value='%d(iSkin)'> @ <label><input type='checkbox' name='pub7ck1' value='yes'>\ @ Skin draft%d(iSkin) has been tested and found ready for production.</label><br> @ <label><input type='checkbox' name='pub7ck2' value='yes'>\ @ The current skin should be overwritten with draft%d(iSkin).</label><br> @ <input type='submit' name='pub7' value='Publish Draft%d(iSkin)'> @ </p></form> @ @ <p>You will probably need to press Reload on your browser after @ publishing the new skin.</p> } @ |
︙ | ︙ |
Changes to src/smtp.c.
︙ | ︙ | |||
421 422 423 424 425 426 427 | ** Usage: %fossil test-smtp-probe DOMAIN [ME] ** ** Interact with the SMTP server for DOMAIN by setting up a connection ** and then immediately shutting it back down. Log all interaction ** on the console. Use ME as the domain name of the sender. ** ** Options: | < | 421 422 423 424 425 426 427 428 429 430 431 432 433 434 | ** Usage: %fossil test-smtp-probe DOMAIN [ME] ** ** Interact with the SMTP server for DOMAIN by setting up a connection ** and then immediately shutting it back down. Log all interaction ** on the console. Use ME as the domain name of the sender. ** ** Options: ** --direct Use DOMAIN directly without going through MX ** --port N Talk on TCP port N */ void test_smtp_probe(void){ SmtpSession *p; const char *zDomain; const char *zSelf; |
︙ | ︙ | |||
594 595 596 597 598 599 600 | ** ** Usage: %fossil test-smtp-send EMAIL FROM TO ... ** ** Use SMTP to send the email message contained in the file named EMAIL ** to the list of users TO. FROM is the sender of the email. ** ** Options: | < | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 | ** ** Usage: %fossil test-smtp-send EMAIL FROM TO ... ** ** Use SMTP to send the email message contained in the file named EMAIL ** to the list of users TO. FROM is the sender of the email. ** ** Options: ** --direct Go directly to the TO domain. Bypass MX lookup ** --relayhost R Use R as relay host directly for delivery. ** --port N Use TCP port N instead of 25 ** --trace Show the SMTP conversation on the console */ void test_smtp_send(void){ SmtpSession *p; |
︙ | ︙ |
Changes to src/sqlcmd.c.
︙ | ︙ | |||
328 329 330 331 332 333 334 | ** ** WARNING: Careless use of this command can corrupt a Fossil repository ** in ways that are unrecoverable. Be sure you know what you are doing before ** running any SQL commands that modify the repository database. Use the ** --readonly option to prevent accidental damage to the repository. ** ** Options: | < < < < < < < < < < < < < < < < < < < < | 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 | ** ** WARNING: Careless use of this command can corrupt a Fossil repository ** in ways that are unrecoverable. Be sure you know what you are doing before ** running any SQL commands that modify the repository database. Use the ** --readonly option to prevent accidental damage to the repository. ** ** Options: ** --no-repository Skip opening the repository database. ** --readonly Open the repository read-only. No changes ** are allowed. This is a recommended safety ** precaution to prevent repository damage. ** -R REPOSITORY Use REPOSITORY as the repository database ** --test Enable some testing and analysis features ** that are normally disabled. ** ** All of the standard sqlite3 command-line shell options should also ** work. ** ** The following SQL extensions are provided with this Fossil-enhanced ** version of the sqlite3 command-line shell: ** builtin A virtual table that contains one row for ** each datafile that is built into the Fossil ** binary. ** checkin_mtime(X,Y) Return the mtime for the file Y (a BLOB.RID) ** found in check-in X (another BLOB.RID value). ** compress(X) Compress text X with the same algorithm used ** to compress artifacts in the BLOB table. ** content(X) Return the content of artifact X. X can be an ** artifact hash or hash prefix or a tag. Artifacts ** are stored compressed and deltaed. This function ** does all necessary decompression and undeltaing. ** decompress(X) Decompress text X. Undoes the work of ** compress(X). ** delta_apply(X,D) Apply delta D to source blob X and return ** the result. ** delta_create(X,Y) Create and return a delta that will convert ** X into Y. ** delta_output_size(D) Return the number of bytes of output to expect ** when applying delta D ** delta_parse(D) A table-valued function that deconstructs ** delta D and returns rows for each element of ** that delta. ** files_of_checkin(X) A table-valued function that returns info on ** all files contained in check-in X. Example: ** SELECT * FROM files_of_checkin('trunk'); ** helptext A virtual table with one row for each command, ** webpage, and setting together with the built-in ** help text. ** now() Return the number of seconds since 1970. ** obscure(T) Obfuscate the text password T so that its ** original value is not readily visible. Fossil ** uses this same algorithm when storing passwords ** of remote URLs. ** regexp The REGEXP operator works, unlike in ** standard SQLite. ** symbolic_name_to_rid(X) Return the BLOB.RID corresponding to symbolic ** name X. */ void cmd_sqlite3(void){ int noRepository; char *zConfigDb; extern int sqlite3_shell(int, char**); |
︙ | ︙ |
Changes to src/stash.c.
︙ | ︙ | |||
501 502 503 504 505 506 507 | return stashid; } /* ** COMMAND: stash ** ** Usage: %fossil stash SUBCOMMAND ARGS... | < < < < < < < < < < < < < < | 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 | return stashid; } /* ** COMMAND: stash ** ** Usage: %fossil stash SUBCOMMAND ARGS... ** > fossil stash ** > fossil stash save ?-m|--comment COMMENT? ?FILES...? ** > fossil stash snapshot ?-m|--comment COMMENT? ?FILES...? ** Save the current changes in the working tree as a new stash. ** Then revert the changes back to the last check-in. If FILES ** are listed, then only stash and revert the named files. The ** "save" verb can be omitted if and only if there are no other ** arguments. The "snapshot" verb works the same as "save" but ** omits the revert, keeping the checkout unchanged. ** > fossil stash list|ls ?-v|--verbose? ?-W|--width NUM? ** List all changes sets currently stashed. Show information about ** individual files in each changeset if -v or --verbose is used. ** > fossil stash show|cat ?STASHID? ?DIFF-OPTIONS? ** > fossil stash gshow|gcat ?STASHID? ?DIFF-OPTIONS? ** Show the contents of a stash as a diff against its baseline. ** With gshow and gcat, gdiff-command is used instead of internal ** diff logic. ** > fossil stash pop ** > fossil stash apply ?STASHID? ** Apply STASHID or the most recently created stash to the current ** working checkout. The "pop" command deletes that changeset from ** the stash after applying it but the "apply" command retains the ** changeset. ** > fossil stash goto ?STASHID? ** Update to the baseline checkout for STASHID then apply the ** changes of STASHID. Keep STASHID so that it can be reused ** This command is undoable. ** > fossil stash drop|rm ?STASHID? ?-a|--all? ** Forget everything about STASHID. Forget the whole stash if the ** -a|--all flag is used. Individual drops are undoable but -a|--all ** is not. ** > fossil stash diff ?STASHID? ?DIFF-OPTIONS? ** > fossil stash gdiff ?STASHID? ?DIFF-OPTIONS? ** Show diffs of the current working directory and what that ** directory would be if STASHID were applied. With gdiff, ** gdiff-command is used instead of internal diff logic. */ void stash_cmd(void){ const char *zCmd; int nCmd; |
︙ | ︙ |
Changes to src/stat.c.
︙ | ︙ | |||
331 332 333 334 335 336 337 | ** ** Usage: %fossil dbstat OPTIONS ** ** Shows statistics and global information about the repository and/or ** verify the integrity of a repository. ** ** Options: | < | 331 332 333 334 335 336 337 338 339 340 341 342 343 344 | ** ** Usage: %fossil dbstat OPTIONS ** ** Shows statistics and global information about the repository and/or ** verify the integrity of a repository. ** ** Options: ** -b|--brief Only show essential elements. ** --db-check Run "PRAGMA quick_check" on the repository database. ** --db-verify Run a full verification of the repository integrity. ** This involves decoding and reparsing all artifacts ** and can take significant time. ** --omit-version-info Omit the SQLite and Fossil version information. */ |
︙ | ︙ |
Changes to src/statrep.c.
︙ | ︙ | |||
221 222 223 224 225 226 227 | style_table_sorter(); }else{ @ class='statistics-report-table-events'> } @ <thead> @ <th>%s(zTimeLabel)</th> @ <th>Events</th> | | | 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | style_table_sorter(); }else{ @ class='statistics-report-table-events'> } @ <thead> @ <th>%s(zTimeLabel)</th> @ <th>Events</th> @ <th width='90%%'>Graph</th> @ </thead><tbody> /* Run the query twice. The first time we calculate the maximum number of events for a given row. Maybe someone with better SQL Fu can re-implement this with a single query. */ while( SQLITE_ROW == db_step(&query) ){ |
︙ | ︙ | |||
360 361 362 363 364 365 366 | } style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='tkx' data-init-sort='2'> @ <thead><tr> @ <th>User</th> @ <th>Events</th> | | | 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 | } style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='tkx' data-init-sort='2'> @ <thead><tr> @ <th>User</th> @ <th>Events</th> @ <th width='90%%'>Graph</th> @ </tr></thead><tbody> db_prepare(&query, "SELECT ifnull(euser,user), " "COUNT(*) AS eventCount " "FROM v_reports " "GROUP BY ifnull(euser,user) ORDER BY eventCount DESC"); while( SQLITE_ROW == db_step(&query) ){ |
︙ | ︙ | |||
436 437 438 439 440 441 442 | @ </h1> style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='tNx' data-init-sort='2'> @ <thead><tr> @ <th>File</th> @ <th>Check-ins</th> | | | 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 | @ </h1> style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='tNx' data-init-sort='2'> @ <thead><tr> @ <th>File</th> @ <th>Check-ins</th> @ <th width='90%%'>Graph</th> @ </tr></thead><tbody> while( SQLITE_ROW == db_step(&query) ){ const char *zFile = db_column_text(&query, 0); const int n = db_column_int(&query, 1); int sz; if( n<=0 ) continue; sz = (int)(100*n/mxEvent); |
︙ | ︙ | |||
517 518 519 520 521 522 523 | style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='ntnx' data-init-sort='1'> @ <thead><tr> @ <th>DoW</th> @ <th>Day</th> @ <th>Events</th> | | | 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 | style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='ntnx' data-init-sort='1'> @ <thead><tr> @ <th>DoW</th> @ <th>Day</th> @ <th>Events</th> @ <th width='90%%'>Graph</th> @ </tr></thead><tbody> while( SQLITE_ROW == db_step(&query) ){ const int nCount = db_column_int(&query, 1); if(nCount>nMaxEvents){ nMaxEvents = nCount; } } |
︙ | ︙ | |||
593 594 595 596 597 598 599 | } style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='nnx' data-init-sort='1'> @ <thead><tr> @ <th>Hour</th> @ <th>Events</th> | | | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 | } style_table_sorter(); @ <table class='statistics-report-table-events sortable' border='0' \ @ cellpadding='2' cellspacing='0' data-column-types='nnx' data-init-sort='1'> @ <thead><tr> @ <th>Hour</th> @ <th>Events</th> @ <th width='90%%'>Graph</th> @ </tr></thead><tbody> while( SQLITE_ROW == db_step(&query) ){ const int nCount = db_column_int(&query, 1); if(nCount>nMaxEvents){ nMaxEvents = nCount; } } |
︙ | ︙ | |||
641 642 643 644 645 646 647 | int nMaxEvents = 1; /* max number of events for all rows. */ int iterations = 0; /* # of active time periods. */ int rowCount = 0; int total = 0; stats_report_init_view(); | | | 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 | int nMaxEvents = 1; /* max number of events for all rows. */ int iterations = 0; /* # of active time periods. */ int rowCount = 0; int total = 0; stats_report_init_view(); style_submenu_sql("y", "Year", "WITH RECURSIVE a(b) AS (" " SELECT substr(date('now'),1,4) UNION ALL" " SELECT b-1 FROM a" " WHERE b>0+(SELECT substr(date(min(mtime)),1,4) FROM event)" ") SELECT b, b FROM a ORDER BY b DESC"); if( zYear==0 || strlen(zYear)!=4 ){ zYear = db_text("1970","SELECT substr(date('now'),1,4);"); |
︙ | ︙ | |||
672 673 674 675 676 677 678 | style_table_sorter(); cgi_printf("<table class='statistics-report-table-events sortable' " "border='0' cellpadding='2' width='100%%' " "cellspacing='0' data-column-types='tnx' data-init-sort='0'>"); cgi_printf("<thead><tr>" "<th>Week</th>" "<th>Events</th>" | | | 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 | style_table_sorter(); cgi_printf("<table class='statistics-report-table-events sortable' " "border='0' cellpadding='2' width='100%%' " "cellspacing='0' data-column-types='tnx' data-init-sort='0'>"); cgi_printf("<thead><tr>" "<th>Week</th>" "<th>Events</th>" "<th width='90%%'>Graph</th>" "</tr></thead>" "<tbody>"); while( SQLITE_ROW == db_step(&q) ){ const int nCount = db_column_int(&q, 1); if(nCount>nMaxEvents){ nMaxEvents = nCount; } |
︙ | ︙ | |||
782 783 784 785 786 787 788 | /* ** WEBPAGE: reports ** ** Shows activity reports for the repository. ** ** Query Parameters: | < < | | | | | | | 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 | /* ** WEBPAGE: reports ** ** Shows activity reports for the repository. ** ** Query Parameters: ** view=REPORT_NAME Valid values: bymonth, byyear, byuser ** user=NAME Restricts statistics to the given user ** type=TYPE Restricts the report to a specific event type: ** ci (check-in), f (forum), w (wiki), t (ticket), g (tag) ** Defaulting to all event types. ** ** The view-specific query parameters include: ** ** view=byweek: ** y=YYYY The year to report (default is the server's ** current year). */ void stats_report_page(){ const char *zView = P("view"); /* Which view/report to show. */ int eType = RPT_NONE; /* Numeric code for view/report to show */ int i; /* Loop counter */ const char *zUserName; /* Name of user */ const char *azView[16]; /* Drop-down menu of view types */ static const struct { const char *zName; /* Name of view= screen type */ const char *zVal; /* Value of view= query parameter */ int eType; /* Corresponding RPT_* define */ } aViewType[] = { { "File Changes","byfile", RPT_BYFILE }, { "Last Change", "lastchng", RPT_LASTCHNG }, { "Month", "bymonth", RPT_BYMONTH }, { "User", "byuser", RPT_BYUSER }, { "Week", "byweek", RPT_BYWEEK }, { "Weekday", "byweekday", RPT_BYWEEKDAY }, { "Year", "byyear", RPT_BYYEAR }, { "Hour", "byhour", RPT_BYHOUR }, }; static const char *const azType[] = { "a", "All Changes", "ci", "Check-ins", "f", "Forum Posts", "g", "Tags", "e", "Tech Notes", |
︙ | ︙ | |||
848 849 850 851 852 853 854 | if( eType!=RPT_NONE ){ int nView = 0; /* Slots used in azView[] */ for(i=0; i<count(aViewType); i++){ azView[nView++] = aViewType[i].zVal; azView[nView++] = aViewType[i].zName; } if( eType!=RPT_BYFILE ){ | | | | | 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 | if( eType!=RPT_NONE ){ int nView = 0; /* Slots used in azView[] */ for(i=0; i<count(aViewType); i++){ azView[nView++] = aViewType[i].zVal; azView[nView++] = aViewType[i].zName; } if( eType!=RPT_BYFILE ){ style_submenu_multichoice("type", "Type", count(azType)/2, azType, 0); } style_submenu_multichoice("view", "Group By", nView/2, azView, 0); if( eType!=RPT_BYUSER && eType!=RPT_LASTCHNG ){ style_submenu_sql("user","User", "SELECT '', 'All Users' UNION ALL " "SELECT x, x FROM (" " SELECT DISTINCT trim(coalesce(euser,user)) AS x FROM event %s" " ORDER BY 1 COLLATE nocase) WHERE x!=''", eType==RPT_BYFILE ? "WHERE type='ci'" : "" ); } |
︙ | ︙ |
Changes to src/style.c.
︙ | ︙ | |||
42 43 44 45 46 47 48 | static struct Submenu { const char *zLabel; /* Button label */ const char *zLink; /* Jump to this link when button is pressed */ } aSubmenu[30]; static int nSubmenu = 0; /* Number of buttons */ static struct SubmenuCtrl { const char *zName; /* Form query parameter */ | | > | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | static struct Submenu { const char *zLabel; /* Button label */ const char *zLink; /* Jump to this link when button is pressed */ } aSubmenu[30]; static int nSubmenu = 0; /* Number of buttons */ static struct SubmenuCtrl { const char *zName; /* Form query parameter */ const char *zLabel; /* Label */ unsigned char eType; /* FF_ENTRY, FF_MULTI, FF_CHECKBOX */ unsigned char eVisible; /* STYLE_NORMAL or STYLE_DISABLED */ short int iSize; /* Width for FF_ENTRY. Count for FF_MULTI */ const char *const *azChoice; /* value/display pairs for FF_MULTI */ const char *zTrue; /* FF_BINARY label when true */ const char *zFalse; /* FF_BINARY label when false */ const char *zJS; /* Javascript to run on toggle */ } aSubmenuCtrl[20]; static int nSubmenuCtrl = 0; #define FF_ENTRY 1 /* Text entry box */ #define FF_MULTI 2 /* Combobox. Multiple choices. */ #define FF_BINARY 3 /* Control for binary query parameter */ |
︙ | ︙ | |||
305 306 307 308 309 310 311 312 313 314 315 316 317 | aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; aSubmenuCtrl[nSubmenuCtrl].eType = FF_CHECKBOX; nSubmenuCtrl++; } void style_submenu_binary( const char *zName, /* Query parameter name */ const char *zTrue, /* Label to show when parameter is true */ const char *zFalse, /* Label to show when the parameter is false */ int eVisible /* Visible or disabled */ ){ assert( nSubmenuCtrl < count(aSubmenuCtrl) ); aSubmenuCtrl[nSubmenuCtrl].zName = zName; | > | > > > | 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; aSubmenuCtrl[nSubmenuCtrl].eType = FF_CHECKBOX; nSubmenuCtrl++; } void style_submenu_binary( const char *zName, /* Query parameter name */ const char *zLabel, /* Label of parameter */ const char *zTrue, /* Label to show when parameter is true */ const char *zFalse, /* Label to show when the parameter is false */ int eVisible /* Visible or disabled */ ){ assert( nSubmenuCtrl < count(aSubmenuCtrl) ); aSubmenuCtrl[nSubmenuCtrl].zName = zName; aSubmenuCtrl[nSubmenuCtrl].zLabel = zLabel; aSubmenuCtrl[nSubmenuCtrl].zTrue = zTrue; aSubmenuCtrl[nSubmenuCtrl].zFalse = zFalse; aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; aSubmenuCtrl[nSubmenuCtrl].eType = FF_BINARY; nSubmenuCtrl++; } void style_submenu_multichoice( const char *zName, /* Query parameter name */ const char *zLabel, /* Label of parameter */ int nChoice, /* Number of options */ const char *const *azChoice, /* value/display pairs. 2*nChoice entries */ int eVisible /* Visible or disabled */ ){ assert( nSubmenuCtrl < count(aSubmenuCtrl) ); aSubmenuCtrl[nSubmenuCtrl].zName = zName; aSubmenuCtrl[nSubmenuCtrl].zLabel = zLabel; aSubmenuCtrl[nSubmenuCtrl].iSize = nChoice; aSubmenuCtrl[nSubmenuCtrl].azChoice = azChoice; aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; aSubmenuCtrl[nSubmenuCtrl].eType = FF_MULTI; nSubmenuCtrl++; } void style_submenu_sql( |
︙ | ︙ | |||
643 644 645 646 647 648 649 | /* ** Default HTML page header text through <body>. If the repository-specific ** header template lacks a <body> tag, then all of the following is ** prepended. */ static const char zDfltHeader[] = | | | 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 | /* ** Default HTML page header text through <body>. If the repository-specific ** header template lacks a <body> tag, then all of the following is ** prepended. */ static const char zDfltHeader[] = @ <html lang="en"> @ <head> @ <meta charset="UTF-8"> @ <base href="$baseurl/$current_page" /> @ <meta http-equiv="Content-Security-Policy" content="$default_csp" /> @ <meta name="viewport" content="width=device-width, initial-scale=1.0"> @ <title>$<project_name>: $<title></title> @ <link rel="alternate" type="application/rss+xml" title="RSS Feed" \ |
︙ | ︙ | |||
985 986 987 988 989 990 991 | int i; char zClass[32]; /* reduced form of the main attribute */ if( nSubmenuCtrl ){ @ <form id='f01' method='GET' action='%R/%s(g.zPath)'> @ <input type='hidden' name='udc' value='1'> cgi_tag_query_parameter("udc"); } | | | 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 | int i; char zClass[32]; /* reduced form of the main attribute */ if( nSubmenuCtrl ){ @ <form id='f01' method='GET' action='%R/%s(g.zPath)'> @ <input type='hidden' name='udc' value='1'> cgi_tag_query_parameter("udc"); } @ <nav id="submenu" class="submenu"> if( nSubmenu>0 ){ qsort(aSubmenu, nSubmenu, sizeof(aSubmenu[0]), submenuCompare); for(i=0; i<nSubmenu; i++){ struct Submenu *p = &aSubmenu[i]; style_derive_classname(p->zLabel, zClass, sizeof zClass); /* switching away from the %h formatting below might be dangerous ** because some places use %s to compose zLabel and zLink; |
︙ | ︙ | |||
1016 1017 1018 1019 1020 1021 1022 | }else if( zQPN ){ cgi_tag_query_parameter(zQPN); } style_derive_classname(zQPN, zClass+4, sizeof(zClass)-4); switch( aSubmenuCtrl[i].eType ){ case FF_ENTRY: @ <span class='submenuctrl%s(zXtraClass) %s(zClass)'>\ | | | < | < > > | > | | | | 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 | }else if( zQPN ){ cgi_tag_query_parameter(zQPN); } style_derive_classname(zQPN, zClass+4, sizeof(zClass)-4); switch( aSubmenuCtrl[i].eType ){ case FF_ENTRY: @ <span class='submenuctrl%s(zXtraClass) %s(zClass)'>\ @ <label>%h(aSubmenuCtrl[i].zLabel): \ @ <input type='text' name='%s(zQPN)' value='%h(PD(zQPN, ""))' \ if( aSubmenuCtrl[i].iSize<0 ){ @ size='%d(-aSubmenuCtrl[i].iSize)' \ }else if( aSubmenuCtrl[i].iSize>0 ){ @ size='%d(aSubmenuCtrl[i].iSize)' \ @ maxlength='%d(aSubmenuCtrl[i].iSize)' \ } @ id='submenuctrl-%d(i)'%s(zDisabled)></label></span> break; case FF_MULTI: { int j; const char *zVal = P(zQPN); if( zXtraClass[0] ){ @ <span class='%s(zXtraClass+1) %s(zClass)'> } @ <label>%h(aSubmenuCtrl[i].zLabel): \ @ <select class='submenuctrl %s(zClass)' size='1' name='%s(zQPN)' \ @ id='submenuctrl-%d(i)'%s(zDisabled)> for(j=0; j<aSubmenuCtrl[i].iSize*2; j+=2){ const char *zQPV = aSubmenuCtrl[i].azChoice[j]; @ <option value='%h(zQPV)'\ if( fossil_strcmp(zVal, zQPV)==0 ){ @ selected\ } @ >%h(aSubmenuCtrl[i].azChoice[j+1])</option> } @ </select> @ </label> if( zXtraClass[0] ){ @ </span> } break; } case FF_BINARY: { int isTrue = PB(zQPN); @ <label for='submenuctrl-%d(i)'>%h(aSubmenuCtrl[i].zLabel): @ <select class='submenuctrl%s(zXtraClass)' size='1' \ @ name='%s(zQPN)' id='submenuctrl-%d(i)'%s(zDisabled)> @ <option value='1'\ if( isTrue ){ @ selected\ } @ >%h(aSubmenuCtrl[i].zTrue)</option> @ <option value='0'\ if( !isTrue ){ @ selected\ } @ >%h(aSubmenuCtrl[i].zFalse)</option> @ </select> @ </label> break; } case FF_CHECKBOX: { @ <label class='submenuctrl submenuckbox%s(zXtraClass) %s(zClass)'>\ @ <input type='checkbox' name='%s(zQPN)' id='submenuctrl-%d(i)' \ if( PB(zQPN) ){ @ checked \ } if( aSubmenuCtrl[i].zJS ){ @ data-ctrl='%s(aSubmenuCtrl[i].zJS)'%s(zDisabled)>\ }else{ @ %s(zDisabled)>\ } @ %h(aSubmenuCtrl[i].zLabel)</label> break; } } } @ </nav> if( nSubmenuCtrl ){ cgi_query_parameters_to_hidden(); cgi_tag_query_parameter(0); @ </form> builtin_request_js("menu.js"); } } zAd = style_adunit_text(&mAdFlags); if( (mAdFlags & ADUNIT_RIGHT_OK)!=0 ){ @ <div class="content adunit_right_container"> @ <div class="adunit_right"> cgi_append_content(zAd, -1); @ </div> }else if( zAd ){ @ <div class="adunit_banner"> cgi_append_content(zAd, -1); @ </div> } @ <main class="content"><span id="debugMsg"></span> cgi_destination(CGI_BODY); if( sideboxUsed ){ @ <div class="endContent"></div> } @ </main> /* Put the footer at the bottom of the page. */ zFooter = skin_get("footer"); if( sqlite3_strlike("%</body>%", zFooter, 0)==0 ){ style_load_all_js_files(); } if( g.thTrace ) Th_Trace("BEGIN_FOOTER<br />\n", -1); |
︙ | ︙ | |||
1263 1264 1265 1266 1267 1268 1269 | } /* ** WEBPAGE: style.css loadavg-exempt ** ** Return the style sheet. The style sheet is assemblied from ** multiple sources, in order: | < < < | 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 | } /* ** WEBPAGE: style.css loadavg-exempt ** ** Return the style sheet. The style sheet is assemblied from ** multiple sources, in order: ** (1) The built-in "default.css" style sheet containing basic defaults. ** (2) The page-specific style sheet taken from the built-in ** called "PAGENAME.css" where PAGENAME is the value of the name= ** or page= query parameters. If neither name= nor page= exist, ** then this section is a no-op. ** (3) The skin-specific "css.txt" file, if there one. ** ** All of (1), (2), and (3) above (or as many as exist) are concatenated. ** The result is then run through TH1 with the following variables set: ** ** * $basename ** * $secureurl |
︙ | ︙ |
Changes to src/style.chat.css.
︙ | ︙ | |||
197 198 199 200 201 202 203 | overflow: auto; padding: 0 0.25em; } body.chat #chat-messages-wrapper.loading > * { /* An attempt at reducing flicker when loading lots of messages. */ visibility: hidden; } | | | 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | overflow: auto; padding: 0 0.25em; } body.chat #chat-messages-wrapper.loading > * { /* An attempt at reducing flicker when loading lots of messages. */ visibility: hidden; } body.chat main.content { margin: 0; padding: 0; display: flex; flex-direction: column-reverse; /* ^^^^ In order to get good automatic scrolling of new messages on the BOTTOM in bottom-up chat mode, such that they scroll up instead of down, we have to use column-reverse layout, which |
︙ | ︙ |
Changes to src/sync.c.
︙ | ︙ | |||
317 318 319 320 321 322 323 | ** "configuration pull" command to pull website configuration details. ** ** If URL is not specified, then the URL from the most recent clone, push, ** pull, remote, or sync command is used. See "fossil help clone" for ** details on the URL formats. ** ** Options: | < | 317 318 319 320 321 322 323 324 325 326 327 328 329 330 | ** "configuration pull" command to pull website configuration details. ** ** If URL is not specified, then the URL from the most recent clone, push, ** pull, remote, or sync command is used. See "fossil help clone" for ** details on the URL formats. ** ** Options: ** --all Pull from all remotes, not just the default ** -B|--httpauth USER:PASS Credentials for the simple HTTP auth protocol, ** if required by the remote website ** --from-parent-project Pull content from the parent project ** --ipv4 Use only IPv4, not IPv6 ** --no-http-compression Do not compress HTTP traffic ** --once Do not remember URL for subsequent syncs |
︙ | ︙ | |||
372 373 374 375 376 377 378 | ** push" command to push website configuration details. ** ** If URL is not specified, then the URL from the most recent clone, push, ** pull, remote, or sync command is used. See "fossil help clone" for ** details on the URL formats. ** ** Options: | < | 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | ** push" command to push website configuration details. ** ** If URL is not specified, then the URL from the most recent clone, push, ** pull, remote, or sync command is used. See "fossil help clone" for ** details on the URL formats. ** ** Options: ** --all Push to all remotes, not just the default ** -B|--httpauth USER:PASS Credentials for the simple HTTP auth protocol, ** if required by the remote website ** --ipv4 Use only IPv4, not IPv6 ** --no-http-compression Do not compress HTTP traffic ** --once Do not remember URL for subsequent syncs ** --proxy PROXY Use the specified HTTP proxy |
︙ | ︙ | |||
421 422 423 424 425 426 427 | ** edits to wiki pages, tickets, forum posts, and technical notes. ** ** If URL is not specified, then the URL from the most recent clone, push, ** pull, remote, or sync command is used. See "fossil help clone" for ** details on the URL formats. ** ** Options: | < | 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | ** edits to wiki pages, tickets, forum posts, and technical notes. ** ** If URL is not specified, then the URL from the most recent clone, push, ** pull, remote, or sync command is used. See "fossil help clone" for ** details on the URL formats. ** ** Options: ** --all Sync with all remotes, not just the default ** -B|--httpauth USER:PASS Credentials for the simple HTTP auth protocol, ** if required by the remote website ** --ipv4 Use only IPv4, not IPv6 ** --no-http-compression Do not compress HTTP traffic ** --once Do not remember URL for subsequent syncs ** --proxy PROXY Use the specified HTTP proxy |
︙ | ︙ | |||
483 484 485 486 487 488 489 | ** Usage: %fossil remote ?SUBCOMMAND ...? ** ** View or modify the URLs of remote repositories used for syncing. ** The "default" remote is specially named by Fossil and corresponds to ** the URL used in the most recent "sync", "push", "pull", "clone", or ** similar command. As such, the default remote can be updated by ** Fossil with each sync command. Other named remotes are persistent. | < < < < < < < < < < < < < < < < < < < < | 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | ** Usage: %fossil remote ?SUBCOMMAND ...? ** ** View or modify the URLs of remote repositories used for syncing. ** The "default" remote is specially named by Fossil and corresponds to ** the URL used in the most recent "sync", "push", "pull", "clone", or ** similar command. As such, the default remote can be updated by ** Fossil with each sync command. Other named remotes are persistent. ** > fossil remote ** With no arguments, this command shows the current default remote ** URL. If there is no default, it shows "off". ** > fossil remote add NAME URL ** Add a new named URL. Afterwards, NAME can be used as a short ** symbolic name for URL in contexts where a URL is required. The ** URL argument can be "default" or a prior symbolic name to make ** a copy of an existing URL under the new NAME. The "default" ** remote cannot be defined with this subcommand; instead, ** use 'fossil remote REF' as documented below. ** > fossil remote config-data ** DEBUG USE ONLY - Show the name and value of every CONFIG table ** entry in the repository that is associated with the remote URL store. ** Passwords are obscured in the output. ** > fossil remote delete NAME ** Delete a named URL previously created by the "add" subcommand. ** > fossil remote hyperlink ?FILENAME? ?LINENUM? ?LINENUM? ** Print a URL that will access the current checkout on the remote ** repository. Or if the FILENAME argument is included, print the ** URL to access that particular file within the current checkout. ** If one or two linenumber arguments are provided after the filename, ** then the URL is for the line or range of lines specified. ** > fossil remote list|ls ** Show all remote repository URLs. ** > fossil remote off ** Forget the default URL. This disables autosync. ** ** This is a convenient way to enter "airplane mode". To enter ** airplane mode, first save the current default URL, then turn the ** default off. Perhaps like this: ** ** fossil remote add main default ** fossil remote off ** ** To exit airplane mode and turn autosync back on again: ** ** fossil remote main ** > fossil remote scrub ** Forget any saved passwords for remote repositories, but continue ** to remember the URLs themselves. You will be prompted for the ** password the next time it is needed. ** > fossil remote ui ?FILENAME? ?LINENUM? ?LINENUM? ** Bring up a web browser pointing at the remote repository, and ** specifically to the page that describes the current checkout ** on that remote repository. Or if FILENAME and/or LINENUM arguments ** are provided, to the specific file and range of lines. This ** command is similar to "fossil remote hyperlink" except that instead ** of printing the URL, it passes the URL off to the web browser. ** > fossil remote REF ** Make REF the new default URL, replacing the prior default. ** REF may be a URL or a NAME from a prior "add". */ void remote_url_cmd(void){ char *zUrl, *zArg; int nArg; db_find_and_open_repository(0, 0); |
︙ | ︙ | |||
818 819 820 821 822 823 824 | ** is safe to run "fossil backup" on a repository that is in active use. ** ** Only the main repository database is backed up by this command. The ** open checkout file (if any) is not saved. Nor is the global configuration ** database. ** ** Options: | < | 795 796 797 798 799 800 801 802 803 804 805 806 807 808 | ** is safe to run "fossil backup" on a repository that is in active use. ** ** Only the main repository database is backed up by this command. The ** open checkout file (if any) is not saved. Nor is the global configuration ** database. ** ** Options: ** --overwrite OK to overwrite an existing file ** -R NAME Filename of the repository to backup */ void backup_cmd(void){ char *zDest; int bOverwrite = 0; db_find_and_open_repository(OPEN_ANY_SCHEMA, 0); |
︙ | ︙ |
Changes to src/tag.c.
︙ | ︙ | |||
389 390 391 392 393 394 395 | /* ** COMMAND: tag ** ** Usage: %fossil tag SUBCOMMAND ... ** ** Run various subcommands to control tags and properties. | < < | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 | /* ** COMMAND: tag ** ** Usage: %fossil tag SUBCOMMAND ... ** ** Run various subcommands to control tags and properties. ** > fossil tag add ?OPTIONS? TAGNAME ARTIFACT-ID ?VALUE? ** Add a new tag or property to an artifact referenced by ** ARTIFACT-ID. For checkins, the tag will be usable instead ** of a CHECK-IN in commands such as update and merge. If the ** --propagate flag is present and ARTIFACT-ID refers to a ** wiki page, forum post, technote, or check-in, the tag ** propagates to all descendants of that artifact. ** |
︙ | ︙ | |||
415 416 417 418 419 420 421 | ** The --date-override and --user-override options support ** importing history from other SCM systems. DATETIME has ** the form 'YYYY-MMM-DD HH:MM:SS'. ** ** Note that fossil uses some tag prefixes internally and this ** command will reject tags with these prefixes to avoid ** causing problems or confusion: "wiki-", "tkt-", "event-". | < < < < < < | 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 | ** The --date-override and --user-override options support ** importing history from other SCM systems. DATETIME has ** the form 'YYYY-MMM-DD HH:MM:SS'. ** ** Note that fossil uses some tag prefixes internally and this ** command will reject tags with these prefixes to avoid ** causing problems or confusion: "wiki-", "tkt-", "event-". ** > fossil tag cancel ?--raw? TAGNAME ARTIFACT-ID ** Remove the tag TAGNAME from the artifact referenced by ** ARTIFACT-ID, and also remove the propagation of the tag to ** any descendants. Use the the -n|--dry-run option to see ** what would have happened. Certain tag name prefixes are ** forbidden, as documented for the 'add' subcommand. ** ** Options: ** --raw Raw tag name. Ignored for ** non-CHECK-IN artifacts. ** --date-override DATETIME Set date and time deleted. ** --user-override USER Name USER when deleting the tag. ** -n|--dry-run Display the control artifact, but do ** not insert it into the database. ** > fossil tag find ?OPTIONS? TAGNAME ** List all objects that use TAGNAME. ** ** Options: ** --raw Interprets tag as a raw name instead of a ** branch name and matches any type of artifact. ** Changes the output to include only the ** hashes of matching objects. ** -t|--type TYPE One of: ci (check-in), w (wiki), ** e (event/technote), f (forum post), ** t (ticket). Default is all types. Ignored ** if --raw is used. ** -n|--limit N Limit to N results. ** > fossil tag list|ls ?OPTIONS? ?ARTIFACT-ID? ** List all tags or, if ARTIFACT-ID is supplied, all tags and ** their values for that artifact. The tagtype option accepts ** one of: propagated, singleton, cancel. For historical ** scripting compatibility, the internal tag types "wiki-", ** "tkt-", and "event-" (technote) are elided by default ** unless the --raw or --prefix options are used. ** |
︙ | ︙ | |||
745 746 747 748 749 750 751 | ** This is an experts-only command. It is used to patch up a repository ** that has been damaged by a shun or that has been pieced together from ** two or more separate repositories. You should never need to reparent ** during normal operations. ** ** Reparenting is accomplished by adding a parent tag. So to undo the ** reparenting operation, simply delete the tag. | < | 737 738 739 740 741 742 743 744 745 746 747 748 749 750 | ** This is an experts-only command. It is used to patch up a repository ** that has been damaged by a shun or that has been pieced together from ** two or more separate repositories. You should never need to reparent ** during normal operations. ** ** Reparenting is accomplished by adding a parent tag. So to undo the ** reparenting operation, simply delete the tag. ** --test Make database entries but do not add the tag artifact. ** So the reparent operation will be undone by the next ** "fossil rebuild" command. ** -n|--dry-run Print the tag that would have been created but do not ** actually change the database in any way. ** --date-override DATETIME Set the change time on the control artifact ** --user-override USER Set the user name on the control artifact |
︙ | ︙ | |||
839 840 841 842 843 844 845 | /* ** WEBPAGE: /tagtimeline ** ** Render a timeline with all check-ins that contain non-propagating ** symbolic tags. ** ** Query parameters: | < | 830 831 832 833 834 835 836 837 838 839 840 841 842 843 | /* ** WEBPAGE: /tagtimeline ** ** Render a timeline with all check-ins that contain non-propagating ** symbolic tags. ** ** Query parameters: ** ng No graph ** nohidden Hide check-ins with "hidden" tag ** onlyhidden Show only check-ins with "hidden" tag ** brbg Background color by branch name ** ubg Background color by user name */ void tagtimeline_page(void){ |
︙ | ︙ |
Changes to src/tar.c.
︙ | ︙ | |||
717 718 719 720 721 722 723 | ** ** /tarball/release/xyz.tar.gz ** /tarball?r=release&name=xyz.tar.gz ** /tarball/xyz.tar.gz?r=release ** /tarball?name=release/xyz.tar.gz ** ** Query parameters: | < < < < | 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 | ** ** /tarball/release/xyz.tar.gz ** /tarball?r=release&name=xyz.tar.gz ** /tarball/xyz.tar.gz?r=release ** /tarball?name=release/xyz.tar.gz ** ** Query parameters: ** name=NAME[.tar.gz] The base name of the output file. The default ** value is a configuration parameter in the project ** settings. A prefix of the name, omitting the ** extension, is used as the top-most directory name. ** r=TAG The check-in that is turned into a compressed tarball. ** Defaults to "trunk". This query parameter used to ** be called "uuid" and "uuid" is still accepted for ** backwards compatibility. If the name= query parameter ** contains one "/" character then the part before the / ** is the TAG and the part after the / is the true name. ** If no TAG is specified by any of the above means, then ** "trunk" is used as the default. ** in=PATTERN Only include files that match the comma-separate ** list of GLOB patterns in PATTERN, as with ex= ** ex=PATTERN Omit any file that match PATTERN. PATTERN is a ** comma-separated list of GLOB patterns, where each ** pattern can optionally be quoted using ".." or '..'. ** Any file matching both ex= and in= is excluded. */ void tarball_page(void){ int rid; |
︙ | ︙ |
Changes to src/th_main.c.
︙ | ︙ | |||
2904 2905 2906 2907 2908 2909 2910 | ** Usage: %fossil test-th-render FILE ** ** Read the content of the file named "FILE" as if it were a header or ** footer or ticket rendering script, evaluate it, and show the results ** on standard output. ** ** Options: | < | 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 | ** Usage: %fossil test-th-render FILE ** ** Read the content of the file named "FILE" as if it were a header or ** footer or ticket rendering script, evaluate it, and show the results ** on standard output. ** ** Options: ** --cgi Include a CGI response header in the output ** --http Include an HTTP response header in the output ** --open-config Open the configuration database ** --set-anon-caps Set anonymous login capabilities ** --set-user-caps Set user login capabilities ** --th-trace Trace TH1 execution (for debugging purposes) */ |
︙ | ︙ | |||
2954 2955 2956 2957 2958 2959 2960 | ** Usage: %fossil test-th-eval SCRIPT ** ** Evaluate SCRIPT as if it were a header or footer or ticket rendering ** script and show the results on standard output. SCRIPT may be either ** a filename or a string of th1 script code. ** ** Options: | < | 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 | ** Usage: %fossil test-th-eval SCRIPT ** ** Evaluate SCRIPT as if it were a header or footer or ticket rendering ** script and show the results on standard output. SCRIPT may be either ** a filename or a string of th1 script code. ** ** Options: ** --cgi Include a CGI response header in the output ** --http Include an HTTP response header in the output ** --open-config Open the configuration database ** --set-anon-caps Set anonymous login capabilities ** --set-user-caps Set user login capabilities ** --th-trace Trace TH1 execution (for debugging purposes) */ |
︙ | ︙ | |||
3015 3016 3017 3018 3019 3020 3021 | ** Usage: %fossil test-th-source FILE ** ** Evaluate the contents of the file named "FILE" as if it were a header ** or footer or ticket rendering script and show the results on standard ** output. ** ** Options: | < | 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 | ** Usage: %fossil test-th-source FILE ** ** Evaluate the contents of the file named "FILE" as if it were a header ** or footer or ticket rendering script and show the results on standard ** output. ** ** Options: ** --cgi Include a CGI response header in the output ** --http Include an HTTP response header in the output ** --open-config Open the configuration database ** --set-anon-caps Set anonymous login capabilities ** --set-user-caps Set user login capabilities ** --th-trace Trace TH1 execution (for debugging purposes) ** --no-print-result Do not output the final result. Use if it |
︙ | ︙ | |||
3084 3085 3086 3087 3088 3089 3090 | ** recognized by Fossil. The FLAGS argument will be used to set the value ** of the "cmd_flags" and/or "web_flags" TH1 variables, if applicable. The ** TYPE argument must be one of the following: ** ** cmdhook Executes the TH1 procedure [command_hook], after ** setting the TH1 variables "cmd_name", "cmd_args", ** and "cmd_flags" to appropriate values. | < < < < | 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 | ** recognized by Fossil. The FLAGS argument will be used to set the value ** of the "cmd_flags" and/or "web_flags" TH1 variables, if applicable. The ** TYPE argument must be one of the following: ** ** cmdhook Executes the TH1 procedure [command_hook], after ** setting the TH1 variables "cmd_name", "cmd_args", ** and "cmd_flags" to appropriate values. ** cmdnotify Executes the TH1 procedure [command_notify], after ** setting the TH1 variables "cmd_name", "cmd_args", ** and "cmd_flags" to appropriate values. ** webhook Executes the TH1 procedure [webpage_hook], after ** setting the TH1 variables "web_name", "web_args", ** and "web_flags" to appropriate values. ** webnotify Executes the TH1 procedure [webpage_notify], after ** setting the TH1 variables "web_name", "web_args", ** and "web_flags" to appropriate values. ** ** Options: ** --cgi Include a CGI response header in the output ** --http Include an HTTP response header in the output ** --th-trace Trace TH1 execution (for debugging purposes) */ void test_th_hook(void){ int rc = TH_OK; int nResult = 0; |
︙ | ︙ |
Changes to src/timeline.c.
︙ | ︙ | |||
441 442 443 444 445 446 447 | /* For technotes, make a graph node with nParent==(-1). This will ** not actually draw anything on the graph, but it will set the ** background color of the timeline entry */ gidx = graph_add_row(pGraph, rid, -1, 0, 0, zBr, zBgClr, zUuid, 0); @ <div id="m%d(gidx)" class="tl-nodemark"></div> } @</td> | | | 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 | /* For technotes, make a graph node with nParent==(-1). This will ** not actually draw anything on the graph, but it will set the ** background color of the timeline entry */ gidx = graph_add_row(pGraph, rid, -1, 0, 0, zBr, zBgClr, zUuid, 0); @ <div id="m%d(gidx)" class="tl-nodemark"></div> } @</td> if( !isSelectedOrCurrent && gidx>0 ){ @ <td class="timeline%s(zStyle)Cell%s(zExtraClass)" id='mc%d(gidx)'> }else{ @ <td class="timeline%s(zStyle)Cell%s(zExtraClass)"> } if( pGraph ){ if( zType[0]=='e' ){ @ <b>Note:</b> |
︙ | ︙ | |||
568 569 570 571 572 573 574 | ** Example: "(check-in: [abcdefg], user: drh, tags: trunk)" */ if( drawDetailEllipsis ){ @ <span class='timelineEllipsis' id='ellipsis-%d(rid)' \ @ data-id='%d(rid)'>...</span> } if( tmFlags & TIMELINE_COLUMNAR ){ | | | 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 | ** Example: "(check-in: [abcdefg], user: drh, tags: trunk)" */ if( drawDetailEllipsis ){ @ <span class='timelineEllipsis' id='ellipsis-%d(rid)' \ @ data-id='%d(rid)'>...</span> } if( tmFlags & TIMELINE_COLUMNAR ){ if( !isSelectedOrCurrent && gidx>0 ){ @ <td class="timelineDetailCell%s(zExtraClass)" id='md%d(gidx)'> }else{ @ <td class="timelineDetailCell%s(zExtraClass)"> } } if( tmFlags & TIMELINE_COMPACT ){ cgi_printf("<span class='clutter' id='detail-%d'>",rid); |
︙ | ︙ | |||
1154 1155 1156 1157 1158 1159 1160 | ** on the timeline. */ static void timeline_y_submenu(int isDisabled){ static int i = 0; static const char *az[16]; if( i==0 ){ az[0] = "all"; | | | 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 | ** on the timeline. */ static void timeline_y_submenu(int isDisabled){ static int i = 0; static const char *az[16]; if( i==0 ){ az[0] = "all"; az[1] = "Any"; i = 2; if( g.perm.Read ){ az[i++] = "ci"; az[i++] = "Check-ins"; az[i++] = "g"; az[i++] = "Tags"; } |
︙ | ︙ | |||
1183 1184 1185 1186 1187 1188 1189 | if( g.perm.RdForum ){ az[i++] = "f"; az[i++] = "Forum"; } assert( i<=count(az) ); } if( i>2 ){ | | | 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 | if( g.perm.RdForum ){ az[i++] = "f"; az[i++] = "Forum"; } assert( i<=count(az) ); } if( i>2 ){ style_submenu_multichoice("y", "Elements", i/2, az, isDisabled); } } /* ** Return the default value for the "ss" cookie or query parameter. ** The "ss" cookie determines the graph style. See the ** timeline_view_styles[] global constant for a list of choices. |
︙ | ︙ | |||
1220 1221 1222 1223 1224 1225 1226 | return tmFlags; } /* Available timeline display styles, together with their y= query ** parameter names. */ const char *const timeline_view_styles[] = { | | | | | | > | 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 | return tmFlags; } /* Available timeline display styles, together with their y= query ** parameter names. */ const char *const timeline_view_styles[] = { "m", "Modern", "j", "Columnar", "c", "Compact", "v", "Verbose", "x", "Classic", }; #if INTERFACE # define N_TIMELINE_VIEW_STYLE 5 #endif /* ** Add the select/option box to the timeline submenu that is used to ** set the ss= parameter that determines the viewing mode. ** ** Return the TIMELINE_* value appropriate for the view-style. */ int timeline_ss_submenu(void){ cookie_link_parameter("ss","ss",timeline_default_ss()); style_submenu_multichoice("ss", "View", N_TIMELINE_VIEW_STYLE, timeline_view_styles, 0); return timeline_ss_cookie(); } /* ** If the zChng string is not NULL, then it should be a comma-separated |
︙ | ︙ | |||
1539 1540 1541 1542 1543 1544 1545 | } /* ** WEBPAGE: timeline ** ** Query parameters: | < | 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 | } /* ** WEBPAGE: timeline ** ** Query parameters: ** a=TIMEORTAG Show events after TIMEORTAG ** b=TIMEORTAG Show events before TIMEORTAG ** c=TIMEORTAG Show events that happen "circa" TIMEORTAG ** cf=FILEHASH Show events around the time of the first use of ** the file with FILEHASH ** m=TIMEORTAG Highlight the event at TIMEORTAG, or the closest available ** event if TIMEORTAG is not part of the timeline. If |
︙ | ︙ | |||
2137 2138 2139 2140 2141 2142 2143 | /* If both p= and d= are set, we don't have the uuid of d yet. */ zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); } } if( advancedMenu ){ style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); } | | | 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 | /* If both p= and d= are set, we don't have the uuid of d yet. */ zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); } } if( advancedMenu ){ style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); } style_submenu_entry("n","Max",4,0); timeline_y_submenu(1); }else if( f_rid && g.perm.Read ){ /* If f= is present, ignore all other parameters other than n= */ char *zUuid; db_multi_exec( "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" "INSERT INTO ok VALUES(%d);" |
︙ | ︙ | |||
2667 2668 2669 2670 2671 2672 2673 | } if( advancedMenu ){ if( zType[0]=='a' || zType[0]=='c' ){ style_submenu_checkbox("unhide", "Unhide", 0, 0); } style_submenu_checkbox("v", "Files",(zType[0]!='a' && zType[0]!='c'),0); } | | | | | 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 | } if( advancedMenu ){ if( zType[0]=='a' || zType[0]=='c' ){ style_submenu_checkbox("unhide", "Unhide", 0, 0); } style_submenu_checkbox("v", "Files",(zType[0]!='a' && zType[0]!='c'),0); } style_submenu_entry("n","Max",4,0); timeline_y_submenu(disableY); if( advancedMenu ){ style_submenu_entry("t", "Tag Filter", -8, 0); style_submenu_multichoice("ms", "Match Style", count(azMatchStyles)/2,azMatchStyles,0); } } blob_zero(&cond); } if( PB("showsql") ){ @ <pre>%h(blob_sql_text(&sql))</pre> } |
︙ | ︙ | |||
3381 3382 3383 3384 3385 3386 3387 | /* ** WEBPAGE: thisdayinhistory ** ** Generate a vanity page that shows project activity for the current ** day of the year for various years in the history of the project. ** ** Query parameters: | < | 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 | /* ** WEBPAGE: thisdayinhistory ** ** Generate a vanity page that shows project activity for the current ** day of the year for various years in the history of the project. ** ** Query parameters: ** today=DATE Use DATE as today's date */ void thisdayinhistory_page(void){ static int aYearsAgo[] = { 1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50, 75, 100 }; const char *zToday; char *zStartOfProject; int i; |
︙ | ︙ |
Changes to src/tkt.c.
︙ | ︙ | |||
713 714 715 716 717 718 719 | } /* ** WEBPAGE: tktview ** URL: tktview?name=HASH ** ** View a ticket identified by the name= query parameter. | < > | 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 | } /* ** WEBPAGE: tktview ** URL: tktview?name=HASH ** ** View a ticket identified by the name= query parameter. ** ** Other query parameters: ** tl Show a timeline of the ticket above the status */ void tktview_page(void){ const char *zScript; char *zFullName; const char *zUuid = PD("name",""); int showTimeline = P("tl")!=0; |
︙ | ︙ | |||
1192 1193 1194 1195 1196 1197 1198 | /* ** WEBPAGE: tkttimeline ** URL: /tkttimeline/TICKETUUID ** ** Show the change history for a single ticket in timeline format. ** ** Query parameters: | < | 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 | /* ** WEBPAGE: tkttimeline ** URL: /tkttimeline/TICKETUUID ** ** Show the change history for a single ticket in timeline format. ** ** Query parameters: ** y=ci Show only check-ins associated with the ticket */ void tkttimeline_page(void){ char *zTitle; const char *zUuid; int tagid; char zGlobPattern[50]; |
︙ | ︙ | |||
1473 1474 1475 1476 1477 1478 1479 | /* ** COMMAND: ticket* ** ** Usage: %fossil ticket SUBCOMMAND ... ** ** Run various subcommands to control tickets | < > > > | | > > > > < < < < < < < < < < < < < < < < < < < < < | 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 | /* ** COMMAND: ticket* ** ** Usage: %fossil ticket SUBCOMMAND ... ** ** Run various subcommands to control tickets ** > fossil ticket show (REPORTTITLE|REPORTNR) ?TICKETFILTER? ?OPTIONS? ** Run the ticket report, identified by the report format title ** used in the GUI. The data is written as flat file on stdout, ** using TAB as separator. ** ** Options: ** -l|--limit LIMITCHAR Specify a different separator ** -q|--quote If --quote is used, the tickets are encoded by quoting special ** chars (space -> \\s, tab -> \\t, newline -> \\n, cr -> \\r, ** formfeed -> \\f, vtab -> \\v, nul -> \\0, \\ -> \\\\). ** Otherwise, the simplified encoding as on the show report raw page ** in the GUI is used. This has no effect in JSON mode. ** -R|--repository REPO ** ** If TICKETFILTER is given on the commandline, the query is ** limited with a new WHERE-condition. ** example: Report lists a column # with the uuid ** TICKETFILTER may be [#]='uuuuuuuuu' ** example: Report only lists rows with status not open ** TICKETFILTER: status != 'open' ** ** Instead of the report title it's possible to use the report ** number; the special report number 0 lists all columns defined in ** the ticket table. ** > fossil ticket list fields ** > fossil ticket ls fields ** List all fields defined for ticket in the fossil repository. ** > fossil ticket list reports ** > fossil ticket ls reports ** List all ticket reports defined in the fossil repository. ** > fossil ticket set TICKETUUID (FIELD VALUE)+ ?-q|--quote? ** > fossil ticket change TICKETUUID (FIELD VALUE)+ ?-q|--quote? ** Change ticket identified by TICKETUUID to set the values of ** each field FIELD to VALUE. ** ** Field names as defined in the TICKET table. By default, these ** names include: type, status, subsystem, priority, severity, foundin, ** resolution, title, and comment, but other field names can be added ** or substituted in customized installations. ** ** If you use +FIELD, the VALUE is appended to the field FIELD. You ** can use more than one field/value pair on the commandline. Using ** --quote enables the special character decoding as in "ticket ** show", which allows setting multiline text or text with special ** characters. ** > fossil ticket add FIELD VALUE ?FIELD VALUE .. ? ?-q|--quote? ** Like set, but create a new ticket with the given values. ** > fossil ticket history TICKETUUID ** Show the complete change history for the ticket ** ** Note that the values in set|add are not validated against the ** definitions given in "Ticket Common Script". */ void ticket_cmd(void){ int n; |
︙ | ︙ |
Changes to src/tktsetup.c.
︙ | ︙ | |||
151 152 153 154 155 156 157 | db_set(zDbField/*works-like:"x"*/, z, 0); if( xRebuild ) xRebuild(); cgi_redirect("tktsetup"); } } @ <form action="%R/%s(g.zPath)" method="post"><div> login_insert_csrf_secret(); | | | | 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | db_set(zDbField/*works-like:"x"*/, z, 0); if( xRebuild ) xRebuild(); cgi_redirect("tktsetup"); } } @ <form action="%R/%s(g.zPath)" method="post"><div> login_insert_csrf_secret(); @ <p><label for="x">%s(zDesc)</label></p> @ <textarea id="x" name="x" rows="%d(height)" cols="80">%h(z)</textarea> @ <blockquote><p> @ <input type="submit" name="submit" value="Apply Changes" /> @ <input type="submit" name="clear" value="Revert To Default" /> @ <input type="submit" name="setup" value="Cancel" /> @ </p></blockquote> @ </div></form> @ <hr /> |
︙ | ︙ | |||
322 323 324 325 326 327 328 | @ set preview 1 @ } @ </th1> @ <h1 style="text-align: center;">Enter A New Ticket</h1> @ <table cellpadding="5"> @ <tr> @ <td colspan="3"> | | | | | | | | | | | | | 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 | @ set preview 1 @ } @ </th1> @ <h1 style="text-align: center;">Enter A New Ticket</h1> @ <table cellpadding="5"> @ <tr> @ <td colspan="3"> @ <label>Enter a one-line summary of the ticket:<br /> @ <input type="text" name="title" size="60" value="$<title>" /></label> @ </td> @ </tr> @ @ <tr> @ <td align="right"><label for="type">Type:</label></td> @ <td align="left"><th1>combobox type $type_choices 1</th1></td> @ <td align="left">What type of ticket is this?</td> @ </tr> @ @ <tr> @ <td align="right"><label for="foundin">Version:</label></td> @ <td align="left"> @ <input type="text" id="foundin" name="foundin" size="20" value="$<foundin>" /> @ </td> @ <td align="left">In what version or build number do you observe @ the problem?</td> @ </tr> @ @ <tr> @ <td align="right"><label for="severity">Severity:</label></td> @ <td align="left"><th1>combobox severity $severity_choices 1</th1></td> @ <td align="left">How debilitating is the problem? How badly does the problem @ affect the operation of the product?</td> @ </tr> @ @ <tr> @ <td align="right"><label for="private_contact">EMail:</label></td> @ <td align="left"> @ <input type="text" id="private_contact" name="private_contact" value="$<private_contact>" @ size="30" /> @ </td> @ <td align="left"><u>Not publicly visible</u> @ Used by developers to contact you with questions.</td> @ </tr> @ @ <tr> @ <td colspan="3"> @ <label for="icomment">Enter a detailed description of the problem.</label> @ For code defects, be sure to provide details on exactly how @ the problem can be reproduced. Provide as much detail as @ possible. <label for="mutype">Format:</label> @ <th1>combobox mutype {HTML {[links only]} Markdown {Plain Text} Wiki} 1</th1> @ <br /> @ <th1>set nline [linecount $comment 50 10]</th1> @ <textarea id="icomment" name="icomment" cols="80" rows="$nline" @ wrap="virtual" class="wikiedit">$<icomment></textarea><br /> @ </tr> @ @ <th1>enable_output [info exists preview]</th1> @ <tr><td colspan="3"> @ Description Preview:<br /><hr /> @ <th1> |
︙ | ︙ | |||
613 614 615 616 617 618 619 | @ set mimetype text/plain @ } @ submit_ticket @ set preview 1 @ } @ </th1> @ <table cellpadding="5"> | | | | | | | | | | | | > | | | | | | 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 | @ set mimetype text/plain @ } @ submit_ticket @ set preview 1 @ } @ </th1> @ <table cellpadding="5"> @ <tr><td class="tktDspLabel"><label for="title">Title:</label></td><td> @ <input type="text" id="title" name="title" value="$<title>" size="60" /> @ </td></tr> @ @ <tr><td class="tktDspLabel"><label for="status">Status:</label></td><td> @ <th1>combobox status $status_choices 1</th1> @ </td></tr> @ @ <tr><td class="tktDspLabel"><label for="type">Type:</label></td><td> @ <th1>combobox type $type_choices 1</th1> @ </td></tr> @ @ <tr><td class="tktDspLabel"><label for="severity">Severity:</label></td><td> @ <th1>combobox severity $severity_choices 1</th1> @ </td></tr> @ @ <tr><td class="tktDspLabel"><label for="priority">Priority:</label></td><td> @ <th1>combobox priority $priority_choices 1</th1> @ </td></tr> @ @ <tr><td class="tktDspLabel"><label for="resolution">Resolution:</label></td><td> @ <th1>combobox resolution $resolution_choices 1</th1> @ </td></tr> @ @ <tr><td class="tktDspLabel"><label for="subsystem">Subsystem:</label></td><td> @ <th1>combobox subsystem $subsystem_choices 1</th1> @ </td></tr> @ @ <th1>enable_output [hascap e]</th1> @ <tr><td class="tktDspLabel"><label for="private_contact">Contact:</label></td><td> @ <input type="text" id="private_contact" name="private_contact" size="40" @ value="$<private_contact>" /> @ </td></tr> @ <th1>enable_output 1</th1> @ @ <tr><td class="tktDspLabel"><label for="foundin"> @ Version Found In:</label></td><td> @ <input type="text" id="foundin" name="foundin" size="50" value="$<foundin>" /> @ </td></tr> @ @ <tr><td colspan="2"> @ <label for="icomment">Append Remark</label> with <label for="mutype">format</label> @ <th1>combobox mutype {HTML {[links only]} Markdown {Plain Text} Wiki} 1</th1> @ <label for="username">from</label> @ <input type="text" id="username" name="username" value="$<username>" size="30" />:<br /> @ <textarea id="icomment" name="icomment" cols="80" rows="15" @ wrap="virtual" class="wikiedit">$<icomment></textarea> @ </td></tr> @ @ <th1>enable_output [info exists preview]</th1> @ <tr><td colspan="2"> @ Description Preview:<br /><hr /> @ <th1> |
︙ | ︙ |
Changes to src/unversioned.c.
︙ | ︙ | |||
228 229 230 231 232 233 234 | ** ** Unversioned files (UV-files) are artifacts that are synced and are available ** for download but which do not preserve history. Only the most recent version ** of each UV-file is retained. Changes to an UV-file are permanent and cannot ** be undone, so use appropriate caution with this command. ** ** Subcommands: | < < < < < < | > < < | > < < < | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 | ** ** Unversioned files (UV-files) are artifacts that are synced and are available ** for download but which do not preserve history. Only the most recent version ** of each UV-file is retained. Changes to an UV-file are permanent and cannot ** be undone, so use appropriate caution with this command. ** ** Subcommands: ** add FILE ... Add or update one or more unversioned files in ** the local repository so that they match FILEs ** on disk. Changes are not pushed to other ** repositories until the next sync. ** add FILE --as UVFILE Add or update a single file named FILE on disk ** and UVFILE in the repository unversioned file ** namespace. This variant of the 'add' command allows ** the name to be different in the repository versus ** what appears on disk, but it only allows adding ** a single file at a time. ** cat FILE ... Concatenate the content of FILEs to stdout. ** edit FILE Bring up FILE in a text editor for modification. ** export FILE OUTPUT Write the content of FILE into OUTPUT on disk ** list | ls Show all unversioned files held in the local ** repository. ** ** Options: ** --glob PATTERN Show only files that match ** --like PATTERN Show only files that match ** -l Show additional details for ** files that match. Implied ** when 'list' is used. ** revert ?URL? Restore the state of all unversioned files in the ** local repository to match the remote repository ** URL. ** ** Options: ** -v|--verbose Extra diagnostic output ** -n|--dry-run Show what would have happened ** remove|rm|delete FILE ... ** Remove unversioned files from the local repository. ** Changes are not pushed to other repositories until ** the next sync. ** ** Options: ** --glob PATTERN Remove files that match ** --like PATTERN Remove files that match ** sync ?URL? Synchronize the state of all unversioned files with ** the remote repository URL. The most recent version ** of each file is propagated to all repositories and ** all prior versions are permanently forgotten. ** ** Options: ** -v|--verbose Extra diagnostic output ** -n|--dry-run Show what would have happened ** touch FILE ... Update the TIMESTAMP on all of the listed files ** ** Options: ** --mtime TIMESTAMP Use TIMESTAMP instead of "now" for the "add", ** "edit", "remove", and "touch" subcommands. ** -R|--repository REPO Use FILE as the repository */ void unversioned_cmd(void){ const char *zCmd; int nCmd; |
︙ | ︙ | |||
521 522 523 524 525 526 527 | } } /* ** WEBPAGE: uvlist ** ** Display a list of all unversioned files in the repository. | < > | 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | } } /* ** WEBPAGE: uvlist ** ** Display a list of all unversioned files in the repository. ** ** Query parameters: ** byage=1 Order the initial display be decreasing age ** showdel=0 Show deleted files */ void uvlist_page(void){ Stmt q; sqlite3_int64 iNow; sqlite3_int64 iTotalSz = 0; |
︙ | ︙ |
Changes to src/user.c.
︙ | ︙ | |||
315 316 317 318 319 320 321 | /* ** COMMAND: user* ** ** Usage: %fossil user SUBCOMMAND ... ?-R|--repository REPO? ** ** Run various subcommands on users of the open repository or of ** the repository identified by the -R or --repository option. | < < < < < < < < < < < < | 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | /* ** COMMAND: user* ** ** Usage: %fossil user SUBCOMMAND ... ?-R|--repository REPO? ** ** Run various subcommands on users of the open repository or of ** the repository identified by the -R or --repository option. ** > fossil user capabilities USERNAME ?STRING? ** Query or set the capabilities for user USERNAME ** > fossil user contact USERNAME ?CONTACT-INFO? ** Query or set contact information for user USERNAME ** > fossil user default ?USERNAME? ** Query or set the default user. The default user is the ** user for command-line interaction. ** > fossil user list ** > fossil user ls ** List all users known to the repository ** > fossil user new ?USERNAME? ?CONTACT-INFO? ?PASSWORD? ** Create a new user in the repository. Users can never be ** deleted. They can be denied all access but they must continue ** to exist in the database. ** > fossil user password USERNAME ?PASSWORD? ** Change the web access password for a user. */ void user_cmd(void){ int n; db_find_and_open_repository(0, 0); if( g.argc<3 ){ usage("capabilities|contact|default|list|new|password ..."); |
︙ | ︙ | |||
616 617 618 619 620 621 622 | ** COMMAND: test-prompt-password ** ** Usage: %fossil test-prompt-password PROMPT VERIFY ** ** Prompts the user for a password and then prints it verbatim. ** ** Behavior is controlled by the VERIFY parameter: | < < < < < | 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 | ** COMMAND: test-prompt-password ** ** Usage: %fossil test-prompt-password PROMPT VERIFY ** ** Prompts the user for a password and then prints it verbatim. ** ** Behavior is controlled by the VERIFY parameter: ** 0 Just ask once. ** 1 If the first answer is a non-empty string, ask for ** verification. Repeat if the two strings do not match. ** 2 Ask twice, repeat if the strings do not match. */ void test_prompt_password_cmd(void){ Blob answer; int iVerify = 0; if( g.argc!=4 ) usage("PROMPT VERIFY"); iVerify = atoi(g.argv[3]); prompt_for_password(g.argv[2], &answer, iVerify); fossil_print("[%s]\n", blob_str(&answer)); } /* ** WEBPAGE: access_log ** ** Show login attempts, including timestamp and IP address. ** Requires Admin privileges. ** ** Query parameters: ** y=N 1: success only. 2: failure only. 3: both (default: 3) ** n=N Number of entries to show (default: 200) ** o=N Skip this many entries (default: 0) */ void access_log_page(void){ int y = atoi(PD("y","3")); int n = atoi(PD("n","200")); |
︙ | ︙ |
Changes to src/wiki.c.
︙ | ︙ | |||
521 522 523 524 525 526 527 | /* ** WEBPAGE: wiki ** ** Display a wiki page. Example: /wiki?name=PAGENAME ** ** Query parameters: | < | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 | /* ** WEBPAGE: wiki ** ** Display a wiki page. Example: /wiki?name=PAGENAME ** ** Query parameters: ** name=NAME Name of the wiki page to display. Required. ** nsm Omit the submenu if present. (Mnemonic: No SubMenu) ** p Always show just the wiki page. For special ** pages for check-ins, branches, or tags, there will ** be a redirect to the associated /info page unless ** this query parameter is present. ** popup Suppress the header and footer and other page |
︙ | ︙ | |||
648 649 650 651 652 653 654 | /* ** Output a selection box from which the user can select the ** wiki mimetype. */ void mimetype_option_menu(const char *zMimetype){ unsigned i; | | | 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 | /* ** Output a selection box from which the user can select the ** wiki mimetype. */ void mimetype_option_menu(const char *zMimetype){ unsigned i; @ <select id="mimetype" name="mimetype" size="1"> for(i=0; i<count(azStyles); i+=3){ if( fossil_strcmp(zMimetype,azStyles[i])==0 ){ @ <option value="%s(azStyles[i])" selected>%s(azStyles[i+1])</option> }else{ @ <option value="%s(azStyles[i])">%s(azStyles[i+1])</option> } } |
︙ | ︙ | |||
1331 1332 1333 1334 1335 1336 1337 | "data-tab-parent='wikiedit-tabs' " "data-tab-label='Editor' " "class='hidden'" ">"); CX("<div class='" "wikiedit-options flex-container flex-row child-gap-small'>"); CX("<div class='input-with-label'>" | | | | 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 | "data-tab-parent='wikiedit-tabs' " "data-tab-label='Editor' " "class='hidden'" ">"); CX("<div class='" "wikiedit-options flex-container flex-row child-gap-small'>"); CX("<div class='input-with-label'>" "<label>Mime type "); mimetype_option_menu("text/x-markdown"); CX("</label></div>"); style_select_list_int("select-font-size", "editor_font_size", "Editor font size", NULL/*tooltip*/, 100, "100%", 100, "125%", 125, "150%", 150, "175%", 175, "200%", 200, NULL); |
︙ | ︙ | |||
1368 1369 1370 1371 1372 1373 1374 | "a few seconds or it will not reload." "</div>" "</div>"); CX("</div>"); CX("<div class='flex-container flex-column stretch'>"); CX("<textarea name='content' id='wikiedit-content-editor' " | | | 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 | "a few seconds or it will not reload." "</div>" "</div>"); CX("</div>"); CX("<div class='flex-container flex-column stretch'>"); CX("<textarea name='content' id='wikiedit-content-editor' " "class='wikiedit' rows='25' aria-label='Content' title='Content'>"); CX("</textarea>"); CX("</div>"/*textarea wrapper*/); CX("</div>"/*#tab-file-content*/); } /****** Preview tab ******/ { CX("<div id='wikiedit-tab-preview' " |
︙ | ︙ | |||
1530 1531 1532 1533 1534 1535 1536 | } style_set_current_feature("wiki"); style_header("Create A New Wiki Page"); wiki_standard_submenu(W_ALL_BUT(W_NEW)); @ <p>Rules for wiki page names:</p> well_formed_wiki_name_rules(); form_begin(0, "%R/wikinew"); | | | > | > | | 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 | } style_set_current_feature("wiki"); style_header("Create A New Wiki Page"); wiki_standard_submenu(W_ALL_BUT(W_NEW)); @ <p>Rules for wiki page names:</p> well_formed_wiki_name_rules(); form_begin(0, "%R/wikinew"); @ <p><label>Name of new wiki page: @ <input style="width: 35;" type="text" name="name" value="%h(zName)" /></label><br /> @ <label>Markup style @ %z(href("%R/markup_help")) @ <span class="help-buttonlet processed" title="Help"></span></a>: mimetype_option_menu("text/x-markdown"); @ </label><br /><input type="submit" value="Create" /> @ </p></form> if( zName[0] ){ @ <p><span class="wikiError"> @ "%h(zName)" is not a valid wiki page name!</span></p> } style_finish_page(); } |
︙ | ︙ | |||
1691 1692 1693 1694 1695 1696 1697 | blob_reset(&preview); } zUser = PD("u", g.zLogin); form_begin(0, "%R/wikiappend"); login_insert_csrf_secret(); @ <input type="hidden" name="name" value="%h(zPageName)" /> @ <input type="hidden" name="mimetype" value="%h(zMimetype)" /> | | | | | < | 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 | blob_reset(&preview); } zUser = PD("u", g.zLogin); form_begin(0, "%R/wikiappend"); login_insert_csrf_secret(); @ <input type="hidden" name="name" value="%h(zPageName)" /> @ <input type="hidden" name="mimetype" value="%h(zMimetype)" /> @ <label>Your Name: @ <input type="text" name="u" size="20" value="%h(zUser)" /></label><br /> zFormat = mimetype_common_name(zMimetype); @ <label>Comment to append (formatted as %s(zFormat)):<br /> @ <textarea name="r" class="wikiedit" cols="80" @ rows="10" wrap="virtual">%h(PD("r",""))</textarea></label> @ <br /> @ <input type="submit" name="preview" value="Preview Your Comment" /> @ <input type="submit" name="submit" value="Append Your Changes" /> @ <input type="submit" name="cancel" value="Cancel" /> captcha_generate(0); @ </form> manifest_destroy(pWiki); style_finish_page(); } /* ** WEBPAGE: whistory ** URL: /whistory?name=PAGENAME ** ** Additional parameters: ** showid Show RID values ** ** Show the complete change history for a single wiki page. */ void whistory_page(void){ Stmt q; const char *zPageName; |
︙ | ︙ | |||
1805 1806 1807 1808 1809 1810 1811 | /* ** WEBPAGE: wdiff ** ** Show the changes to a wiki page. ** ** Query parameters: | < | 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 | /* ** WEBPAGE: wdiff ** ** Show the changes to a wiki page. ** ** Query parameters: ** id=HASH Hash prefix for the child version to be diffed. ** rid=INTEGER RecordID for the child version ** pid=HASH Hash prefix for the parent. ** ** The "id" query parameter is required. "pid" is optional. If "pid" ** is omitted, then the diff is against the first parent of the child. */ |
︙ | ︙ | |||
2124 2125 2126 2127 2128 2129 2130 | /* ** COMMAND: wiki* ** ** Usage: %fossil wiki (export|create|commit|list) WikiName ** ** Run various subcommands to work with wiki entries or tech notes. | < < < < | 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 | /* ** COMMAND: wiki* ** ** Usage: %fossil wiki (export|create|commit|list) WikiName ** ** Run various subcommands to work with wiki entries or tech notes. ** > fossil wiki export ?OPTIONS? PAGENAME ?FILE? ** > fossil wiki export ?OPTIONS? -t|--technote DATETIME|TECHNOTE-ID|TAG ?FILE? ** Sends the latest version of either a wiki page or of a tech ** note to the given file or standard output. A filename of "-" ** writes the output to standard output. The directory parts of ** the output filename are created if needed. ** If PAGENAME is provided, the named wiki page will be output. ** ** Options: ** -t|--technote DATETIME|TECHNOTE-ID|TAG ** Specifies that a technote, rather than a wiki page, ** will be exported. If DATETIME is used, the most ** recently modified tech note with that DATETIME will ** output. If TAG is used, the most recently modified ** tech note with that TAG will be output. ** -h|--html The body (only) is rendered in HTML form, without ** any page header/foot or HTML/BODY tag wrappers. ** -H|--HTML Works like -h|-html but wraps the output in ** <html><body>...</body></html>. ** -p|--pre If -h|-H is used and the page or technote has ** the text/plain mimetype, its HTML-escaped output ** will be wrapped in <pre>...</pre>. ** > fossil wiki (create|commit) (PAGENAME | TECHNOTE-COMMENT) ?FILE? ?OPTIONS? ** Create a new or commit changes to an existing wiki page or ** technote from FILE or from standard input. PAGENAME is the ** name of the wiki entry. TECHNOTE-COMMENT is the timeline comment of ** the technote. ** ** Options: ** -M|--mimetype TEXT-FORMAT The mime type of the update. |
︙ | ︙ | |||
2180 2181 2182 2183 2184 2185 2186 | ** will be updated. ** -t|--technote TECHNOTE-ID Specifies the technote to be ** updated by its technote id, which is ** its UUID. ** --technote-tags TAGS The set of tags for a technote. ** --technote-bgcolor COLOR The color used for the technote ** on the timeline. | < < < | 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 | ** will be updated. ** -t|--technote TECHNOTE-ID Specifies the technote to be ** updated by its technote id, which is ** its UUID. ** --technote-tags TAGS The set of tags for a technote. ** --technote-bgcolor COLOR The color used for the technote ** on the timeline. ** > fossil wiki list ?OPTIONS? ** > fossil wiki ls ?OPTIONS? ** Lists all wiki entries, one per line, ordered ** case-insensitively by name. Wiki pages associated with ** check-ins and branches are NOT shown, unless -a is given. ** ** Options: ** --all Include "deleted" pages in output. ** By default deleted pages are elided. ** -t|--technote Technotes will be listed instead of ** pages. The technotes will be in order ** of timestamp with the most recent ** first. ** -a|--show-associated Show wiki pages associated with ** check-ins and branches. ** -s|--show-technote-ids The id of the tech note will be listed ** along side the timestamp. The tech note ** id will be the first word on each line. ** This option only applies if the ** --technote option is also specified. ** DATETIME may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in ** year-month-day form, it may be truncated, the "T" may be replaced by ** a space, and it may also name a timezone offset from UTC as "-HH:MM" ** (westward) or "+HH:MM" (eastward). Either no timezone suffix or "Z" ** means UTC. ** ** The "Sandbox" wiki pseudo-page is a special case. Its name is |
︙ | ︙ |
Changes to src/wikiformat.c.
︙ | ︙ | |||
1894 1895 1896 1897 1898 1899 1900 | /* ** COMMAND: test-markdown-render ** ** Usage: %fossil test-markdown-render FILE ... ** ** Render markdown in FILE as HTML on stdout. | < > | 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 | /* ** COMMAND: test-markdown-render ** ** Usage: %fossil test-markdown-render FILE ... ** ** Render markdown in FILE as HTML on stdout. ** ** Options: ** --safe Restrict the output to use only "safe" HTML ** --lint-footnotes Print stats for footnotes-related issues */ void test_markdown_render(void){ Blob in, out; int i; int bSafe = 0, bFnLint = 0; |
︙ | ︙ | |||
2767 2768 2769 2770 2771 2772 2773 | /* ** SETTING: safe-html width=8 ** This setting controls whether or not unsafe HTML elements ** (such as SCRIPT or STYLE tags) are allowed in Markdown-formatted ** documents. Unsafe HTML is disabled by default. If this setting ** exists and is a string, then letters in that string can enable ** unsafe HTML in various contexts: | < | 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 | /* ** SETTING: safe-html width=8 ** This setting controls whether or not unsafe HTML elements ** (such as SCRIPT or STYLE tags) are allowed in Markdown-formatted ** documents. Unsafe HTML is disabled by default. If this setting ** exists and is a string, then letters in that string can enable ** unsafe HTML in various contexts: ** - b Unsafe HTML allowed in embedded documentation ** - f Unsafe HTML allowed in forum posts ** - t Unsafe HTML allowed in tickets ** - w Unsafe HTML allowed on wiki pages */ /* ** The input blob contains HTML. If safe-html is enabled, then |
︙ | ︙ |
Changes to src/xfer.c.
︙ | ︙ | |||
1870 1871 1872 1873 1874 1875 1876 | ** The complete HTTP requests are stored in files named "http-request-N.txt". ** Find one of those requests, remove the HTTP header, and make other edits ** as necessary to generate an appropriate XFERFILE test case. Then run: ** ** fossil test-xfer xferfile.txt ** ** Options: | < | 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 | ** The complete HTTP requests are stored in files named "http-request-N.txt". ** Find one of those requests, remove the HTTP header, and make other edits ** as necessary to generate an appropriate XFERFILE test case. Then run: ** ** fossil test-xfer xferfile.txt ** ** Options: ** --host HOSTNAME Supply a server hostname used to populate ** g.zBaseURL and similar. */ void cmd_test_xfer(void){ const char *zHost; db_find_and_open_repository(0,0); zHost = find_option("host",0,1); |
︙ | ︙ |
Changes to src/xfersetup.c.
︙ | ︙ | |||
134 135 136 137 138 139 140 | db_set(zDbField/*works-like:"x"*/, z, 0); if( xRebuild ) xRebuild(); cgi_redirect("xfersetup"); } } @ <form action="%R/%s(g.zPath)" method="post"><div> login_insert_csrf_secret(); | | | | 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | db_set(zDbField/*works-like:"x"*/, z, 0); if( xRebuild ) xRebuild(); cgi_redirect("xfersetup"); } } @ <form action="%R/%s(g.zPath)" method="post"><div> login_insert_csrf_secret(); @ <p><label for="x">%s(zDesc)</label></p> @ <textarea id="x" name="x" rows="%d(height)" cols="80">%h(z)</textarea> @ <p> @ <input type="submit" name="submit" value="Apply Changes" /> @ <input type="submit" name="clear" value="Revert To Default" /> @ <input type="submit" name="setup" value="Cancel" /> @ </p> @ </div></form> if ( zDfltValue ){ |
︙ | ︙ |
Changes to src/zip.c.
︙ | ︙ | |||
868 869 870 871 872 873 874 | ** ** Generate a ZIP or SQL archive for the check-in specified by the "r" ** query parameter. Return the archive as the HTTP reply content. ** ** If the NAME contains one "/" then the part before the "/" is taken ** as the TAG and the part after the "/" becomes the true name. Hence, ** the following URLs are all equivalent: | < < < < < | 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 | ** ** Generate a ZIP or SQL archive for the check-in specified by the "r" ** query parameter. Return the archive as the HTTP reply content. ** ** If the NAME contains one "/" then the part before the "/" is taken ** as the TAG and the part after the "/" becomes the true name. Hence, ** the following URLs are all equivalent: ** /sqlar/508c42a6398f8/download.sqlar ** /sqlar?r=508c42a6398f8&name=download.sqlar ** /sqlar/download.sqlar?r=508c42a6398f8 ** /sqlar?name=508c42a6398f8/download.sqlar ** ** Query parameters: ** name=NAME The base name of the output file. The default ** value is a configuration parameter in the project ** settings. A prefix of the name, omitting the ** extension, is used as the top-most directory name. ** r=TAG The check-in that is turned into a ZIP archive. ** Defaults to "trunk". This query parameter used to ** be called "uuid" and the older "uuid" name is still ** accepted for backwards compatibility. If this ** query parameter is omitted, the latest "trunk" ** check-in is used. ** in=PATTERN Only include files that match the comma-separate ** list of GLOB patterns in PATTERN, as with ex= ** ex=PATTERN Omit any file that match PATTERN. PATTERN is a ** comma-separated list of GLOB patterns, where each ** pattern can optionally be quoted using ".." or '..'. ** Any file matching both ex= and in= is excluded. */ void baseline_zip_page(void){ int rid; |
︙ | ︙ |
Changes to www/customskin.md.
︙ | ︙ | |||
101 102 103 104 105 106 107 | written in Markdown, leaving all other block quotes alone. In most cases, it is best to leave the Fossil-generated HTML Header alone. (One exception is when the administrator needs to include links to additional CSS files.) The configurable part of the skin begins with the Content Header section which should follow this template: | | | | | | 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | written in Markdown, leaving all other block quotes alone. In most cases, it is best to leave the Fossil-generated HTML Header alone. (One exception is when the administrator needs to include links to additional CSS files.) The configurable part of the skin begins with the Content Header section which should follow this template: <header class="header"> ... top banner and menu bar ... </div> Note that `<header class="header">` and `</div>` tags must be included in the Content Header text of the skin. In other words, you, the administrator, need to supply that text as part of your skin customization. The Fossil-generated Content section immediately follows the Content Header. The Content section will looks like this: <div class="content"> ... Fossil-generated content here ... </div> After the Content is the custom Content Footer section which should follow this template: <footer class="footer"> ... skin-specific stuff here ... </div> As with the Content Header, the template elements of the Content Footer should appear exactly as they are shown. Finally, Fossil always adds its own footer (unless overridden) to close out the generated HTML: </body> </html> ## <a id="mainmenu"></a>Changing the Main Menu Contents As of Fossil 2.15, the actual text content of the skin’s main menu is no longer part of the skin proper if you’re using one of the stock skins. If you look at the Header section of the skin, you’ll find a `<nav class="mainmenu">` element whose contents are set by a short [TH1](./th1.md) script from the contents of the **Main Menu** section of the Setup → Configuration screen. This feature allows the main menu contents to stay the same across different skins, so you no longer have to reapply menu customizations when trying different skins. |
︙ | ︙ | |||
332 333 334 335 336 337 338 | * Text of the form "$NAME" or "$<NAME>" is replaced with the value of the TH1 variable NAME. For example, first few lines of a typical Content Header will look like this: | | | | 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 | * Text of the form "$NAME" or "$<NAME>" is replaced with the value of the TH1 variable NAME. For example, first few lines of a typical Content Header will look like this: <header class="header"> <div class="title"><h1>$<project_name></h1>$<title>/div> After variables are substituted by TH1, that will look more like this: <header class="header"> <div class="title"><h1>Project Name</h1>Page Title</div> As you can see, two TH1 variable substitutions were done. The same TH1 interpreter is used for both the header and the footer and for all scripts contained within them both. Hence, any global TH1 variables that are set by the header are available to the footer. |
︙ | ︙ | |||
373 374 375 376 377 378 379 | "builtin_request_js hbmenu.js" asks Fossil to include the "hbmenu.js" resource files in the Fossil-generated footer. The hbmenu.js script requires the following `<div>` element somewhere in your header, in which to build the hamburger menu. | | | | | | | 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 | "builtin_request_js hbmenu.js" asks Fossil to include the "hbmenu.js" resource files in the Fossil-generated footer. The hbmenu.js script requires the following `<div>` element somewhere in your header, in which to build the hamburger menu. <nav id='hbdrop'></nav> Out of the box, the contents of the panel is populated with the [Site Map](/sitemap), but only if the panel does not already contain any HTML elements (that is, not just comments, plain text or non-presentational white space). So the hamburger menu can be customized by replacing the empty `<nav id='hbdrop'></nav>` element with a menu structure knitted according to the following template: <nav id="hbdrop" data-anim-ms="400"> <ul class="columns" style="column-width: 20em; column-count: auto"> <!-- NEW GROUP WITH HEADING LINK --> <li> <a href="$home$index_page">Link: Home</a> <ul> <li><a href="$home/timeline">Link: Timeline</a></li> <li><a href="$home/dir?ci=tip">Link: File List</a></li> </ul> </li> <!-- NEW GROUP WITH HEADING TEXT --> <li> Heading Text <ul> <li><a href="$home/doc/trunk/www/customskin.md">Link: Theming</a></li> <li><a href="$home/doc/trunk/www/th1.md">Link: TH1 Scripts</a></li> </ul> </li> <!-- NEXT GROUP GOES HERE --> </ul> </nav> The custom `data-anim-ms` attribute can be added to the panel element to direct the Javascript logic to override the default menu animation duration of 400 ms. A faster animation duration of 80-200 ms may be preferred for smaller menus. The animation is disabled by setting the attribute to `"0"`. |
︙ | ︙ |