Fossil SCM
added dynamic behavior page, no special layout. Reusing the commandline help and simply listing all options
Commit
757a5e5b4e60d4f64f1b87b4f78a038dc0b96fb7
Parent
d50fe26c48264ca…
2 files changed
+46
-27
+47
M
src/db.c
+46
-27
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -1492,10 +1492,48 @@ | ||
| 1492 | 1492 | } |
| 1493 | 1493 | db_finalize(&q); |
| 1494 | 1494 | } |
| 1495 | 1495 | |
| 1496 | 1496 | |
| 1497 | +/* | |
| 1498 | +** define all settings, which can be controlled via the set/unset | |
| 1499 | +** command. var is the name of the internal configuration name for db_(un)set. | |
| 1500 | +** If var is 0, the settings name is used. | |
| 1501 | +** width is the length for the edit field on the behavior page, 0 | |
| 1502 | +** is used for on/off checkboxes. | |
| 1503 | +** The behaviour page doesn't use a special layout. It lists all | |
| 1504 | +** set-commands and displays the 'set'-help as info. | |
| 1505 | +*/ | |
| 1506 | +#if INTERFACE | |
| 1507 | +struct stControlSettings { | |
| 1508 | + char const * name; | |
| 1509 | + char const * var; | |
| 1510 | + int width; | |
| 1511 | + char const * def; | |
| 1512 | +}; | |
| 1513 | +#endif /* INTERFACE */ | |
| 1514 | +struct stControlSettings const ctrlSettings[] = { | |
| 1515 | + { "auto-captcha", "autocaptcha", 0, "0" }, | |
| 1516 | + { "auto-shun", 0, 0, "1" }, | |
| 1517 | + { "autosync", 0, 0, "0" }, | |
| 1518 | + { "binary-glob", 0, 0, "1" }, | |
| 1519 | + { "clearsign", 0, 0, "0" }, | |
| 1520 | + { "diff-command", 0, 16, "diff" }, | |
| 1521 | + { "dont-push", 0, 0, "0" }, | |
| 1522 | + { "editor", 0, 16, "" }, | |
| 1523 | + { "gdiff-command", 0, 16, "gdiff" }, | |
| 1524 | + { "ignore-glob", 0, 40, "" }, | |
| 1525 | + { "http-port", 0, 16, "8080" }, | |
| 1526 | + { "localauth", 0, 0, "0" }, | |
| 1527 | + { "mtime-changes", 0, 0, "0" }, | |
| 1528 | + { "pgp-command", 0, 32, "gpg --clearsign -o " }, | |
| 1529 | + { "proxy", 0, 32, "off" }, | |
| 1530 | + { "ssh-command", 0, 32, "" }, | |
| 1531 | + { "web-browser", 0, 32, "" }, | |
| 1532 | + { 0,0,0,0 } | |
| 1533 | +}; | |
| 1534 | + | |
| 1497 | 1535 | /* |
| 1498 | 1536 | ** COMMAND: settings |
| 1499 | 1537 | ** COMMAND: unset |
| 1500 | 1538 | ** %fossil settings ?PROPERTY? ?VALUE? ?-global? |
| 1501 | 1539 | ** %fossil unset PROPERTY ?-global? |
| @@ -1567,29 +1605,10 @@ | ||
| 1567 | 1605 | ** web browser when given a URL as an argument. |
| 1568 | 1606 | ** Defaults to "start" on windows, "open" on Mac, |
| 1569 | 1607 | ** and "firefox" on Unix. |
| 1570 | 1608 | */ |
| 1571 | 1609 | void setting_cmd(void){ |
| 1572 | - static const char *azName[] = { | |
| 1573 | - "auto-captcha", | |
| 1574 | - "auto-shun", | |
| 1575 | - "autosync", | |
| 1576 | - "binary-glob", | |
| 1577 | - "clearsign", | |
| 1578 | - "diff-command", | |
| 1579 | - "dont-push", | |
| 1580 | - "editor", | |
| 1581 | - "gdiff-command", | |
| 1582 | - "ignore-glob", | |
| 1583 | - "http-port", | |
| 1584 | - "localauth", | |
| 1585 | - "mtime-changes", | |
| 1586 | - "pgp-command", | |
| 1587 | - "proxy", | |
| 1588 | - "ssh-command", | |
| 1589 | - "web-browser", | |
| 1590 | - }; | |
| 1591 | 1610 | int i; |
| 1592 | 1611 | int globalFlag = find_option("global","g",0)!=0; |
| 1593 | 1612 | int unsetFlag = g.argv[1][0]=='u'; |
| 1594 | 1613 | db_open_config(1); |
| 1595 | 1614 | db_find_and_open_repository(0); |
| @@ -1598,28 +1617,28 @@ | ||
| 1598 | 1617 | } |
| 1599 | 1618 | if( unsetFlag && g.argc!=3 ){ |
| 1600 | 1619 | usage("PROPERTY ?-global?"); |
| 1601 | 1620 | } |
| 1602 | 1621 | if( g.argc==2 ){ |
| 1603 | - for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){ | |
| 1604 | - print_setting(azName[i]); | |
| 1622 | + for(i=0; ctrlSettings[i].name; i++){ | |
| 1623 | + print_setting(ctrlSettings[i].name); | |
| 1605 | 1624 | } |
| 1606 | 1625 | }else if( g.argc==3 || g.argc==4 ){ |
| 1607 | 1626 | const char *zName = g.argv[2]; |
| 1608 | 1627 | int n = strlen(zName); |
| 1609 | - for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){ | |
| 1610 | - if( strncmp(azName[i], zName, n)==0 ) break; | |
| 1628 | + for(i=0; ctrlSettings[i].name; i++){ | |
| 1629 | + if( strncmp(ctrlSettings[i].name, zName, n)==0 ) break; | |
| 1611 | 1630 | } |
| 1612 | - if( i>=sizeof(azName)/sizeof(azName[0]) ){ | |
| 1631 | + if( !ctrlSettings[i].name ){ | |
| 1613 | 1632 | fossil_fatal("no such setting: %s", zName); |
| 1614 | 1633 | } |
| 1615 | 1634 | if( unsetFlag ){ |
| 1616 | - db_unset(azName[i], globalFlag); | |
| 1635 | + db_unset(ctrlSettings[i].name, globalFlag); | |
| 1617 | 1636 | }else if( g.argc==4 ){ |
| 1618 | - db_set(azName[i], g.argv[3], globalFlag); | |
| 1637 | + db_set(ctrlSettings[i].name, g.argv[3], globalFlag); | |
| 1619 | 1638 | }else{ |
| 1620 | - print_setting(azName[i]); | |
| 1639 | + print_setting(ctrlSettings[i].name); | |
| 1621 | 1640 | } |
| 1622 | 1641 | }else{ |
| 1623 | 1642 | usage("?PROPERTY? ?VALUE?"); |
| 1624 | 1643 | } |
| 1625 | 1644 | } |
| 1626 | 1645 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -1492,10 +1492,48 @@ | |
| 1492 | } |
| 1493 | db_finalize(&q); |
| 1494 | } |
| 1495 | |
| 1496 | |
| 1497 | /* |
| 1498 | ** COMMAND: settings |
| 1499 | ** COMMAND: unset |
| 1500 | ** %fossil settings ?PROPERTY? ?VALUE? ?-global? |
| 1501 | ** %fossil unset PROPERTY ?-global? |
| @@ -1567,29 +1605,10 @@ | |
| 1567 | ** web browser when given a URL as an argument. |
| 1568 | ** Defaults to "start" on windows, "open" on Mac, |
| 1569 | ** and "firefox" on Unix. |
| 1570 | */ |
| 1571 | void setting_cmd(void){ |
| 1572 | static const char *azName[] = { |
| 1573 | "auto-captcha", |
| 1574 | "auto-shun", |
| 1575 | "autosync", |
| 1576 | "binary-glob", |
| 1577 | "clearsign", |
| 1578 | "diff-command", |
| 1579 | "dont-push", |
| 1580 | "editor", |
| 1581 | "gdiff-command", |
| 1582 | "ignore-glob", |
| 1583 | "http-port", |
| 1584 | "localauth", |
| 1585 | "mtime-changes", |
| 1586 | "pgp-command", |
| 1587 | "proxy", |
| 1588 | "ssh-command", |
| 1589 | "web-browser", |
| 1590 | }; |
| 1591 | int i; |
| 1592 | int globalFlag = find_option("global","g",0)!=0; |
| 1593 | int unsetFlag = g.argv[1][0]=='u'; |
| 1594 | db_open_config(1); |
| 1595 | db_find_and_open_repository(0); |
| @@ -1598,28 +1617,28 @@ | |
| 1598 | } |
| 1599 | if( unsetFlag && g.argc!=3 ){ |
| 1600 | usage("PROPERTY ?-global?"); |
| 1601 | } |
| 1602 | if( g.argc==2 ){ |
| 1603 | for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){ |
| 1604 | print_setting(azName[i]); |
| 1605 | } |
| 1606 | }else if( g.argc==3 || g.argc==4 ){ |
| 1607 | const char *zName = g.argv[2]; |
| 1608 | int n = strlen(zName); |
| 1609 | for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){ |
| 1610 | if( strncmp(azName[i], zName, n)==0 ) break; |
| 1611 | } |
| 1612 | if( i>=sizeof(azName)/sizeof(azName[0]) ){ |
| 1613 | fossil_fatal("no such setting: %s", zName); |
| 1614 | } |
| 1615 | if( unsetFlag ){ |
| 1616 | db_unset(azName[i], globalFlag); |
| 1617 | }else if( g.argc==4 ){ |
| 1618 | db_set(azName[i], g.argv[3], globalFlag); |
| 1619 | }else{ |
| 1620 | print_setting(azName[i]); |
| 1621 | } |
| 1622 | }else{ |
| 1623 | usage("?PROPERTY? ?VALUE?"); |
| 1624 | } |
| 1625 | } |
| 1626 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -1492,10 +1492,48 @@ | |
| 1492 | } |
| 1493 | db_finalize(&q); |
| 1494 | } |
| 1495 | |
| 1496 | |
| 1497 | /* |
| 1498 | ** define all settings, which can be controlled via the set/unset |
| 1499 | ** command. var is the name of the internal configuration name for db_(un)set. |
| 1500 | ** If var is 0, the settings name is used. |
| 1501 | ** width is the length for the edit field on the behavior page, 0 |
| 1502 | ** is used for on/off checkboxes. |
| 1503 | ** The behaviour page doesn't use a special layout. It lists all |
| 1504 | ** set-commands and displays the 'set'-help as info. |
| 1505 | */ |
| 1506 | #if INTERFACE |
| 1507 | struct stControlSettings { |
| 1508 | char const * name; |
| 1509 | char const * var; |
| 1510 | int width; |
| 1511 | char const * def; |
| 1512 | }; |
| 1513 | #endif /* INTERFACE */ |
| 1514 | struct stControlSettings const ctrlSettings[] = { |
| 1515 | { "auto-captcha", "autocaptcha", 0, "0" }, |
| 1516 | { "auto-shun", 0, 0, "1" }, |
| 1517 | { "autosync", 0, 0, "0" }, |
| 1518 | { "binary-glob", 0, 0, "1" }, |
| 1519 | { "clearsign", 0, 0, "0" }, |
| 1520 | { "diff-command", 0, 16, "diff" }, |
| 1521 | { "dont-push", 0, 0, "0" }, |
| 1522 | { "editor", 0, 16, "" }, |
| 1523 | { "gdiff-command", 0, 16, "gdiff" }, |
| 1524 | { "ignore-glob", 0, 40, "" }, |
| 1525 | { "http-port", 0, 16, "8080" }, |
| 1526 | { "localauth", 0, 0, "0" }, |
| 1527 | { "mtime-changes", 0, 0, "0" }, |
| 1528 | { "pgp-command", 0, 32, "gpg --clearsign -o " }, |
| 1529 | { "proxy", 0, 32, "off" }, |
| 1530 | { "ssh-command", 0, 32, "" }, |
| 1531 | { "web-browser", 0, 32, "" }, |
| 1532 | { 0,0,0,0 } |
| 1533 | }; |
| 1534 | |
| 1535 | /* |
| 1536 | ** COMMAND: settings |
| 1537 | ** COMMAND: unset |
| 1538 | ** %fossil settings ?PROPERTY? ?VALUE? ?-global? |
| 1539 | ** %fossil unset PROPERTY ?-global? |
| @@ -1567,29 +1605,10 @@ | |
| 1605 | ** web browser when given a URL as an argument. |
| 1606 | ** Defaults to "start" on windows, "open" on Mac, |
| 1607 | ** and "firefox" on Unix. |
| 1608 | */ |
| 1609 | void setting_cmd(void){ |
| 1610 | int i; |
| 1611 | int globalFlag = find_option("global","g",0)!=0; |
| 1612 | int unsetFlag = g.argv[1][0]=='u'; |
| 1613 | db_open_config(1); |
| 1614 | db_find_and_open_repository(0); |
| @@ -1598,28 +1617,28 @@ | |
| 1617 | } |
| 1618 | if( unsetFlag && g.argc!=3 ){ |
| 1619 | usage("PROPERTY ?-global?"); |
| 1620 | } |
| 1621 | if( g.argc==2 ){ |
| 1622 | for(i=0; ctrlSettings[i].name; i++){ |
| 1623 | print_setting(ctrlSettings[i].name); |
| 1624 | } |
| 1625 | }else if( g.argc==3 || g.argc==4 ){ |
| 1626 | const char *zName = g.argv[2]; |
| 1627 | int n = strlen(zName); |
| 1628 | for(i=0; ctrlSettings[i].name; i++){ |
| 1629 | if( strncmp(ctrlSettings[i].name, zName, n)==0 ) break; |
| 1630 | } |
| 1631 | if( !ctrlSettings[i].name ){ |
| 1632 | fossil_fatal("no such setting: %s", zName); |
| 1633 | } |
| 1634 | if( unsetFlag ){ |
| 1635 | db_unset(ctrlSettings[i].name, globalFlag); |
| 1636 | }else if( g.argc==4 ){ |
| 1637 | db_set(ctrlSettings[i].name, g.argv[3], globalFlag); |
| 1638 | }else{ |
| 1639 | print_setting(ctrlSettings[i].name); |
| 1640 | } |
| 1641 | }else{ |
| 1642 | usage("?PROPERTY? ?VALUE?"); |
| 1643 | } |
| 1644 | } |
| 1645 |
+47
| --- src/setup.c | ||
| +++ src/setup.c | ||
| @@ -19,10 +19,17 @@ | ||
| 19 | 19 | */ |
| 20 | 20 | #include <assert.h> |
| 21 | 21 | #include "config.h" |
| 22 | 22 | #include "setup.h" |
| 23 | 23 | |
| 24 | +/* | |
| 25 | +** The table of web pages supported by this application is generated | |
| 26 | +** automatically by the "mkindex" program and written into a file | |
| 27 | +** named "page_index.h". We include that file here to get access | |
| 28 | +** to the table. | |
| 29 | +*/ | |
| 30 | +#include "page_index.h" | |
| 24 | 31 | |
| 25 | 32 | /* |
| 26 | 33 | ** Output a single entry for a menu generated using an HTML table. |
| 27 | 34 | ** If zLink is not NULL or an empty string, then it is the page that |
| 28 | 35 | ** the menu entry will hyperlink to. If zLink is NULL or "", then |
| @@ -57,10 +64,12 @@ | ||
| 57 | 64 | "Grant privileges to individual users."); |
| 58 | 65 | setup_menu_entry("Access", "setup_access", |
| 59 | 66 | "Control access settings."); |
| 60 | 67 | setup_menu_entry("Configuration", "setup_config", |
| 61 | 68 | "Configure the WWW components of the repository"); |
| 69 | + setup_menu_entry("Behavior", "setup_behavior", | |
| 70 | + "Configure the version control part of the repository"); | |
| 62 | 71 | setup_menu_entry("Timeline", "setup_timeline", |
| 63 | 72 | "Timeline display preferences"); |
| 64 | 73 | setup_menu_entry("Tickets", "tktsetup", |
| 65 | 74 | "Configure the trouble-ticketing system for this repository"); |
| 66 | 75 | setup_menu_entry("Skins", "setup_skin", |
| @@ -841,10 +850,48 @@ | ||
| 841 | 850 | @ "0" there is no length limit.</p> |
| 842 | 851 | |
| 843 | 852 | @ <hr /> |
| 844 | 853 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 845 | 854 | @ </div></form> |
| 855 | + db_end_transaction(0); | |
| 856 | + style_footer(); | |
| 857 | +} | |
| 858 | + | |
| 859 | +/* | |
| 860 | +** WEBPAGE: setup_behavior | |
| 861 | +*/ | |
| 862 | +void setup_behavior(void){ | |
| 863 | + int i; | |
| 864 | + struct stControlSettings const * azSet; | |
| 865 | + | |
| 866 | + login_check_credentials(); | |
| 867 | + if( !g.okSetup ){ | |
| 868 | + login_needed(); | |
| 869 | + } | |
| 870 | + | |
| 871 | + style_header("SCM Behavior"); | |
| 872 | + db_begin_transaction(); | |
| 873 | + @ <form action="%s(g.zBaseURL)/setup_behavior" method="post"><div> | |
| 874 | + login_insert_csrf_secret(); | |
| 875 | + for (azSet=ctrlSettings;azSet->name;azSet++) { | |
| 876 | + if (azSet->width==0) { | |
| 877 | + /* found boolean attribute */ | |
| 878 | + onoff_attribute(azSet->name, azSet->name, azSet->var?azSet->var:azSet->name, (azSet->def[0]=='1')?1:0); | |
| 879 | + @ <hr /> | |
| 880 | + } | |
| 881 | + } | |
| 882 | + for (azSet=ctrlSettings;azSet->name;azSet++) { | |
| 883 | + if (azSet->width!=0) { | |
| 884 | + entry_attribute(azSet->name, azSet->width, azSet->name, azSet->var?azSet->var:azSet->name, (char*)azSet->def); | |
| 885 | + @ <hr /> | |
| 886 | + } | |
| 887 | + } | |
| 888 | + @ <p><input type="submit" name="submit" value="Apply Changes" /></p> | |
| 889 | + @ <hr /> | |
| 890 | + @ These settings work in the same way, as the <kbd>set</kbd> commandline:<br> | |
| 891 | + @ <pre>%s(zHelp_setting_cmd)</pre> | |
| 892 | + @ </div></form> | |
| 846 | 893 | db_end_transaction(0); |
| 847 | 894 | style_footer(); |
| 848 | 895 | } |
| 849 | 896 | |
| 850 | 897 | /* |
| 851 | 898 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -19,10 +19,17 @@ | |
| 19 | */ |
| 20 | #include <assert.h> |
| 21 | #include "config.h" |
| 22 | #include "setup.h" |
| 23 | |
| 24 | |
| 25 | /* |
| 26 | ** Output a single entry for a menu generated using an HTML table. |
| 27 | ** If zLink is not NULL or an empty string, then it is the page that |
| 28 | ** the menu entry will hyperlink to. If zLink is NULL or "", then |
| @@ -57,10 +64,12 @@ | |
| 57 | "Grant privileges to individual users."); |
| 58 | setup_menu_entry("Access", "setup_access", |
| 59 | "Control access settings."); |
| 60 | setup_menu_entry("Configuration", "setup_config", |
| 61 | "Configure the WWW components of the repository"); |
| 62 | setup_menu_entry("Timeline", "setup_timeline", |
| 63 | "Timeline display preferences"); |
| 64 | setup_menu_entry("Tickets", "tktsetup", |
| 65 | "Configure the trouble-ticketing system for this repository"); |
| 66 | setup_menu_entry("Skins", "setup_skin", |
| @@ -841,10 +850,48 @@ | |
| 841 | @ "0" there is no length limit.</p> |
| 842 | |
| 843 | @ <hr /> |
| 844 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 845 | @ </div></form> |
| 846 | db_end_transaction(0); |
| 847 | style_footer(); |
| 848 | } |
| 849 | |
| 850 | /* |
| 851 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -19,10 +19,17 @@ | |
| 19 | */ |
| 20 | #include <assert.h> |
| 21 | #include "config.h" |
| 22 | #include "setup.h" |
| 23 | |
| 24 | /* |
| 25 | ** The table of web pages supported by this application is generated |
| 26 | ** automatically by the "mkindex" program and written into a file |
| 27 | ** named "page_index.h". We include that file here to get access |
| 28 | ** to the table. |
| 29 | */ |
| 30 | #include "page_index.h" |
| 31 | |
| 32 | /* |
| 33 | ** Output a single entry for a menu generated using an HTML table. |
| 34 | ** If zLink is not NULL or an empty string, then it is the page that |
| 35 | ** the menu entry will hyperlink to. If zLink is NULL or "", then |
| @@ -57,10 +64,12 @@ | |
| 64 | "Grant privileges to individual users."); |
| 65 | setup_menu_entry("Access", "setup_access", |
| 66 | "Control access settings."); |
| 67 | setup_menu_entry("Configuration", "setup_config", |
| 68 | "Configure the WWW components of the repository"); |
| 69 | setup_menu_entry("Behavior", "setup_behavior", |
| 70 | "Configure the version control part of the repository"); |
| 71 | setup_menu_entry("Timeline", "setup_timeline", |
| 72 | "Timeline display preferences"); |
| 73 | setup_menu_entry("Tickets", "tktsetup", |
| 74 | "Configure the trouble-ticketing system for this repository"); |
| 75 | setup_menu_entry("Skins", "setup_skin", |
| @@ -841,10 +850,48 @@ | |
| 850 | @ "0" there is no length limit.</p> |
| 851 | |
| 852 | @ <hr /> |
| 853 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 854 | @ </div></form> |
| 855 | db_end_transaction(0); |
| 856 | style_footer(); |
| 857 | } |
| 858 | |
| 859 | /* |
| 860 | ** WEBPAGE: setup_behavior |
| 861 | */ |
| 862 | void setup_behavior(void){ |
| 863 | int i; |
| 864 | struct stControlSettings const * azSet; |
| 865 | |
| 866 | login_check_credentials(); |
| 867 | if( !g.okSetup ){ |
| 868 | login_needed(); |
| 869 | } |
| 870 | |
| 871 | style_header("SCM Behavior"); |
| 872 | db_begin_transaction(); |
| 873 | @ <form action="%s(g.zBaseURL)/setup_behavior" method="post"><div> |
| 874 | login_insert_csrf_secret(); |
| 875 | for (azSet=ctrlSettings;azSet->name;azSet++) { |
| 876 | if (azSet->width==0) { |
| 877 | /* found boolean attribute */ |
| 878 | onoff_attribute(azSet->name, azSet->name, azSet->var?azSet->var:azSet->name, (azSet->def[0]=='1')?1:0); |
| 879 | @ <hr /> |
| 880 | } |
| 881 | } |
| 882 | for (azSet=ctrlSettings;azSet->name;azSet++) { |
| 883 | if (azSet->width!=0) { |
| 884 | entry_attribute(azSet->name, azSet->width, azSet->name, azSet->var?azSet->var:azSet->name, (char*)azSet->def); |
| 885 | @ <hr /> |
| 886 | } |
| 887 | } |
| 888 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 889 | @ <hr /> |
| 890 | @ These settings work in the same way, as the <kbd>set</kbd> commandline:<br> |
| 891 | @ <pre>%s(zHelp_setting_cmd)</pre> |
| 892 | @ </div></form> |
| 893 | db_end_transaction(0); |
| 894 | style_footer(); |
| 895 | } |
| 896 | |
| 897 | /* |
| 898 |