Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch filter-branch-ls-by-user Excluding Merge-Ins
This is equivalent to a diff from 9b10bf45 to 34e0f681
2023-09-29
| ||
13:33 | merge in filter-branch-ls-by-user ... (check-in: d6cdd955 user: preben tags: trunk) | |
2023-09-28
| ||
18:39 | Use verify_all_options() with fossil branch ls/lsh. ... (Closed-Leaf check-in: 34e0f681 user: preben tags: filter-branch-ls-by-user) | |
17:58 | Fix find_option() error and badly type --users in argument test. ... (check-in: 119cc37a user: preben tags: filter-branch-ls-by-user) | |
13:38 | Mark closed leaves with an X on the timeline graph. ... (check-in: 57bea365 user: drh tags: trunk) | |
13:18 | branch ls should also flag private branches with -R. ... (Closed-Leaf check-in: fcb40ac9 user: preben tags: branch-ls-private-fix) | |
10:42 | Filter branch ls output by user with check-ins on the branches. ... (check-in: d0f15a1b user: preben tags: filter-branch-ls-by-user) | |
2023-09-27
| ||
19:43 | Remove while(1) loop made redundant by [239b4c1362]. ... (Closed-Leaf check-in: f36e8886 user: preben tags: redundant-while-loop) | |
2023-09-26
| ||
13:03 | Allow styling leaves of closed branches in /timeline. ... (check-in: e042be53 user: preben tags: indicate-closed-branches-in-timeline) | |
11:04 | Update FTS when creating/updating tickets. Also avoids a stray row with rid 0. ... (Closed-Leaf check-in: fb5d53ec user: preben tags: fts-ticket-updates) | |
10:18 | Allow searching for wiki page titles as discussed in 31d8831c2d9809fa. ... (check-in: e6b8cc9f user: preben tags: search-wiki-titles) | |
2023-09-25
| ||
15:47 | If the value of a setting is changed into an empty string, then unset it, except for the rare setting that has the new keep-empty property. ... (Closed-Leaf check-in: b9bbb8d7 user: drh tags: unset-empty-settings) | |
2023-09-19
| ||
22:03 | Correction of simple typos in patch usage text. ... (check-in: 9b10bf45 user: mgagnon tags: trunk) | |
11:59 | Fix formatting for the help text of the 'branch' command. ... (check-in: 132af984 user: danield tags: trunk) | |
Changes to src/branch.c.
︙ | ︙ | |||
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | #define BRL_BOTH 0x003 /* Show both open and closed branches */ #define BRL_OPEN_CLOSED_MASK 0x003 #define BRL_ORDERBY_MTIME 0x004 /* Sort by MTIME. (otherwise sort by name)*/ #define BRL_REVERSE 0x008 /* Reverse the sort order */ #define BRL_PRIVATE 0x010 /* Show only private branches */ #define BRL_MERGED 0x020 /* Show only merged branches */ #define BRL_UNMERGED 0x040 /* Show only unmerged branches */ #endif /* INTERFACE */ /* ** Prepare a query that will list branches. ** ** If the BRL_ORDERBY_MTIME flag is set and nLimitMRU ("Limit Most Recently Used ** style") is a non-zero number, the result is limited to nLimitMRU entries, and ** the BRL_REVERSE flag is applied in an outer query after processing the limit, ** so that it's possible to generate short lists with the most recently modified ** branches sorted chronologically in either direction, as does the "branch lsh" ** command. ** For other cases, the outer query is also generated, but works as a no-op. The ** code to build the outer query is marked with *//* OUTER QUERY *//* comments. */ void branch_prepare_list_query( Stmt *pQuery, int brFlags, const char *zBrNameGlob, | > | > > | > > > > > > > > > > > > > > > | 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 | #define BRL_BOTH 0x003 /* Show both open and closed branches */ #define BRL_OPEN_CLOSED_MASK 0x003 #define BRL_ORDERBY_MTIME 0x004 /* Sort by MTIME. (otherwise sort by name)*/ #define BRL_REVERSE 0x008 /* Reverse the sort order */ #define BRL_PRIVATE 0x010 /* Show only private branches */ #define BRL_MERGED 0x020 /* Show only merged branches */ #define BRL_UNMERGED 0x040 /* Show only unmerged branches */ #define BRL_LIST_USERS 0x080 /* Populate list of users participating */ #endif /* INTERFACE */ /* ** Prepare a query that will list branches. ** ** If the BRL_ORDERBY_MTIME flag is set and nLimitMRU ("Limit Most Recently Used ** style") is a non-zero number, the result is limited to nLimitMRU entries, and ** the BRL_REVERSE flag is applied in an outer query after processing the limit, ** so that it's possible to generate short lists with the most recently modified ** branches sorted chronologically in either direction, as does the "branch lsh" ** command. ** For other cases, the outer query is also generated, but works as a no-op. The ** code to build the outer query is marked with *//* OUTER QUERY *//* comments. */ void branch_prepare_list_query( Stmt *pQuery, int brFlags, const char *zBrNameGlob, int nLimitMRU, const char *zUser ){ Blob sql; blob_init(&sql, 0, 0); brlist_create_temp_table(); /* Ignore nLimitMRU if no chronological sort requested. */ if( (brFlags & BRL_ORDERBY_MTIME)==0 ) nLimitMRU = 0; /* Undocumented: invert negative values for nLimitMRU, so that command-line ** arguments similar to `head -5' with "option numbers" are possible. */ if( nLimitMRU<0 ) nLimitMRU = -nLimitMRU; /* OUTER QUERY */ blob_append_sql(&sql,"SELECT name, isprivate, mergeto,"); if( brFlags & BRL_LIST_USERS ){ blob_append_sql(&sql, " (SELECT group_concat(user) FROM (" " SELECT DISTINCT * FROM (" " SELECT coalesce(euser,user) AS user" " FROM event" " WHERE type='ci' AND objid IN (" " SELECT rid FROM tagxref WHERE value=name)" " ORDER BY 1)))" ); }else{ blob_append_sql(&sql, " NULL"); } blob_append_sql(&sql," FROM ("); /* INNER QUERY */ switch( brFlags & BRL_OPEN_CLOSED_MASK ){ case BRL_CLOSED_ONLY: { blob_append_sql(&sql, "SELECT name, isprivate, mtime, mergeto FROM tmp_brlist WHERE isclosed" ); break; } |
︙ | ︙ | |||
328 329 330 331 332 333 334 | "SELECT name, isprivate, mtime, mergeto FROM tmp_brlist WHERE NOT isclosed" ); break; } } if( brFlags & BRL_PRIVATE ) blob_append_sql(&sql, " AND isprivate"); if( brFlags & BRL_MERGED ) blob_append_sql(&sql, " AND mergeto IS NOT NULL"); | | > > > > > | 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 | "SELECT name, isprivate, mtime, mergeto FROM tmp_brlist WHERE NOT isclosed" ); break; } } if( brFlags & BRL_PRIVATE ) blob_append_sql(&sql, " AND isprivate"); if( brFlags & BRL_MERGED ) blob_append_sql(&sql, " AND mergeto IS NOT NULL"); if( zBrNameGlob ) blob_append_sql(&sql, " AND (name GLOB %Q)", zBrNameGlob); if( zUser && zUser[0] ) blob_append_sql(&sql, " AND EXISTS (SELECT 1 FROM event WHERE type='ci' AND (user=%Q OR euser=%Q)" " AND objid in (SELECT rid FROM tagxref WHERE value=tmp_brlist.name))", zUser, zUser ); if( brFlags & BRL_ORDERBY_MTIME ){ blob_append_sql(&sql, " ORDER BY -mtime"); }else{ blob_append_sql(&sql, " ORDER BY name COLLATE nocase"); } if( brFlags & BRL_REVERSE && !nLimitMRU ){ blob_append_sql(&sql," DESC"); |
︙ | ︙ | |||
612 613 614 615 616 617 618 | ** ** > fossil branch list|ls ?OPTIONS? ?GLOB? ** > fossil branch lsh ?OPTIONS? ?LIMIT? ** ** List all branches. ** ** Options: | | | | | | | | > > > | 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 | ** ** > fossil branch list|ls ?OPTIONS? ?GLOB? ** > fossil branch lsh ?OPTIONS? ?LIMIT? ** ** List all branches. ** ** Options: ** -a|--all List all branches. Default show only open branches ** -c|--closed List closed branches ** -m|--merged List branches merged into the current branch ** -M|--unmerged List branches not merged into the current branch ** -p List only private branches ** -r Reverse the sort order ** -t Show recently changed branches first ** --self List only branches where you participate ** --username USER List only branches where USER participate ** --users N List up to N users partipiating ** ** The current branch is marked with an asterisk. Private branches are ** marked with a hash sign. ** ** If GLOB is given, show only branches matching the pattern. ** ** The "lsh" variant of this subcommand shows recently changed branches, |
︙ | ︙ | |||
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 | fossil_print("%s: open as of %s on %.16s\n", zBrName, zDate, zUuid); } } }else if( strncmp(zCmd,"list",n)==0 || strncmp(zCmd, "ls", n)==0 || strcmp(zCmd, "lsh")==0 ){ Stmt q; int vid; char *zCurrent = 0; const char *zBrNameGlob = 0; int nLimit = 0; int brFlags = BRL_OPEN_ONLY; if( find_option("all","a",0)!=0 ) brFlags = BRL_BOTH; if( find_option("closed","c",0)!=0 ) brFlags = BRL_CLOSED_ONLY; if( find_option("t",0,0)!=0 ) brFlags |= BRL_ORDERBY_MTIME; if( find_option("r",0,0)!=0 ) brFlags |= BRL_REVERSE; if( find_option("p",0,0)!=0 ) brFlags |= BRL_PRIVATE; if( find_option("merged","m",0)!=0 ) brFlags |= BRL_MERGED; if( find_option("unmerged","M",0)!=0 ) brFlags |= BRL_UNMERGED; if ( (brFlags & BRL_MERGED) && (brFlags & BRL_UNMERGED) ){ fossil_fatal("flags --merged and --unmerged are mutually exclusive"); } if( strcmp(zCmd, "lsh")==0 ){ nLimit = 5; if( g.argc>4 || (g.argc==4 && (nLimit = atoi(g.argv[3]))==0) ){ fossil_fatal("the lsh subcommand allows one optional numeric argument"); } brFlags |= BRL_ORDERBY_MTIME; }else{ if( g.argc >= 4 ) zBrNameGlob = g.argv[3]; } if( g.localOpen ){ vid = db_lget_int("checkout", 0); zCurrent = db_text(0, "SELECT value FROM tagxref" " WHERE rid=%d AND tagid=%d", vid, TAG_BRANCH); } | > > > > > > > > > > > > > > > > | > > | > > > > > > > > > > > > > > > > > > > > | 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 | fossil_print("%s: open as of %s on %.16s\n", zBrName, zDate, zUuid); } } }else if( strncmp(zCmd,"list",n)==0 || strncmp(zCmd, "ls", n)==0 || strcmp(zCmd, "lsh")==0 ){ Stmt q; Blob txt = empty_blob; int vid; char *zCurrent = 0; const char *zBrNameGlob = 0; const char *zUser = find_option("username",0,1); const char *zUsersOpt = find_option("users",0,1); int nUsers = zUsersOpt ? atoi(zUsersOpt) : 0; int nLimit = 0; int brFlags = BRL_OPEN_ONLY; if( find_option("all","a",0)!=0 ) brFlags = BRL_BOTH; if( find_option("closed","c",0)!=0 ) brFlags = BRL_CLOSED_ONLY; if( find_option("t",0,0)!=0 ) brFlags |= BRL_ORDERBY_MTIME; if( find_option("r",0,0)!=0 ) brFlags |= BRL_REVERSE; if( find_option("p",0,0)!=0 ) brFlags |= BRL_PRIVATE; if( find_option("merged","m",0)!=0 ) brFlags |= BRL_MERGED; if( find_option("unmerged","M",0)!=0 ) brFlags |= BRL_UNMERGED; if( find_option("self",0,0)!=0 ){ if( zUser ){ fossil_fatal("flags --username and --self are mutually exclusive"); } user_select(); zUser = login_name(); } verify_all_options(); if ( (brFlags & BRL_MERGED) && (brFlags & BRL_UNMERGED) ){ fossil_fatal("flags --merged and --unmerged are mutually exclusive"); } if( zUsersOpt ){ if( nUsers <= 0) fossil_fatal("With --users, N must be positive"); brFlags |= BRL_LIST_USERS; } if( strcmp(zCmd, "lsh")==0 ){ nLimit = 5; if( g.argc>4 || (g.argc==4 && (nLimit = atoi(g.argv[3]))==0) ){ fossil_fatal("the lsh subcommand allows one optional numeric argument"); } brFlags |= BRL_ORDERBY_MTIME; }else{ if( g.argc >= 4 ) zBrNameGlob = g.argv[3]; } if( g.localOpen ){ vid = db_lget_int("checkout", 0); zCurrent = db_text(0, "SELECT value FROM tagxref" " WHERE rid=%d AND tagid=%d", vid, TAG_BRANCH); } branch_prepare_list_query(&q, brFlags, zBrNameGlob, nLimit, zUser); blob_init(&txt, 0, 0); while( db_step(&q)==SQLITE_ROW ){ const char *zBr = db_column_text(&q, 0); int isPriv = zCurrent!=0 && db_column_int(&q, 1)==1; const char *zMergeTo = db_column_text(&q, 2); int isCur = zCurrent!=0 && fossil_strcmp(zCurrent,zBr)==0; const char *zUsers = db_column_text(&q, 3); if( (brFlags & BRL_MERGED) && fossil_strcmp(zCurrent,zMergeTo)!=0 ){ continue; } if( (brFlags & BRL_UNMERGED) && (fossil_strcmp(zCurrent,zMergeTo)==0 || isCur) ){ continue; } blob_appendf(&txt, "%s%s%s", ( (brFlags & BRL_PRIVATE) ? " " : ( isPriv ? "#" : " ") ), (isCur ? "* " : " "), zBr); if( nUsers ){ char c; const char *cp; const char *pComma = 0; int commas = 0; for( cp = zUsers; ( c = *cp ) != 0; cp++ ){ if( c == ',' ){ commas++; if( commas == nUsers ) pComma = cp; } } if( pComma ){ blob_appendf(&txt, " (%.*s,... %i more)", pComma - zUsers, zUsers, commas + 1 - nUsers); }else{ blob_appendf(&txt, " (%s)", zUsers); } } fossil_print("%s\n", blob_str(&txt)); blob_reset(&txt); } db_finalize(&q); }else if( strncmp(zCmd,"new",n)==0 ){ branch_new(); }else if( strncmp(zCmd,"close",5)==0 ){ if(g.argc<4){ usage("branch close branch-name(s)..."); |
︙ | ︙ | |||
920 921 922 923 924 925 926 | @ closed leaves</a></div>. @ Closed branches are fixed and do not change (unless they are first @ reopened).</li> @ </ol> style_sidebox_end(); #endif | | | 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 | @ closed leaves</a></div>. @ Closed branches are fixed and do not change (unless they are first @ reopened).</li> @ </ol> style_sidebox_end(); #endif branch_prepare_list_query(&q, brFlags, 0, 0, 0); cnt = 0; while( db_step(&q)==SQLITE_ROW ){ const char *zBr = db_column_text(&q, 0); if( cnt==0 ){ if( colorTest ){ @ <h2>Default background colors for all branches:</h2> }else if( showClosed ){ |
︙ | ︙ |
Changes to src/json_branch.c.
︙ | ︙ | |||
126 127 128 129 130 131 132 | : 0; if(zCurrent){ cson_object_set(pay,"current",json_new_string(zCurrent)); } } | | | 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | : 0; if(zCurrent){ cson_object_set(pay,"current",json_new_string(zCurrent)); } } branch_prepare_list_query(&q, branchListFlags, 0, 0, 0); /* Allow a user? */ cson_object_set(pay,"branches",listV); while((SQLITE_ROW==db_step(&q))){ cson_value * v = cson_sqlite3_column_to_value(q.pStmt,0); if(v){ cson_array_append(list,v); }else if(!sawConversionError){ sawConversionError = mprintf("Column-to-json failed @ %s:%d", |
︙ | ︙ |