Fossil SCM

Initial impl of (patch alias) subcommand. It currently enables management of aliases but does not yet expand them in other patch commands.

stephan 2025-02-27 21:51 trunk
Commit efe37cf77d88fbc474aeb8b38bf4bee4f056c593281ae9f1a1a73597803fb8d9
1 file changed +80 -1
+80 -1
--- src/patch.c
+++ src/patch.c
@@ -905,10 +905,23 @@
905905
db_finalize(&q);
906906
diff_end(pCfg, nErr);
907907
if( nErr ) fossil_fatal("abort due to prior errors");
908908
}
909909
910
+#if 0 /*TODO*/
911
+static char * patch_resolve_remote(const char *zKey){
912
+ char * zAlias;
913
+
914
+ zAlias = db_text(0, "SELECT value FROM config "
915
+ "WHERE name GLOB 'patch-alias:' || %Q",
916
+ zKey);
917
+ if( 0!=zAlias ){
918
+ return zAlias;
919
+ }
920
+ return mprintf("%s", zKey);
921
+}
922
+#endif
910923
911924
/*
912925
** COMMAND: patch
913926
**
914927
** Usage: %fossil patch SUBCOMMAND ?ARGS ..?
@@ -996,14 +1009,80 @@
9961009
void patch_cmd(void){
9971010
const char *zCmd;
9981011
size_t n;
9991012
if( g.argc<3 ){
10001013
patch_usage:
1001
- usage("apply|create|diff|gdiff|pull|push|view");
1014
+ usage("alias|apply|create|diff|gdiff|pull|push|view");
10021015
}
10031016
zCmd = g.argv[2];
10041017
n = strlen(zCmd);
1018
+ if( strncmp(zCmd, "alias", n)==0 ){
1019
+ const char * zArg = g.argc>3 ? g.argv[3] : 0;
1020
+ db_must_be_within_tree();
1021
+ if( 0==zArg ){
1022
+ goto usage_patch_alias;
1023
+ }else if( 0==strcmp("ls",zArg) || 0==strcmp("list",zArg) ){
1024
+ /* alias ls|list */
1025
+ Stmt q;
1026
+ int nAlias = 0;
1027
+
1028
+ verify_all_options();
1029
+ db_prepare(&q, "SELECT substr(name,13), value FROM config "
1030
+ "WHERE name GLOB 'patch-alias:*' ORDER BY name");
1031
+ while( SQLITE_ROW==db_step(&q) ){
1032
+ const char *zName;
1033
+ const char *zVal;
1034
+ if( 0==nAlias++ ){
1035
+ fossil_print("Local patch aliases:\n");
1036
+ }
1037
+ zName = db_column_text(&q, 0);
1038
+ zVal = db_column_text(&q, 1);
1039
+ fossil_print("%s = %s\n", zName, zVal);
1040
+ }
1041
+ db_finalize(&q);
1042
+ if( 0==nAlias ){
1043
+ fossil_print("No patch aliases defined\n");
1044
+ }
1045
+ }else if( 0==strcmp("add", zArg) ){
1046
+ /* alias add localName remote */
1047
+ verify_all_options();
1048
+ if( 6!=g.argc ){
1049
+ usage("alias add localName remote");
1050
+ }
1051
+ db_unprotect(PROTECT_CONFIG);
1052
+ db_multi_exec("REPLACE INTO config (name, value, mtime) "
1053
+ "VALUES ('patch-alias:%q', %Q, unixepoch())",
1054
+ g.argv[4], g.argv[5]);
1055
+ db_protect_pop();
1056
+ }else if( 0==strcmp("rm", zArg) ){
1057
+ /* alias rm */
1058
+ const int fAll = 0!=find_option("all", 0, 0);
1059
+ verify_all_options();
1060
+ if( g.argc<5 ){
1061
+ usage("alias rm [-all] [aliasGlob [...aliasGlobN]]");
1062
+ }
1063
+ db_unprotect(PROTECT_CONFIG);
1064
+ if( 0!=fAll ){
1065
+ db_multi_exec("DELETE FROM config WHERE name GLOB 'patch-alias:*'");
1066
+ }else{
1067
+ Stmt q;
1068
+ int i;
1069
+ db_prepare(&q, "DELETE FROM config WHERE name "
1070
+ "GLOB 'patch-alias:' || :pattern");
1071
+ for(i = 4; i < g.argc; ++i){
1072
+ db_bind_text(&q, ":pattern", g.argv[i]);
1073
+ db_step(&q);
1074
+ db_reset(&q);
1075
+ }
1076
+ db_finalize(&q);
1077
+ }
1078
+ db_protect_pop();
1079
+ }else{
1080
+ usage_patch_alias:
1081
+ usage("alias ls|list|add|rm ...");
1082
+ }
1083
+ }else
10051084
if( strncmp(zCmd, "apply", n)==0 ){
10061085
char *zIn;
10071086
unsigned flags = 0;
10081087
if( find_option("dry-run","n",0) ) flags |= PATCH_DRYRUN;
10091088
if( find_option("verbose","v",0) ) flags |= PATCH_VERBOSE;
10101089
--- src/patch.c
+++ src/patch.c
@@ -905,10 +905,23 @@
905 db_finalize(&q);
906 diff_end(pCfg, nErr);
907 if( nErr ) fossil_fatal("abort due to prior errors");
908 }
909
 
 
 
 
 
 
 
 
 
 
 
 
 
910
911 /*
912 ** COMMAND: patch
913 **
914 ** Usage: %fossil patch SUBCOMMAND ?ARGS ..?
@@ -996,14 +1009,80 @@
996 void patch_cmd(void){
997 const char *zCmd;
998 size_t n;
999 if( g.argc<3 ){
1000 patch_usage:
1001 usage("apply|create|diff|gdiff|pull|push|view");
1002 }
1003 zCmd = g.argv[2];
1004 n = strlen(zCmd);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1005 if( strncmp(zCmd, "apply", n)==0 ){
1006 char *zIn;
1007 unsigned flags = 0;
1008 if( find_option("dry-run","n",0) ) flags |= PATCH_DRYRUN;
1009 if( find_option("verbose","v",0) ) flags |= PATCH_VERBOSE;
1010
--- src/patch.c
+++ src/patch.c
@@ -905,10 +905,23 @@
905 db_finalize(&q);
906 diff_end(pCfg, nErr);
907 if( nErr ) fossil_fatal("abort due to prior errors");
908 }
909
910 #if 0 /*TODO*/
911 static char * patch_resolve_remote(const char *zKey){
912 char * zAlias;
913
914 zAlias = db_text(0, "SELECT value FROM config "
915 "WHERE name GLOB 'patch-alias:' || %Q",
916 zKey);
917 if( 0!=zAlias ){
918 return zAlias;
919 }
920 return mprintf("%s", zKey);
921 }
922 #endif
923
924 /*
925 ** COMMAND: patch
926 **
927 ** Usage: %fossil patch SUBCOMMAND ?ARGS ..?
@@ -996,14 +1009,80 @@
1009 void patch_cmd(void){
1010 const char *zCmd;
1011 size_t n;
1012 if( g.argc<3 ){
1013 patch_usage:
1014 usage("alias|apply|create|diff|gdiff|pull|push|view");
1015 }
1016 zCmd = g.argv[2];
1017 n = strlen(zCmd);
1018 if( strncmp(zCmd, "alias", n)==0 ){
1019 const char * zArg = g.argc>3 ? g.argv[3] : 0;
1020 db_must_be_within_tree();
1021 if( 0==zArg ){
1022 goto usage_patch_alias;
1023 }else if( 0==strcmp("ls",zArg) || 0==strcmp("list",zArg) ){
1024 /* alias ls|list */
1025 Stmt q;
1026 int nAlias = 0;
1027
1028 verify_all_options();
1029 db_prepare(&q, "SELECT substr(name,13), value FROM config "
1030 "WHERE name GLOB 'patch-alias:*' ORDER BY name");
1031 while( SQLITE_ROW==db_step(&q) ){
1032 const char *zName;
1033 const char *zVal;
1034 if( 0==nAlias++ ){
1035 fossil_print("Local patch aliases:\n");
1036 }
1037 zName = db_column_text(&q, 0);
1038 zVal = db_column_text(&q, 1);
1039 fossil_print("%s = %s\n", zName, zVal);
1040 }
1041 db_finalize(&q);
1042 if( 0==nAlias ){
1043 fossil_print("No patch aliases defined\n");
1044 }
1045 }else if( 0==strcmp("add", zArg) ){
1046 /* alias add localName remote */
1047 verify_all_options();
1048 if( 6!=g.argc ){
1049 usage("alias add localName remote");
1050 }
1051 db_unprotect(PROTECT_CONFIG);
1052 db_multi_exec("REPLACE INTO config (name, value, mtime) "
1053 "VALUES ('patch-alias:%q', %Q, unixepoch())",
1054 g.argv[4], g.argv[5]);
1055 db_protect_pop();
1056 }else if( 0==strcmp("rm", zArg) ){
1057 /* alias rm */
1058 const int fAll = 0!=find_option("all", 0, 0);
1059 verify_all_options();
1060 if( g.argc<5 ){
1061 usage("alias rm [-all] [aliasGlob [...aliasGlobN]]");
1062 }
1063 db_unprotect(PROTECT_CONFIG);
1064 if( 0!=fAll ){
1065 db_multi_exec("DELETE FROM config WHERE name GLOB 'patch-alias:*'");
1066 }else{
1067 Stmt q;
1068 int i;
1069 db_prepare(&q, "DELETE FROM config WHERE name "
1070 "GLOB 'patch-alias:' || :pattern");
1071 for(i = 4; i < g.argc; ++i){
1072 db_bind_text(&q, ":pattern", g.argv[i]);
1073 db_step(&q);
1074 db_reset(&q);
1075 }
1076 db_finalize(&q);
1077 }
1078 db_protect_pop();
1079 }else{
1080 usage_patch_alias:
1081 usage("alias ls|list|add|rm ...");
1082 }
1083 }else
1084 if( strncmp(zCmd, "apply", n)==0 ){
1085 char *zIn;
1086 unsigned flags = 0;
1087 if( find_option("dry-run","n",0) ) flags |= PATCH_DRYRUN;
1088 if( find_option("verbose","v",0) ) flags |= PATCH_VERBOSE;
1089

Keyboard Shortcuts

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