Fossil SCM

Combine the "config" and "setting" commands into a single "settings" command.

drh 2007-09-28 20:08 trunk
Commit 134e2aeccc0acc8a4ced04da5403df234ddc1397
+10 -1
--- ideas.txt
+++ ideas.txt
@@ -27,11 +27,20 @@
2727
fixedin add or subtract uuid
2828
2929
Other table columns:
3030
origintime
3131
lastchange
32
-
32
+
33
+
34
+Field Types:
35
+
36
+ text width height
37
+ enum width valuelist
38
+ datetime width
39
+ cumulative-text width height
40
+ set-of-uuid width
41
+ set-of-checkin width
3342
3443
Tables:
3544
3645
tktrid(rid, tkid, mtime); index(tkid, mtime);
3746
ticket(tkid, tkuuid, title, com, status, ...);
3847
--- ideas.txt
+++ ideas.txt
@@ -27,11 +27,20 @@
27 fixedin add or subtract uuid
28
29 Other table columns:
30 origintime
31 lastchange
32
 
 
 
 
 
 
 
 
 
33
34 Tables:
35
36 tktrid(rid, tkid, mtime); index(tkid, mtime);
37 ticket(tkid, tkuuid, title, com, status, ...);
38
--- ideas.txt
+++ ideas.txt
@@ -27,11 +27,20 @@
27 fixedin add or subtract uuid
28
29 Other table columns:
30 origintime
31 lastchange
32
33
34 Field Types:
35
36 text width height
37 enum width valuelist
38 datetime width
39 cumulative-text width height
40 set-of-uuid width
41 set-of-checkin width
42
43 Tables:
44
45 tktrid(rid, tkid, mtime); index(tkid, mtime);
46 ticket(tkid, tkuuid, title, com, status, ...);
47
+1 -1
--- src/checkin.c
+++ src/checkin.c
@@ -222,11 +222,11 @@
222222
blob_set(&text,
223223
"\n# Enter comments on this commit. Lines beginning with # are ignored\n"
224224
"#\n"
225225
);
226226
status_report(&text, "# ");
227
- zEditor = db_global_get("editor", 0);
227
+ zEditor = db_get("editor", 0);
228228
if( zEditor==0 ){
229229
zEditor = getenv("VISUAL");
230230
}
231231
if( zEditor==0 ){
232232
zEditor = getenv("EDITOR");
233233
--- src/checkin.c
+++ src/checkin.c
@@ -222,11 +222,11 @@
222 blob_set(&text,
223 "\n# Enter comments on this commit. Lines beginning with # are ignored\n"
224 "#\n"
225 );
226 status_report(&text, "# ");
227 zEditor = db_global_get("editor", 0);
228 if( zEditor==0 ){
229 zEditor = getenv("VISUAL");
230 }
231 if( zEditor==0 ){
232 zEditor = getenv("EDITOR");
233
--- src/checkin.c
+++ src/checkin.c
@@ -222,11 +222,11 @@
222 blob_set(&text,
223 "\n# Enter comments on this commit. Lines beginning with # are ignored\n"
224 "#\n"
225 );
226 status_report(&text, "# ");
227 zEditor = db_get("editor", 0);
228 if( zEditor==0 ){
229 zEditor = getenv("VISUAL");
230 }
231 if( zEditor==0 ){
232 zEditor = getenv("EDITOR");
233
+1 -1
--- src/clearsign.c
+++ src/clearsign.c
@@ -34,11 +34,11 @@
3434
*/
3535
int clearsign(Blob *pIn, Blob *pOut){
3636
char *zRand;
3737
char *zIn;
3838
char *zOut;
39
- char *zBase = db_global_get("clear-sign", "gpg --clearsign -o ");
39
+ char *zBase = db_get("clear-sign", "gpg --clearsign -o ");
4040
char *zCmd;
4141
int rc;
4242
zRand = db_text(0, "SELECT hex(randomblob(10))");
4343
zOut = mprintf("out-%s", zRand);
4444
zIn = mprintf("in-%z", zRand);
4545
--- src/clearsign.c
+++ src/clearsign.c
@@ -34,11 +34,11 @@
34 */
35 int clearsign(Blob *pIn, Blob *pOut){
36 char *zRand;
37 char *zIn;
38 char *zOut;
39 char *zBase = db_global_get("clear-sign", "gpg --clearsign -o ");
40 char *zCmd;
41 int rc;
42 zRand = db_text(0, "SELECT hex(randomblob(10))");
43 zOut = mprintf("out-%s", zRand);
44 zIn = mprintf("in-%z", zRand);
45
--- src/clearsign.c
+++ src/clearsign.c
@@ -34,11 +34,11 @@
34 */
35 int clearsign(Blob *pIn, Blob *pOut){
36 char *zRand;
37 char *zIn;
38 char *zOut;
39 char *zBase = db_get("clear-sign", "gpg --clearsign -o ");
40 char *zCmd;
41 int rc;
42 zRand = db_text(0, "SELECT hex(randomblob(10))");
43 zOut = mprintf("out-%s", zRand);
44 zIn = mprintf("in-%z", zRand);
45
+3 -3
--- src/clone.c
+++ src/clone.c
@@ -49,14 +49,14 @@
4949
db_create_repository(g.argv[3]);
5050
db_open_repository(g.argv[3]);
5151
db_begin_transaction();
5252
db_initial_setup(0, 0);
5353
user_select();
54
- db_set("content-schema", CONTENT_SCHEMA);
55
- db_set("aux-schema", AUX_SCHEMA);
54
+ db_set("content-schema", CONTENT_SCHEMA, 0);
55
+ db_set("aux-schema", AUX_SCHEMA, 0);
5656
if( !g.urlIsFile ){
57
- db_set("last-sync-url", g.argv[2]);
57
+ db_set("last-sync-url", g.argv[2], 0);
5858
}
5959
db_multi_exec(
6060
"INSERT INTO config(name,value)"
6161
" VALUES('server-code', lower(hex(randomblob(20))));"
6262
);
6363
--- src/clone.c
+++ src/clone.c
@@ -49,14 +49,14 @@
49 db_create_repository(g.argv[3]);
50 db_open_repository(g.argv[3]);
51 db_begin_transaction();
52 db_initial_setup(0, 0);
53 user_select();
54 db_set("content-schema", CONTENT_SCHEMA);
55 db_set("aux-schema", AUX_SCHEMA);
56 if( !g.urlIsFile ){
57 db_set("last-sync-url", g.argv[2]);
58 }
59 db_multi_exec(
60 "INSERT INTO config(name,value)"
61 " VALUES('server-code', lower(hex(randomblob(20))));"
62 );
63
--- src/clone.c
+++ src/clone.c
@@ -49,14 +49,14 @@
49 db_create_repository(g.argv[3]);
50 db_open_repository(g.argv[3]);
51 db_begin_transaction();
52 db_initial_setup(0, 0);
53 user_select();
54 db_set("content-schema", CONTENT_SCHEMA, 0);
55 db_set("aux-schema", AUX_SCHEMA, 0);
56 if( !g.urlIsFile ){
57 db_set("last-sync-url", g.argv[2], 0);
58 }
59 db_multi_exec(
60 "INSERT INTO config(name,value)"
61 " VALUES('server-code', lower(hex(randomblob(20))));"
62 );
63
+94 -92
--- src/db.c
+++ src/db.c
@@ -679,28 +679,28 @@
679679
** manifest is created. The makeServerCodes flag determines whether or
680680
** not server and project codes are invented for this repository.
681681
*/
682682
void db_initial_setup (int makeInitialVersion, int makeServerCodes){
683683
char *zDate;
684
- char *zUser;
684
+ const char *zUser;
685685
Blob hash;
686686
Blob manifest;
687687
688
- db_set("content-schema", CONTENT_SCHEMA);
689
- db_set("aux-schema", AUX_SCHEMA);
688
+ db_set("content-schema", CONTENT_SCHEMA, 0);
689
+ db_set("aux-schema", AUX_SCHEMA, 0);
690690
if( makeServerCodes ){
691691
db_multi_exec(
692692
"INSERT INTO config(name,value)"
693693
" VALUES('server-code', lower(hex(randomblob(20))));"
694694
"INSERT INTO config(name,value)"
695695
" VALUES('project-code', lower(hex(randomblob(20))));"
696696
);
697697
}
698
- db_set_int("autosync", 1);
699
- db_set_int("safemerge", 0);
700
- db_set_int("localauth", 0);
701
- zUser = db_global_get("default-user", 0);
698
+ if( !db_is_global("autosync") ) db_set_int("autosync", 1, 0);
699
+ if( !db_is_global("safemerge") ) db_set_int("safemerge", 0, 0);
700
+ if( !db_is_global("localauth") ) db_set_int("localauth", 0, 0);
701
+ zUser = db_get("default-user", 0);
702702
if( zUser==0 ){
703703
zUser = getenv("USER");
704704
}
705705
if( zUser==0 ){
706706
zUser = "root";
@@ -832,30 +832,62 @@
832832
833833
/*
834834
** Get and set values from the CONFIG, GLOBAL_CONFIG and VVAR table in the
835835
** repository and local databases.
836836
*/
837
-char *db_get(const char *zName, const char *zDefault){
838
- return db_text((char*)zDefault,
839
- "SELECT value FROM config WHERE name=%Q", zName);
837
+const char *db_get(const char *zName, const char *zDefault){
838
+ const char *z = 0;
839
+ if( g.repositoryOpen ){
840
+ z = db_text(0, "SELECT value FROM config WHERE name=%Q", zName);
841
+ }
842
+ if( z==0 ){
843
+ z = db_text(0, "SELECT value FROM global_config WHERE name=%Q", zName);
844
+ }
845
+ if( z==0 ){
846
+ z = zDefault;
847
+ }
848
+ return z;
849
+}
850
+void db_set(const char *zName, const char *zValue, int globalFlag){
851
+ db_begin_transaction();
852
+ db_multi_exec("REPLACE INTO %sconfig(name,value) VALUES(%Q,%Q)",
853
+ globalFlag ? "global_" : "", zName, zValue);
854
+ if( globalFlag && g.repositoryOpen ){
855
+ db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
856
+ }
857
+ db_end_transaction(0);
840858
}
841
-void db_set(const char *zName, const char *zValue){
842
- db_multi_exec("REPLACE INTO config(name,value) VALUES(%Q,%Q)", zName, zValue);
859
+int db_is_global(const char *zName){
860
+ return db_exists("SELECT 1 FROM global_config WHERE name=%Q", zName);
843861
}
844862
int db_get_int(const char *zName, int dflt){
845
- return db_int(dflt, "SELECT value FROM config WHERE name=%Q", zName);
846
-}
847
-void db_set_int(const char *zName, int value){
848
- db_multi_exec("REPLACE INTO config(name,value) VALUES(%Q,%d)", zName, value);
849
-}
850
-char *db_global_get(const char *zName, const char *zDefault){
851
- return db_text((char*)zDefault,
852
- "SELECT value FROM global_config WHERE name=%Q", zName);
853
-}
854
-void db_global_set(const char *zName, const char *zValue){
855
- db_multi_exec("REPLACE INTO global_config(name,value)"
856
- "VALUES(%Q,%Q)", zName, zValue);
863
+ int v;
864
+ int rc;
865
+ if( g.repositoryOpen ){
866
+ Stmt q;
867
+ db_prepare(&q, "SELECT value FROM config WHERE name=%Q", zName);
868
+ rc = db_step(&q);
869
+ if( rc==SQLITE_ROW ){
870
+ v = db_column_int(&q, 0);
871
+ }
872
+ db_finalize(&q);
873
+ }else{
874
+ rc = SQLITE_DONE;
875
+ }
876
+ if( rc==SQLITE_DONE ){
877
+ v = db_int(dflt, "SELECT value FROM global_config WHERE name=%Q", zName);
878
+ }
879
+ return v;
880
+}
881
+void db_set_int(const char *zName, int value, int globalFlag){
882
+ db_begin_transaction();
883
+ db_multi_exec("REPLACE INTO %sconfig(name,value) VALUES(%Q,%d)",
884
+ globalFlag ? "global_" : "", zName, value);
885
+ if( globalFlag && g.repositoryOpen ){
886
+ db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
887
+ }
888
+ db_end_transaction(0);
857889
}
858890
char *db_lget(const char *zName, const char *zDefault){
859891
return db_text((char*)zDefault,
860892
"SELECT value FROM vvar WHERE name=%Q", zName);
861893
}
@@ -904,104 +936,74 @@
904936
update_cmd();
905937
}
906938
}
907939
908940
/*
909
-** COMMAND: config
910
-**
911
-** Usage: %fossil config NAME=VALUE ...
912
-**
913
-** List or change the global configuration settings. With no arguments,
914
-** all settings are listed. Arguments of simply NAME cause that setting
915
-** to be displayed. Arguments of the form NAME=VALUE change the value of
916
-** a setting. Arguments of the form NAME= delete a setting.
917
-**
918
-** Recognized settings include:
919
-**
920
-** editor Text editor command used for check-in comments.
921
-**
922
-** clear-sign Command used to clear-sign manifests at check-in.
923
-** The default is "gpg --clearsign -o ".
924
-**
925
-** omit-sign When enabled, fossil will not attempt to sign any
926
-** commit with gpg. All commits will be unsigned.
927
-*/
928
-void cmd_config(void){
929
- db_open_config();
930
- if( g.argc>2 ){
931
- int i;
932
- db_begin_transaction();
933
- for(i=2; i<g.argc; i++){
934
- char *zName, *zValue;
935
- int j, removed=0;
936
-
937
- zName = mprintf("%s", g.argv[i]);
938
- for(j=0; zName[j] && zName[j]!='='; j++){}
939
- if( zName[j] ){
940
- zName[j] = 0;
941
- zValue = &zName[j+1];
942
- if( zValue[0] ){
943
- db_global_set(zName, zValue);
944
- }else{
945
- db_multi_exec("DELETE FROM global_config WHERE name=%Q", zName);
946
- removed=1;
947
- }
948
- }
949
- zValue = db_global_get(zName, 0);
950
- if( zValue ){
951
- printf("%s=%s\n", zName, zValue);
952
- }else{
953
- if( removed==1 ){
954
- printf("%s has been removed from configuration\n", zName);
955
- }else{
956
- printf("%s is undefined\n", zName);
957
- }
958
- }
959
- }
960
- db_end_transaction(0);
961
- }else{
962
- Stmt q;
963
- db_prepare(&q, "SELECT name, value FROM global_config ORDER BY name");
964
- while( db_step(&q)==SQLITE_ROW ){
965
- printf("%s=%s\n", db_column_text(&q, 0), db_column_text(&q, 1));
966
- }
967
- db_finalize(&q);
968
- }
969
-}
970
-
971
-/*
972
-** COMMAND: setting
973
-** %fossil setting ?PROPERTY? ?VALUE?
941
+** Print the value of a setting named zName
942
+*/
943
+static void print_setting(const char *zName){
944
+ Stmt q;
945
+ db_prepare(&q,
946
+ "SELECT '(local)', value FROM config WHERE name=%Q"
947
+ " UNION ALL "
948
+ "SELECT '(global)', value FROM global_config WHERE name=%Q",
949
+ zName, zName
950
+ );
951
+ if( db_step(&q)==SQLITE_ROW ){
952
+ printf("%-20s %-8s %s\n", zName, db_column_text(&q, 0),
953
+ db_column_text(&q, 1));
954
+ }else{
955
+ printf("%-20s\n", zName);
956
+ }
957
+ db_finalize(&q);
958
+}
959
+
960
+
961
+/*
962
+** COMMAND: settings
963
+** %fossil setting ?PROPERTY? ?VALUE? ?-global?
974964
**
975965
** With no arguments, list all properties and their values. With just
976966
** a property name, show the value of that property. With a value
977967
** argument, change the property for the current repository.
978968
**
979969
** autosync If enabled, automatically pull prior to
980970
** commit or update and automatically push
981971
** after commit or tag or branch creation.
982972
**
973
+** clear-sign Command used to clear-sign manifests at check-in.
974
+** The default is "gpg --clearsign -o ".
975
+**
976
+** editor Text editor command used for check-in comments.
977
+**
983978
** localauth If enabled, require that HTTP connections from
984979
** 127.0.0.1 be authenticated by password. If
985980
** false, all HTTP requests from localhost have
986981
** unrestricted access to the repository.
982
+**
983
+** omit-sign When enabled, fossil will not attempt to sign any
984
+** commit with gpg. All commits will be unsigned.
987985
**
988986
** safemerge If enabled, when commit will cause a fork, the
989987
** commit will not abort with warning. Also update
990988
** will not be allowed if local changes exist.
991989
*/
992990
void setting_cmd(void){
993991
static const char *azName[] = {
994992
"autosync",
993
+ "clearsign",
994
+ "editor",
995995
"localauth",
996
+ "omitsig",
996997
"safemerge",
997998
};
998999
int i;
1000
+ int globalFlag = find_option("global","g",0)!=0;
9991001
db_find_and_open_repository();
10001002
if( g.argc==2 ){
10011003
for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
1002
- printf("%-20s %d\n", azName[i], db_get_int(azName[i], 0));
1004
+ print_setting(azName[i]);
10031005
}
10041006
}else if( g.argc==3 || g.argc==4 ){
10051007
const char *zName = g.argv[2];
10061008
int n = strlen(zName);
10071009
for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
@@ -1009,13 +1011,13 @@
10091011
}
10101012
if( i>=sizeof(azName)/sizeof(azName[0]) ){
10111013
fossil_fatal("no such setting: %s", zName);
10121014
}
10131015
if( g.argc==4 ){
1014
- db_set(azName[i], g.argv[3]);
1016
+ db_set(azName[i], g.argv[3], globalFlag);
10151017
}else{
1016
- printf("%-20s %d\n", azName[i], db_get_int(azName[i], 0));
1018
+ print_setting(azName[i]);
10171019
}
10181020
}else{
10191021
usage("?PROPERTY? ?VALUE?");
10201022
}
10211023
}
10221024
--- src/db.c
+++ src/db.c
@@ -679,28 +679,28 @@
679 ** manifest is created. The makeServerCodes flag determines whether or
680 ** not server and project codes are invented for this repository.
681 */
682 void db_initial_setup (int makeInitialVersion, int makeServerCodes){
683 char *zDate;
684 char *zUser;
685 Blob hash;
686 Blob manifest;
687
688 db_set("content-schema", CONTENT_SCHEMA);
689 db_set("aux-schema", AUX_SCHEMA);
690 if( makeServerCodes ){
691 db_multi_exec(
692 "INSERT INTO config(name,value)"
693 " VALUES('server-code', lower(hex(randomblob(20))));"
694 "INSERT INTO config(name,value)"
695 " VALUES('project-code', lower(hex(randomblob(20))));"
696 );
697 }
698 db_set_int("autosync", 1);
699 db_set_int("safemerge", 0);
700 db_set_int("localauth", 0);
701 zUser = db_global_get("default-user", 0);
702 if( zUser==0 ){
703 zUser = getenv("USER");
704 }
705 if( zUser==0 ){
706 zUser = "root";
@@ -832,30 +832,62 @@
832
833 /*
834 ** Get and set values from the CONFIG, GLOBAL_CONFIG and VVAR table in the
835 ** repository and local databases.
836 */
837 char *db_get(const char *zName, const char *zDefault){
838 return db_text((char*)zDefault,
839 "SELECT value FROM config WHERE name=%Q", zName);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
840 }
841 void db_set(const char *zName, const char *zValue){
842 db_multi_exec("REPLACE INTO config(name,value) VALUES(%Q,%Q)", zName, zValue);
843 }
844 int db_get_int(const char *zName, int dflt){
845 return db_int(dflt, "SELECT value FROM config WHERE name=%Q", zName);
846 }
847 void db_set_int(const char *zName, int value){
848 db_multi_exec("REPLACE INTO config(name,value) VALUES(%Q,%d)", zName, value);
849 }
850 char *db_global_get(const char *zName, const char *zDefault){
851 return db_text((char*)zDefault,
852 "SELECT value FROM global_config WHERE name=%Q", zName);
853 }
854 void db_global_set(const char *zName, const char *zValue){
855 db_multi_exec("REPLACE INTO global_config(name,value)"
856 "VALUES(%Q,%Q)", zName, zValue);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
857 }
858 char *db_lget(const char *zName, const char *zDefault){
859 return db_text((char*)zDefault,
860 "SELECT value FROM vvar WHERE name=%Q", zName);
861 }
@@ -904,104 +936,74 @@
904 update_cmd();
905 }
906 }
907
908 /*
909 ** COMMAND: config
910 **
911 ** Usage: %fossil config NAME=VALUE ...
912 **
913 ** List or change the global configuration settings. With no arguments,
914 ** all settings are listed. Arguments of simply NAME cause that setting
915 ** to be displayed. Arguments of the form NAME=VALUE change the value of
916 ** a setting. Arguments of the form NAME= delete a setting.
917 **
918 ** Recognized settings include:
919 **
920 ** editor Text editor command used for check-in comments.
921 **
922 ** clear-sign Command used to clear-sign manifests at check-in.
923 ** The default is "gpg --clearsign -o ".
924 **
925 ** omit-sign When enabled, fossil will not attempt to sign any
926 ** commit with gpg. All commits will be unsigned.
927 */
928 void cmd_config(void){
929 db_open_config();
930 if( g.argc>2 ){
931 int i;
932 db_begin_transaction();
933 for(i=2; i<g.argc; i++){
934 char *zName, *zValue;
935 int j, removed=0;
936
937 zName = mprintf("%s", g.argv[i]);
938 for(j=0; zName[j] && zName[j]!='='; j++){}
939 if( zName[j] ){
940 zName[j] = 0;
941 zValue = &zName[j+1];
942 if( zValue[0] ){
943 db_global_set(zName, zValue);
944 }else{
945 db_multi_exec("DELETE FROM global_config WHERE name=%Q", zName);
946 removed=1;
947 }
948 }
949 zValue = db_global_get(zName, 0);
950 if( zValue ){
951 printf("%s=%s\n", zName, zValue);
952 }else{
953 if( removed==1 ){
954 printf("%s has been removed from configuration\n", zName);
955 }else{
956 printf("%s is undefined\n", zName);
957 }
958 }
959 }
960 db_end_transaction(0);
961 }else{
962 Stmt q;
963 db_prepare(&q, "SELECT name, value FROM global_config ORDER BY name");
964 while( db_step(&q)==SQLITE_ROW ){
965 printf("%s=%s\n", db_column_text(&q, 0), db_column_text(&q, 1));
966 }
967 db_finalize(&q);
968 }
969 }
970
971 /*
972 ** COMMAND: setting
973 ** %fossil setting ?PROPERTY? ?VALUE?
974 **
975 ** With no arguments, list all properties and their values. With just
976 ** a property name, show the value of that property. With a value
977 ** argument, change the property for the current repository.
978 **
979 ** autosync If enabled, automatically pull prior to
980 ** commit or update and automatically push
981 ** after commit or tag or branch creation.
982 **
 
 
 
 
 
983 ** localauth If enabled, require that HTTP connections from
984 ** 127.0.0.1 be authenticated by password. If
985 ** false, all HTTP requests from localhost have
986 ** unrestricted access to the repository.
 
 
 
987 **
988 ** safemerge If enabled, when commit will cause a fork, the
989 ** commit will not abort with warning. Also update
990 ** will not be allowed if local changes exist.
991 */
992 void setting_cmd(void){
993 static const char *azName[] = {
994 "autosync",
 
 
995 "localauth",
 
996 "safemerge",
997 };
998 int i;
 
999 db_find_and_open_repository();
1000 if( g.argc==2 ){
1001 for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
1002 printf("%-20s %d\n", azName[i], db_get_int(azName[i], 0));
1003 }
1004 }else if( g.argc==3 || g.argc==4 ){
1005 const char *zName = g.argv[2];
1006 int n = strlen(zName);
1007 for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
@@ -1009,13 +1011,13 @@
1009 }
1010 if( i>=sizeof(azName)/sizeof(azName[0]) ){
1011 fossil_fatal("no such setting: %s", zName);
1012 }
1013 if( g.argc==4 ){
1014 db_set(azName[i], g.argv[3]);
1015 }else{
1016 printf("%-20s %d\n", azName[i], db_get_int(azName[i], 0));
1017 }
1018 }else{
1019 usage("?PROPERTY? ?VALUE?");
1020 }
1021 }
1022
--- src/db.c
+++ src/db.c
@@ -679,28 +679,28 @@
679 ** manifest is created. The makeServerCodes flag determines whether or
680 ** not server and project codes are invented for this repository.
681 */
682 void db_initial_setup (int makeInitialVersion, int makeServerCodes){
683 char *zDate;
684 const char *zUser;
685 Blob hash;
686 Blob manifest;
687
688 db_set("content-schema", CONTENT_SCHEMA, 0);
689 db_set("aux-schema", AUX_SCHEMA, 0);
690 if( makeServerCodes ){
691 db_multi_exec(
692 "INSERT INTO config(name,value)"
693 " VALUES('server-code', lower(hex(randomblob(20))));"
694 "INSERT INTO config(name,value)"
695 " VALUES('project-code', lower(hex(randomblob(20))));"
696 );
697 }
698 if( !db_is_global("autosync") ) db_set_int("autosync", 1, 0);
699 if( !db_is_global("safemerge") ) db_set_int("safemerge", 0, 0);
700 if( !db_is_global("localauth") ) db_set_int("localauth", 0, 0);
701 zUser = db_get("default-user", 0);
702 if( zUser==0 ){
703 zUser = getenv("USER");
704 }
705 if( zUser==0 ){
706 zUser = "root";
@@ -832,30 +832,62 @@
832
833 /*
834 ** Get and set values from the CONFIG, GLOBAL_CONFIG and VVAR table in the
835 ** repository and local databases.
836 */
837 const char *db_get(const char *zName, const char *zDefault){
838 const char *z = 0;
839 if( g.repositoryOpen ){
840 z = db_text(0, "SELECT value FROM config WHERE name=%Q", zName);
841 }
842 if( z==0 ){
843 z = db_text(0, "SELECT value FROM global_config WHERE name=%Q", zName);
844 }
845 if( z==0 ){
846 z = zDefault;
847 }
848 return z;
849 }
850 void db_set(const char *zName, const char *zValue, int globalFlag){
851 db_begin_transaction();
852 db_multi_exec("REPLACE INTO %sconfig(name,value) VALUES(%Q,%Q)",
853 globalFlag ? "global_" : "", zName, zValue);
854 if( globalFlag && g.repositoryOpen ){
855 db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
856 }
857 db_end_transaction(0);
858 }
859 int db_is_global(const char *zName){
860 return db_exists("SELECT 1 FROM global_config WHERE name=%Q", zName);
861 }
862 int db_get_int(const char *zName, int dflt){
863 int v;
864 int rc;
865 if( g.repositoryOpen ){
866 Stmt q;
867 db_prepare(&q, "SELECT value FROM config WHERE name=%Q", zName);
868 rc = db_step(&q);
869 if( rc==SQLITE_ROW ){
870 v = db_column_int(&q, 0);
871 }
872 db_finalize(&q);
873 }else{
874 rc = SQLITE_DONE;
875 }
876 if( rc==SQLITE_DONE ){
877 v = db_int(dflt, "SELECT value FROM global_config WHERE name=%Q", zName);
878 }
879 return v;
880 }
881 void db_set_int(const char *zName, int value, int globalFlag){
882 db_begin_transaction();
883 db_multi_exec("REPLACE INTO %sconfig(name,value) VALUES(%Q,%d)",
884 globalFlag ? "global_" : "", zName, value);
885 if( globalFlag && g.repositoryOpen ){
886 db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
887 }
888 db_end_transaction(0);
889 }
890 char *db_lget(const char *zName, const char *zDefault){
891 return db_text((char*)zDefault,
892 "SELECT value FROM vvar WHERE name=%Q", zName);
893 }
@@ -904,104 +936,74 @@
936 update_cmd();
937 }
938 }
939
940 /*
941 ** Print the value of a setting named zName
942 */
943 static void print_setting(const char *zName){
944 Stmt q;
945 db_prepare(&q,
946 "SELECT '(local)', value FROM config WHERE name=%Q"
947 " UNION ALL "
948 "SELECT '(global)', value FROM global_config WHERE name=%Q",
949 zName, zName
950 );
951 if( db_step(&q)==SQLITE_ROW ){
952 printf("%-20s %-8s %s\n", zName, db_column_text(&q, 0),
953 db_column_text(&q, 1));
954 }else{
955 printf("%-20s\n", zName);
956 }
957 db_finalize(&q);
958 }
959
960
961 /*
962 ** COMMAND: settings
963 ** %fossil setting ?PROPERTY? ?VALUE? ?-global?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
964 **
965 ** With no arguments, list all properties and their values. With just
966 ** a property name, show the value of that property. With a value
967 ** argument, change the property for the current repository.
968 **
969 ** autosync If enabled, automatically pull prior to
970 ** commit or update and automatically push
971 ** after commit or tag or branch creation.
972 **
973 ** clear-sign Command used to clear-sign manifests at check-in.
974 ** The default is "gpg --clearsign -o ".
975 **
976 ** editor Text editor command used for check-in comments.
977 **
978 ** localauth If enabled, require that HTTP connections from
979 ** 127.0.0.1 be authenticated by password. If
980 ** false, all HTTP requests from localhost have
981 ** unrestricted access to the repository.
982 **
983 ** omit-sign When enabled, fossil will not attempt to sign any
984 ** commit with gpg. All commits will be unsigned.
985 **
986 ** safemerge If enabled, when commit will cause a fork, the
987 ** commit will not abort with warning. Also update
988 ** will not be allowed if local changes exist.
989 */
990 void setting_cmd(void){
991 static const char *azName[] = {
992 "autosync",
993 "clearsign",
994 "editor",
995 "localauth",
996 "omitsig",
997 "safemerge",
998 };
999 int i;
1000 int globalFlag = find_option("global","g",0)!=0;
1001 db_find_and_open_repository();
1002 if( g.argc==2 ){
1003 for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
1004 print_setting(azName[i]);
1005 }
1006 }else if( g.argc==3 || g.argc==4 ){
1007 const char *zName = g.argv[2];
1008 int n = strlen(zName);
1009 for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
@@ -1009,13 +1011,13 @@
1011 }
1012 if( i>=sizeof(azName)/sizeof(azName[0]) ){
1013 fossil_fatal("no such setting: %s", zName);
1014 }
1015 if( g.argc==4 ){
1016 db_set(azName[i], g.argv[3], globalFlag);
1017 }else{
1018 print_setting(azName[i]);
1019 }
1020 }else{
1021 usage("?PROPERTY? ?VALUE?");
1022 }
1023 }
1024
+2 -2
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -88,13 +88,13 @@
8888
db_must_be_within_tree();
8989
9090
if( internalDiff==0 ){
9191
const char *zExternalCommand;
9292
if( strcmp(g.argv[1], "diff")==0 ){
93
- zExternalCommand = db_global_get("diff-command", 0);
93
+ zExternalCommand = db_get("diff-command", 0);
9494
}else{
95
- zExternalCommand = db_global_get("gdiff-command", 0);
95
+ zExternalCommand = db_get("gdiff-command", 0);
9696
}
9797
if( zExternalCommand==0 ){
9898
internalDiff=1;
9999
}
100100
blob_zero(&cmd);
101101
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -88,13 +88,13 @@
88 db_must_be_within_tree();
89
90 if( internalDiff==0 ){
91 const char *zExternalCommand;
92 if( strcmp(g.argv[1], "diff")==0 ){
93 zExternalCommand = db_global_get("diff-command", 0);
94 }else{
95 zExternalCommand = db_global_get("gdiff-command", 0);
96 }
97 if( zExternalCommand==0 ){
98 internalDiff=1;
99 }
100 blob_zero(&cmd);
101
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -88,13 +88,13 @@
88 db_must_be_within_tree();
89
90 if( internalDiff==0 ){
91 const char *zExternalCommand;
92 if( strcmp(g.argv[1], "diff")==0 ){
93 zExternalCommand = db_get("diff-command", 0);
94 }else{
95 zExternalCommand = db_get("gdiff-command", 0);
96 }
97 if( zExternalCommand==0 ){
98 internalDiff=1;
99 }
100 blob_zero(&cmd);
101
+3 -3
--- src/setup.c
+++ src/setup.c
@@ -429,11 +429,11 @@
429429
zQ = "off";
430430
}
431431
if( zQ ){
432432
int iQ = strcmp(zQ,"on")==0 || atoi(zQ);
433433
if( iQ!=iVal ){
434
- db_set(zVar, iQ ? "1" : "0");
434
+ db_set(zVar, iQ ? "1" : "0", 0);
435435
iVal = iQ;
436436
}
437437
}
438438
if( iVal ){
439439
@ <input type="checkbox" name="%s(zQParm)" checked>%s(zLabel)</input>
@@ -453,11 +453,11 @@
453453
const char *zDflt /* Default value if VAR table entry does not exist */
454454
){
455455
const char *zVal = db_get(zVar, zDflt);
456456
const char *zQ = P(zQParm);
457457
if( zQ && strcmp(zQ,zVal)!=0 ){
458
- db_set(zVar, zQ);
458
+ db_set(zVar, zQ, 0);
459459
zVal = zQ;
460460
}
461461
@ <input type="text" name="%s(zQParm)" value="%h(zVal)" size="%d(width)">
462462
@ %s(zLabel)
463463
}
@@ -474,11 +474,11 @@
474474
const char *zDflt /* Default value if VAR table entry does not exist */
475475
){
476476
const char *zVal = db_get(zVar, zDflt);
477477
const char *zQ = P(zQParm);
478478
if( zQ && strcmp(zQ,zVal)!=0 ){
479
- db_set(zVar, zQ);
479
+ db_set(zVar, zQ, 0);
480480
zVal = zQ;
481481
}
482482
@ <textarea name="%s(zQParm)" rows="%d(rows)" cols="%d(cols)">%h(zVal)</textarea>
483483
@ %s(zLabel)
484484
}
485485
--- src/setup.c
+++ src/setup.c
@@ -429,11 +429,11 @@
429 zQ = "off";
430 }
431 if( zQ ){
432 int iQ = strcmp(zQ,"on")==0 || atoi(zQ);
433 if( iQ!=iVal ){
434 db_set(zVar, iQ ? "1" : "0");
435 iVal = iQ;
436 }
437 }
438 if( iVal ){
439 @ <input type="checkbox" name="%s(zQParm)" checked>%s(zLabel)</input>
@@ -453,11 +453,11 @@
453 const char *zDflt /* Default value if VAR table entry does not exist */
454 ){
455 const char *zVal = db_get(zVar, zDflt);
456 const char *zQ = P(zQParm);
457 if( zQ && strcmp(zQ,zVal)!=0 ){
458 db_set(zVar, zQ);
459 zVal = zQ;
460 }
461 @ <input type="text" name="%s(zQParm)" value="%h(zVal)" size="%d(width)">
462 @ %s(zLabel)
463 }
@@ -474,11 +474,11 @@
474 const char *zDflt /* Default value if VAR table entry does not exist */
475 ){
476 const char *zVal = db_get(zVar, zDflt);
477 const char *zQ = P(zQParm);
478 if( zQ && strcmp(zQ,zVal)!=0 ){
479 db_set(zVar, zQ);
480 zVal = zQ;
481 }
482 @ <textarea name="%s(zQParm)" rows="%d(rows)" cols="%d(cols)">%h(zVal)</textarea>
483 @ %s(zLabel)
484 }
485
--- src/setup.c
+++ src/setup.c
@@ -429,11 +429,11 @@
429 zQ = "off";
430 }
431 if( zQ ){
432 int iQ = strcmp(zQ,"on")==0 || atoi(zQ);
433 if( iQ!=iVal ){
434 db_set(zVar, iQ ? "1" : "0", 0);
435 iVal = iQ;
436 }
437 }
438 if( iVal ){
439 @ <input type="checkbox" name="%s(zQParm)" checked>%s(zLabel)</input>
@@ -453,11 +453,11 @@
453 const char *zDflt /* Default value if VAR table entry does not exist */
454 ){
455 const char *zVal = db_get(zVar, zDflt);
456 const char *zQ = P(zQParm);
457 if( zQ && strcmp(zQ,zVal)!=0 ){
458 db_set(zVar, zQ, 0);
459 zVal = zQ;
460 }
461 @ <input type="text" name="%s(zQParm)" value="%h(zVal)" size="%d(width)">
462 @ %s(zLabel)
463 }
@@ -474,11 +474,11 @@
474 const char *zDflt /* Default value if VAR table entry does not exist */
475 ){
476 const char *zVal = db_get(zVar, zDflt);
477 const char *zQ = P(zQParm);
478 if( zQ && strcmp(zQ,zVal)!=0 ){
479 db_set(zVar, zQ, 0);
480 zVal = zQ;
481 }
482 @ <textarea name="%s(zQParm)" rows="%d(rows)" cols="%d(cols)">%h(zVal)</textarea>
483 @ %s(zLabel)
484 }
485
+1 -1
--- src/style.c
+++ src/style.c
@@ -145,11 +145,11 @@
145145
** WEBPAGE: index
146146
** WEBPAGE: home
147147
** WEBPAGE: not_found
148148
*/
149149
void page_index(void){
150
- char *zHome = db_get("homepage", 0);
150
+ char *zHome = (char*)db_get("homepage", 0);
151151
if( zHome ){
152152
g.zExtra = zHome;
153153
g.okRdWiki = 1;
154154
wiki_page();
155155
}else{
156156
--- src/style.c
+++ src/style.c
@@ -145,11 +145,11 @@
145 ** WEBPAGE: index
146 ** WEBPAGE: home
147 ** WEBPAGE: not_found
148 */
149 void page_index(void){
150 char *zHome = db_get("homepage", 0);
151 if( zHome ){
152 g.zExtra = zHome;
153 g.okRdWiki = 1;
154 wiki_page();
155 }else{
156
--- src/style.c
+++ src/style.c
@@ -145,11 +145,11 @@
145 ** WEBPAGE: index
146 ** WEBPAGE: home
147 ** WEBPAGE: not_found
148 */
149 void page_index(void){
150 char *zHome = (char*)db_get("homepage", 0);
151 if( zHome ){
152 g.zExtra = zHome;
153 g.okRdWiki = 1;
154 wiki_page();
155 }else{
156
+1 -1
--- src/sync.c
+++ src/sync.c
@@ -74,11 +74,11 @@
7474
}
7575
url_parse(zUrl);
7676
if( g.urlIsFile ){
7777
fossil_fatal("network sync only");
7878
}
79
- db_set("last-sync-url", zUrl);
79
+ db_set("last-sync-url", zUrl, 0);
8080
user_select();
8181
if( g.argc==2 ){
8282
if( g.urlPort!=80 ){
8383
printf("Server: http://%s:%d%s\n", g.urlName, g.urlPort, g.urlPath);
8484
}else{
8585
--- src/sync.c
+++ src/sync.c
@@ -74,11 +74,11 @@
74 }
75 url_parse(zUrl);
76 if( g.urlIsFile ){
77 fossil_fatal("network sync only");
78 }
79 db_set("last-sync-url", zUrl);
80 user_select();
81 if( g.argc==2 ){
82 if( g.urlPort!=80 ){
83 printf("Server: http://%s:%d%s\n", g.urlName, g.urlPort, g.urlPath);
84 }else{
85
--- src/sync.c
+++ src/sync.c
@@ -74,11 +74,11 @@
74 }
75 url_parse(zUrl);
76 if( g.urlIsFile ){
77 fossil_fatal("network sync only");
78 }
79 db_set("last-sync-url", zUrl, 0);
80 user_select();
81 if( g.argc==2 ){
82 if( g.urlPort!=80 ){
83 printf("Server: http://%s:%d%s\n", g.urlName, g.urlPort, g.urlPath);
84 }else{
85
+1 -1
--- src/user.c
+++ src/user.c
@@ -200,11 +200,11 @@
200200
if( g.argc==3 ){
201201
printf("%s\n", g.zLogin);
202202
}else if( g.localOpen ){
203203
db_lset("default-user", g.zLogin);
204204
}else{
205
- db_set("default-user", g.zLogin);
205
+ db_set("default-user", g.zLogin, 0);
206206
}
207207
}else if( n>=2 && strncmp(g.argv[2],"list",n)==0 ){
208208
Stmt q;
209209
db_prepare(&q, "SELECT login, info FROM user ORDER BY login");
210210
while( db_step(&q)==SQLITE_ROW ){
211211
--- src/user.c
+++ src/user.c
@@ -200,11 +200,11 @@
200 if( g.argc==3 ){
201 printf("%s\n", g.zLogin);
202 }else if( g.localOpen ){
203 db_lset("default-user", g.zLogin);
204 }else{
205 db_set("default-user", g.zLogin);
206 }
207 }else if( n>=2 && strncmp(g.argv[2],"list",n)==0 ){
208 Stmt q;
209 db_prepare(&q, "SELECT login, info FROM user ORDER BY login");
210 while( db_step(&q)==SQLITE_ROW ){
211
--- src/user.c
+++ src/user.c
@@ -200,11 +200,11 @@
200 if( g.argc==3 ){
201 printf("%s\n", g.zLogin);
202 }else if( g.localOpen ){
203 db_lset("default-user", g.zLogin);
204 }else{
205 db_set("default-user", g.zLogin, 0);
206 }
207 }else if( n>=2 && strncmp(g.argv[2],"list",n)==0 ){
208 Stmt q;
209 db_prepare(&q, "SELECT login, info FROM user ORDER BY login");
210 while( db_step(&q)==SQLITE_ROW ){
211
+2 -2
--- src/xfer.c
+++ src/xfer.c
@@ -812,11 +812,11 @@
812812
fossil_fatal("server loop");
813813
}
814814
nMsg++;
815815
if( zPCode==0 ){
816816
zPCode = mprintf("%b", &xfer.aToken[2]);
817
- db_set("project-code", zPCode);
817
+ db_set("project-code", zPCode, 0);
818818
}
819819
cloneFlag = 0;
820820
pullFlag = 1;
821821
blob_appendf(&send, "pull %s %s\n", zSCode, zPCode);
822822
nMsg++;
@@ -830,11 +830,11 @@
830830
**
831831
** Each cookie received overwrites the prior cookie from the
832832
** same server.
833833
*/
834834
if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){
835
- db_set("cookie", blob_str(&xfer.aToken[1]));
835
+ db_set("cookie", blob_str(&xfer.aToken[1]), 0);
836836
}else
837837
838838
/* message MESSAGE
839839
**
840840
** Print a message. Similar to "error" but does not stop processing
841841
--- src/xfer.c
+++ src/xfer.c
@@ -812,11 +812,11 @@
812 fossil_fatal("server loop");
813 }
814 nMsg++;
815 if( zPCode==0 ){
816 zPCode = mprintf("%b", &xfer.aToken[2]);
817 db_set("project-code", zPCode);
818 }
819 cloneFlag = 0;
820 pullFlag = 1;
821 blob_appendf(&send, "pull %s %s\n", zSCode, zPCode);
822 nMsg++;
@@ -830,11 +830,11 @@
830 **
831 ** Each cookie received overwrites the prior cookie from the
832 ** same server.
833 */
834 if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){
835 db_set("cookie", blob_str(&xfer.aToken[1]));
836 }else
837
838 /* message MESSAGE
839 **
840 ** Print a message. Similar to "error" but does not stop processing
841
--- src/xfer.c
+++ src/xfer.c
@@ -812,11 +812,11 @@
812 fossil_fatal("server loop");
813 }
814 nMsg++;
815 if( zPCode==0 ){
816 zPCode = mprintf("%b", &xfer.aToken[2]);
817 db_set("project-code", zPCode, 0);
818 }
819 cloneFlag = 0;
820 pullFlag = 1;
821 blob_appendf(&send, "pull %s %s\n", zSCode, zPCode);
822 nMsg++;
@@ -830,11 +830,11 @@
830 **
831 ** Each cookie received overwrites the prior cookie from the
832 ** same server.
833 */
834 if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){
835 db_set("cookie", blob_str(&xfer.aToken[1]), 0);
836 }else
837
838 /* message MESSAGE
839 **
840 ** Print a message. Similar to "error" but does not stop processing
841

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button