Fossil SCM
Initial impl of (patch alias) subcommand. It currently enables management of aliases but does not yet expand them in other patch commands.
Commit
efe37cf77d88fbc474aeb8b38bf4bee4f056c593281ae9f1a1a73597803fb8d9
Parent
eeec6c894ed9cfc…
1 file changed
+80
-1
+80
-1
| --- src/patch.c | ||
| +++ src/patch.c | ||
| @@ -905,10 +905,23 @@ | ||
| 905 | 905 | db_finalize(&q); |
| 906 | 906 | diff_end(pCfg, nErr); |
| 907 | 907 | if( nErr ) fossil_fatal("abort due to prior errors"); |
| 908 | 908 | } |
| 909 | 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 | |
| 910 | 923 | |
| 911 | 924 | /* |
| 912 | 925 | ** COMMAND: patch |
| 913 | 926 | ** |
| 914 | 927 | ** Usage: %fossil patch SUBCOMMAND ?ARGS ..? |
| @@ -996,14 +1009,80 @@ | ||
| 996 | 1009 | void patch_cmd(void){ |
| 997 | 1010 | const char *zCmd; |
| 998 | 1011 | size_t n; |
| 999 | 1012 | if( g.argc<3 ){ |
| 1000 | 1013 | patch_usage: |
| 1001 | - usage("apply|create|diff|gdiff|pull|push|view"); | |
| 1014 | + usage("alias|apply|create|diff|gdiff|pull|push|view"); | |
| 1002 | 1015 | } |
| 1003 | 1016 | zCmd = g.argv[2]; |
| 1004 | 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 | |
| 1005 | 1084 | if( strncmp(zCmd, "apply", n)==0 ){ |
| 1006 | 1085 | char *zIn; |
| 1007 | 1086 | unsigned flags = 0; |
| 1008 | 1087 | if( find_option("dry-run","n",0) ) flags |= PATCH_DRYRUN; |
| 1009 | 1088 | if( find_option("verbose","v",0) ) flags |= PATCH_VERBOSE; |
| 1010 | 1089 |
| --- 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 |