Fossil SCM
Fix a memleak in manifest_crosslink() when hooks are activated (one uuid leaked per checkin manifest). When posting a chat-robot message for a forum post, add links to the artifact and user's timeline to that message (as is done for checkins.
Commit
5fabb7ccb7d195c423cc7a0ed7c1283e3cdaae85256d8ba35e50fff552852507
Parent
f9f90d9b15cb366…
2 files changed
+8
-2
+7
-3
+8
-2
| --- src/chat.c | ||
| +++ src/chat.c | ||
| @@ -1137,12 +1137,11 @@ | ||
| 1137 | 1137 | ); |
| 1138 | 1138 | fossil_free(zBranch); |
| 1139 | 1139 | fossil_free(zUuid); |
| 1140 | 1140 | }else if( zType[0]=='w' ){ |
| 1141 | 1141 | /* Wiki page changes */ |
| 1142 | - char *zUuid; | |
| 1143 | - zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); | |
| 1142 | + char *zUuid = rid_to_uuid(rid); | |
| 1144 | 1143 | wiki_hyperlink_override(zUuid); |
| 1145 | 1144 | if( zMsg[0]=='-' ){ |
| 1146 | 1145 | zRes = mprintf("Delete wiki page <a href='%R/whistory?name=%t'>%h</a>", |
| 1147 | 1146 | zMsg+1, zMsg+1); |
| 1148 | 1147 | }else if( zMsg[0]=='+' ){ |
| @@ -1155,10 +1154,17 @@ | ||
| 1155 | 1154 | }else{ |
| 1156 | 1155 | zRes = mprintf("%W", zMsg); |
| 1157 | 1156 | } |
| 1158 | 1157 | wiki_hyperlink_override(0); |
| 1159 | 1158 | fossil_free(zUuid); |
| 1159 | + }else if( zType[0]=='f' ){ | |
| 1160 | + /* Forum changes */ | |
| 1161 | + char *zUuid = rid_to_uuid(rid); | |
| 1162 | + zRes = mprintf( "%W (artifact: <a href='%R/info/%S'>%S</a>, " | |
| 1163 | + "user: <a href='%R/timeline?u=%t&c=%S'>%h</a>)", | |
| 1164 | + zMsg, zUuid, zUuid, zUser, zUuid, zUser); | |
| 1165 | + fossil_free(zUuid); | |
| 1160 | 1166 | }else{ |
| 1161 | 1167 | /* Anything else */ |
| 1162 | 1168 | zRes = mprintf("%W", zMsg); |
| 1163 | 1169 | } |
| 1164 | 1170 | if( zRes ){ |
| 1165 | 1171 |
| --- src/chat.c | |
| +++ src/chat.c | |
| @@ -1137,12 +1137,11 @@ | |
| 1137 | ); |
| 1138 | fossil_free(zBranch); |
| 1139 | fossil_free(zUuid); |
| 1140 | }else if( zType[0]=='w' ){ |
| 1141 | /* Wiki page changes */ |
| 1142 | char *zUuid; |
| 1143 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1144 | wiki_hyperlink_override(zUuid); |
| 1145 | if( zMsg[0]=='-' ){ |
| 1146 | zRes = mprintf("Delete wiki page <a href='%R/whistory?name=%t'>%h</a>", |
| 1147 | zMsg+1, zMsg+1); |
| 1148 | }else if( zMsg[0]=='+' ){ |
| @@ -1155,10 +1154,17 @@ | |
| 1155 | }else{ |
| 1156 | zRes = mprintf("%W", zMsg); |
| 1157 | } |
| 1158 | wiki_hyperlink_override(0); |
| 1159 | fossil_free(zUuid); |
| 1160 | }else{ |
| 1161 | /* Anything else */ |
| 1162 | zRes = mprintf("%W", zMsg); |
| 1163 | } |
| 1164 | if( zRes ){ |
| 1165 |
| --- src/chat.c | |
| +++ src/chat.c | |
| @@ -1137,12 +1137,11 @@ | |
| 1137 | ); |
| 1138 | fossil_free(zBranch); |
| 1139 | fossil_free(zUuid); |
| 1140 | }else if( zType[0]=='w' ){ |
| 1141 | /* Wiki page changes */ |
| 1142 | char *zUuid = rid_to_uuid(rid); |
| 1143 | wiki_hyperlink_override(zUuid); |
| 1144 | if( zMsg[0]=='-' ){ |
| 1145 | zRes = mprintf("Delete wiki page <a href='%R/whistory?name=%t'>%h</a>", |
| 1146 | zMsg+1, zMsg+1); |
| 1147 | }else if( zMsg[0]=='+' ){ |
| @@ -1155,10 +1154,17 @@ | |
| 1154 | }else{ |
| 1155 | zRes = mprintf("%W", zMsg); |
| 1156 | } |
| 1157 | wiki_hyperlink_override(0); |
| 1158 | fossil_free(zUuid); |
| 1159 | }else if( zType[0]=='f' ){ |
| 1160 | /* Forum changes */ |
| 1161 | char *zUuid = rid_to_uuid(rid); |
| 1162 | zRes = mprintf( "%W (artifact: <a href='%R/info/%S'>%S</a>, " |
| 1163 | "user: <a href='%R/timeline?u=%t&c=%S'>%h</a>)", |
| 1164 | zMsg, zUuid, zUuid, zUser, zUuid, zUser); |
| 1165 | fossil_free(zUuid); |
| 1166 | }else{ |
| 1167 | /* Anything else */ |
| 1168 | zRes = mprintf("%W", zMsg); |
| 1169 | } |
| 1170 | if( zRes ){ |
| 1171 |
+7
-3
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -2334,11 +2334,11 @@ | ||
| 2334 | 2334 | int i, rc = TH_OK; |
| 2335 | 2335 | Manifest *p; |
| 2336 | 2336 | int parentid = 0; |
| 2337 | 2337 | int permitHooks = (flags & MC_PERMIT_HOOKS); |
| 2338 | 2338 | const char *zScript = 0; |
| 2339 | - const char *zUuid = 0; | |
| 2339 | + char *zUuid = 0; | |
| 2340 | 2340 | |
| 2341 | 2341 | if( g.fSqlTrace ){ |
| 2342 | 2342 | fossil_trace("-- manifest_crosslink(%d)\n", rid); |
| 2343 | 2343 | } |
| 2344 | 2344 | manifest_create_event_triggers(); |
| @@ -2370,11 +2370,11 @@ | ||
| 2370 | 2370 | } |
| 2371 | 2371 | db_begin_transaction(); |
| 2372 | 2372 | if( p->type==CFTYPE_MANIFEST ){ |
| 2373 | 2373 | if( permitHooks ){ |
| 2374 | 2374 | zScript = xfer_commit_code(); |
| 2375 | - zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); | |
| 2375 | + zUuid = rid_to_uuid(rid); | |
| 2376 | 2376 | } |
| 2377 | 2377 | if( p->nCherrypick && db_table_exists("repository","cherrypick") ){ |
| 2378 | 2378 | int i; |
| 2379 | 2379 | for(i=0; i<p->nCherrypick; i++){ |
| 2380 | 2380 | db_multi_exec( |
| @@ -2722,11 +2722,12 @@ | ||
| 2722 | 2722 | branchMove = 0; |
| 2723 | 2723 | if( permitHooks && db_exists("SELECT 1 FROM event, blob" |
| 2724 | 2724 | " WHERE event.type='ci' AND event.objid=blob.rid" |
| 2725 | 2725 | " AND blob.uuid=%Q", zTagUuid) ){ |
| 2726 | 2726 | zScript = xfer_commit_code(); |
| 2727 | - zUuid = zTagUuid; | |
| 2727 | + fossil_free(zUuid); | |
| 2728 | + zUuid = fossil_strdup(zTagUuid); | |
| 2728 | 2729 | } |
| 2729 | 2730 | } |
| 2730 | 2731 | zName = p->aTag[i].zName; |
| 2731 | 2732 | zValue = p->aTag[i].zValue; |
| 2732 | 2733 | if( strcmp(zName, "*branch")==0 ){ |
| @@ -2805,10 +2806,12 @@ | ||
| 2805 | 2806 | } |
| 2806 | 2807 | if( p->type==CFTYPE_FORUM ){ |
| 2807 | 2808 | int froot, fprev, firt; |
| 2808 | 2809 | char *zFType; |
| 2809 | 2810 | char *zTitle; |
| 2811 | + | |
| 2812 | + assert( 0==zUuid ); | |
| 2810 | 2813 | schema_forum(); |
| 2811 | 2814 | search_doc_touch('f', rid, 0); |
| 2812 | 2815 | froot = p->zThreadRoot ? uuid_to_rid(p->zThreadRoot, 1) : rid; |
| 2813 | 2816 | fprev = p->nParent ? uuid_to_rid(p->azParent[0],1) : 0; |
| 2814 | 2817 | firt = p->zInReplyTo ? uuid_to_rid(p->zInReplyTo,1) : 0; |
| @@ -2877,10 +2880,11 @@ | ||
| 2877 | 2880 | rc = xfer_run_common_script(); |
| 2878 | 2881 | if( rc==TH_OK ){ |
| 2879 | 2882 | rc = xfer_run_script(zScript, zUuid, 0); |
| 2880 | 2883 | } |
| 2881 | 2884 | } |
| 2885 | + fossil_free(zUuid); | |
| 2882 | 2886 | if( p->type==CFTYPE_MANIFEST ){ |
| 2883 | 2887 | manifest_cache_insert(p); |
| 2884 | 2888 | }else{ |
| 2885 | 2889 | manifest_destroy(p); |
| 2886 | 2890 | } |
| 2887 | 2891 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -2334,11 +2334,11 @@ | |
| 2334 | int i, rc = TH_OK; |
| 2335 | Manifest *p; |
| 2336 | int parentid = 0; |
| 2337 | int permitHooks = (flags & MC_PERMIT_HOOKS); |
| 2338 | const char *zScript = 0; |
| 2339 | const char *zUuid = 0; |
| 2340 | |
| 2341 | if( g.fSqlTrace ){ |
| 2342 | fossil_trace("-- manifest_crosslink(%d)\n", rid); |
| 2343 | } |
| 2344 | manifest_create_event_triggers(); |
| @@ -2370,11 +2370,11 @@ | |
| 2370 | } |
| 2371 | db_begin_transaction(); |
| 2372 | if( p->type==CFTYPE_MANIFEST ){ |
| 2373 | if( permitHooks ){ |
| 2374 | zScript = xfer_commit_code(); |
| 2375 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 2376 | } |
| 2377 | if( p->nCherrypick && db_table_exists("repository","cherrypick") ){ |
| 2378 | int i; |
| 2379 | for(i=0; i<p->nCherrypick; i++){ |
| 2380 | db_multi_exec( |
| @@ -2722,11 +2722,12 @@ | |
| 2722 | branchMove = 0; |
| 2723 | if( permitHooks && db_exists("SELECT 1 FROM event, blob" |
| 2724 | " WHERE event.type='ci' AND event.objid=blob.rid" |
| 2725 | " AND blob.uuid=%Q", zTagUuid) ){ |
| 2726 | zScript = xfer_commit_code(); |
| 2727 | zUuid = zTagUuid; |
| 2728 | } |
| 2729 | } |
| 2730 | zName = p->aTag[i].zName; |
| 2731 | zValue = p->aTag[i].zValue; |
| 2732 | if( strcmp(zName, "*branch")==0 ){ |
| @@ -2805,10 +2806,12 @@ | |
| 2805 | } |
| 2806 | if( p->type==CFTYPE_FORUM ){ |
| 2807 | int froot, fprev, firt; |
| 2808 | char *zFType; |
| 2809 | char *zTitle; |
| 2810 | schema_forum(); |
| 2811 | search_doc_touch('f', rid, 0); |
| 2812 | froot = p->zThreadRoot ? uuid_to_rid(p->zThreadRoot, 1) : rid; |
| 2813 | fprev = p->nParent ? uuid_to_rid(p->azParent[0],1) : 0; |
| 2814 | firt = p->zInReplyTo ? uuid_to_rid(p->zInReplyTo,1) : 0; |
| @@ -2877,10 +2880,11 @@ | |
| 2877 | rc = xfer_run_common_script(); |
| 2878 | if( rc==TH_OK ){ |
| 2879 | rc = xfer_run_script(zScript, zUuid, 0); |
| 2880 | } |
| 2881 | } |
| 2882 | if( p->type==CFTYPE_MANIFEST ){ |
| 2883 | manifest_cache_insert(p); |
| 2884 | }else{ |
| 2885 | manifest_destroy(p); |
| 2886 | } |
| 2887 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -2334,11 +2334,11 @@ | |
| 2334 | int i, rc = TH_OK; |
| 2335 | Manifest *p; |
| 2336 | int parentid = 0; |
| 2337 | int permitHooks = (flags & MC_PERMIT_HOOKS); |
| 2338 | const char *zScript = 0; |
| 2339 | char *zUuid = 0; |
| 2340 | |
| 2341 | if( g.fSqlTrace ){ |
| 2342 | fossil_trace("-- manifest_crosslink(%d)\n", rid); |
| 2343 | } |
| 2344 | manifest_create_event_triggers(); |
| @@ -2370,11 +2370,11 @@ | |
| 2370 | } |
| 2371 | db_begin_transaction(); |
| 2372 | if( p->type==CFTYPE_MANIFEST ){ |
| 2373 | if( permitHooks ){ |
| 2374 | zScript = xfer_commit_code(); |
| 2375 | zUuid = rid_to_uuid(rid); |
| 2376 | } |
| 2377 | if( p->nCherrypick && db_table_exists("repository","cherrypick") ){ |
| 2378 | int i; |
| 2379 | for(i=0; i<p->nCherrypick; i++){ |
| 2380 | db_multi_exec( |
| @@ -2722,11 +2722,12 @@ | |
| 2722 | branchMove = 0; |
| 2723 | if( permitHooks && db_exists("SELECT 1 FROM event, blob" |
| 2724 | " WHERE event.type='ci' AND event.objid=blob.rid" |
| 2725 | " AND blob.uuid=%Q", zTagUuid) ){ |
| 2726 | zScript = xfer_commit_code(); |
| 2727 | fossil_free(zUuid); |
| 2728 | zUuid = fossil_strdup(zTagUuid); |
| 2729 | } |
| 2730 | } |
| 2731 | zName = p->aTag[i].zName; |
| 2732 | zValue = p->aTag[i].zValue; |
| 2733 | if( strcmp(zName, "*branch")==0 ){ |
| @@ -2805,10 +2806,12 @@ | |
| 2806 | } |
| 2807 | if( p->type==CFTYPE_FORUM ){ |
| 2808 | int froot, fprev, firt; |
| 2809 | char *zFType; |
| 2810 | char *zTitle; |
| 2811 | |
| 2812 | assert( 0==zUuid ); |
| 2813 | schema_forum(); |
| 2814 | search_doc_touch('f', rid, 0); |
| 2815 | froot = p->zThreadRoot ? uuid_to_rid(p->zThreadRoot, 1) : rid; |
| 2816 | fprev = p->nParent ? uuid_to_rid(p->azParent[0],1) : 0; |
| 2817 | firt = p->zInReplyTo ? uuid_to_rid(p->zInReplyTo,1) : 0; |
| @@ -2877,10 +2880,11 @@ | |
| 2880 | rc = xfer_run_common_script(); |
| 2881 | if( rc==TH_OK ){ |
| 2882 | rc = xfer_run_script(zScript, zUuid, 0); |
| 2883 | } |
| 2884 | } |
| 2885 | fossil_free(zUuid); |
| 2886 | if( p->type==CFTYPE_MANIFEST ){ |
| 2887 | manifest_cache_insert(p); |
| 2888 | }else{ |
| 2889 | manifest_destroy(p); |
| 2890 | } |
| 2891 |