##// END OF EJS Templates
relnotes: various tweaks for release notes...
av6 -
r40491:683e99f0 stable
parent child Browse files
Show More
@@ -1,181 +1,191 b''
1 #!/usr/bin/env python3
1 #!/usr/bin/env python3
2 """Generate release notes from our commit log.
2 """Generate release notes from our commit log.
3
3
4 This uses the relnotes extension directives when they're available,
4 This uses the relnotes extension directives when they're available,
5 and falls back to our old pre-relnotes logic that used to live in the
5 and falls back to our old pre-relnotes logic that used to live in the
6 release-tools repo.
6 release-tools repo.
7 """
7 """
8 import argparse
8 import argparse
9 import re
9 import re
10 import subprocess
10 import subprocess
11
11
12 # Regenerate this list with
13 # hg export 'grep("\.\. [a-z]+::")' | grep '^\.\.' | \
14 # sed 's/.. //;s/::.*//' | sort -u
15 rnsections = ["api", "bc", "container", "feature", "fix", "note", "perf"]
16
17 rules = {
12 rules = {
18 # keep
13 # keep
19 r"\(issue": 100,
14 r"\(issue": 100,
20 r"\(BC\)": 100,
15 r"\(BC\)": 100,
21 r"\(API\)": 100,
16 r"\(API\)": 100,
22 # core commands, bump up
17 # core commands, bump up
23 r"(commit|files|log|pull|push|patch|status|tag|summary)(|s|es):": 20,
18 r"(commit|files|log|pull|push|patch|status|tag|summary)(|s|es):": 20,
24 r"(annotate|alias|branch|bookmark|clone|graft|import|verify).*:": 20,
19 r"(annotate|alias|branch|bookmark|clone|graft|import|verify).*:": 20,
25 # extensions, bump up
20 # extensions, bump up
26 r"(mq|shelve|rebase):": 20,
21 r"(mq|shelve|rebase):": 20,
27 # newsy
22 # newsy
28 r": deprecate": 20,
23 r": deprecate": 20,
29 r"(option|feature|command|support)": 10,
24 r"( ability|command|feature|option|support)": 10,
25 # experimental
26 r"hg-experimental": 20,
27 r"(from|graduate).*experimental": 15,
28 r"(hide|mark).*experimental": -10,
30 # bug-like?
29 # bug-like?
31 r"(fix|don't break|improve)": 7,
30 r"(fix|don't break|improve)": 7,
31 r"(not|n't|avoid|fix|prevent).*crash": 10,
32 # boring stuff, bump down
32 # boring stuff, bump down
33 r"^contrib": -5,
33 r"^contrib": -5,
34 r"debug": -5,
34 r"debug": -5,
35 r"help": -5,
35 r"help": -5,
36 r"(doc|bundle2|obsolete|obsmarker|rpm|setup|debug\S+:)": -15,
36 r"(doc|metavar|bundle2|obsolete|obsmarker|rpm|setup|debug\S+:)": -15,
37 r"(check-code|check-commit|import-checker)": -20,
37 r"(check-code|check-commit|check-config|import-checker)": -20,
38 r"(flake8|lintian|pyflakes|pylint)": -20,
38 # cleanups and refactoring
39 # cleanups and refactoring
39 r"(cleanup|whitespace|nesting|indent|spelling|comment)": -20,
40 r"(cleanup|white ?space|spelling|quoting)": -20,
40 r"(typo|hint|note|style:|correct doc)": -20,
41 r"(flatten|dedent|indent|nesting|unnest)": -20,
42 r"(typo|hint|note|comment|TODO|FIXME)": -20,
43 r"(style:|convention|one-?liner)": -20,
41 r"_": -10,
44 r"_": -10,
42 r"(argument|absolute_import|attribute|assignment|mutable)": -15,
45 r"(argument|absolute_import|attribute|assignment|mutable)": -15,
43 r"(unused|useless|unnecessary|duplicate|deprecated|scope|True|False)": -10,
46 r"(scope|True|False)": -10,
47 r"(unused|useless|unnecessary|superfluous|duplicate|deprecated)": -10,
44 r"(redundant|pointless|confusing|uninitialized|meaningless|dead)": -10,
48 r"(redundant|pointless|confusing|uninitialized|meaningless|dead)": -10,
45 r": (drop|remove|inherit|rename|simplify|naming|inline)": -10,
49 r": (drop|remove|delete|rip out)": -10,
46 r"(docstring|document .* method)": -20,
50 r": (inherit|rename|simplify|naming|inline)": -10,
47 r"(factor|extract|prepare|split|replace| import)": -20,
51 r"(correct doc|docstring|document .* method)": -20,
48 r": add.*(function|method|implementation|test|example)": -10,
52 r"(abstract|factor|extract|prepare|split|replace| import)": -20,
49 r": (move|extract) .* (to|into|from)": -20,
53 r": add.*(function|method|implementation|example)": -10,
54 r": (move|extract) .* (to|into|from|out of)": -20,
50 r": implement ": -5,
55 r": implement ": -5,
51 r": use .* implementation": -20,
56 r": use .* implementation": -20,
52 r"\S\S\S+\.\S\S\S\S+": -5,
57 r"\S\S\S+\.\S\S\S\S+": -5,
53 r": use .* instead of": -20,
58 r": use .* instead of": -20,
54 r"__": -5,
59 r"__": -5,
55 # dumb keywords
60 # dumb keywords
56 r"\S+/\S+:": -10,
61 r"\S+/\S+:": -10,
57 r"\S+\.\S+:": -10,
62 r"\S+\.\S+:": -10,
63 # python compatibility
64 r"[Pp]y(|thon) ?[23]": -20,
65 r"pycompat": -20,
66 r"(coerce|convert|encode) .*to (byte|sys|)(s|str|string)": -20,
67 # tests
68 r"^test(|s|ing|runner|-\S+):": -20,
69 r"^(f|hghave|run-tests):": -20,
70 r"add.* tests?": -20,
71 r"(buildbot|fuzz|mock|ratchet)": -10,
58 # drop
72 # drop
59 r"^i18n-": -50,
73 r"^i18n-": -50,
60 r"^i18n:.*(hint|comment)": -50,
74 r"^i18n:.*(hint|comment)": -50,
61 r"perf:": -50,
75 r"perf:": -50,
62 r"check-code:": -50,
63 r"Added.*for changeset": -50,
76 r"Added.*for changeset": -50,
64 r"tests?:": -50,
65 r"test-": -50,
66 r"add.* tests": -50,
67 r"^_": -50,
77 r"^_": -50,
68 }
78 }
69
79
70 cutoff = 10
80 cutoff = 10
71 commits = []
81 commits = []
72
82
73 groupings = [
83 groupings = [
74 (r"util|parsers|repo|ctx|context|revlog|filelog|alias|cmdutil", "core"),
84 (r"util|parsers|repo|ctx|context|revlog|filelog|alias|cmdutil", "core"),
75 (r"revset|templater|ui|dirstate|hook|i18n|transaction|wire", "core"),
85 (r"revset|template|ui|dirstate|hook|i18n|transaction|wire|vfs", "core"),
76 (r"color|pager", "core"),
86 (r"dispatch|exchange|localrepo|streamclone|color|pager", "core"),
77 (r"hgweb|paper|coal|gitweb", "hgweb"),
87 (r"hgweb|paper|coal|gitweb|monoblue|spartan", "hgweb"),
78 (r"pull|push|revert|resolve|annotate|bookmark|branch|clone", "commands"),
88 (r"pull|push|revert|resolve|annotate|bookmark|branch|clone", "commands"),
79 (r"commands|commit|config|files|graft|import|log|merge|patch", "commands"),
89 (r"commands|commit|config|files|graft|import|log|merge|patch", "commands"),
80 (r"phases|status|summary|amend|tag|help|verify", "commands"),
90 (r"phases|status|summary|amend|tag|help|verify", "commands"),
81 (r"rebase|mq|convert|eol|histedit|largefiles", "extensions"),
91 (r"rebase|mq|convert|eol|histedit|largefiles", "extensions"),
82 (r"shelve|unshelve", "extensions"),
92 (r"shelve|unshelve", "extensions"),
83 ]
93 ]
84
94
85 def main():
95 def main():
86 ap = argparse.ArgumentParser()
96 desc = "example: %(prog)s 4.7.2 --stoprev 4.8rc0"
97 ap = argparse.ArgumentParser(description=desc)
87 ap.add_argument(
98 ap.add_argument(
88 "startrev",
99 "startrev",
89 metavar="REV",
100 metavar="REV",
90 type=str,
101 type=str,
91 nargs=1,
92 help=(
102 help=(
93 "Starting revision for the release notes. This revision "
103 "Starting revision for the release notes. This revision "
94 "won't be included, but later revisions will."
104 "won't be included, but later revisions will."
95 ),
105 ),
96 )
106 )
97 ap.add_argument(
107 ap.add_argument(
98 "--stoprev",
108 "--stoprev",
99 metavar="REV",
109 metavar="REV",
100 type=str,
110 type=str,
101 default="@",
111 default="@",
102 nargs=1,
103 help=(
112 help=(
104 "Stop revision for release notes. This revision will be included,"
113 "Stop revision for release notes. This revision will be included,"
105 " but no later revisions will. This revision needs to be "
114 " but no later revisions will. This revision needs to be "
106 "a descendant of startrev."
115 "a descendant of startrev."
107 ),
116 ),
108 )
117 )
109 args = ap.parse_args()
118 args = ap.parse_args()
110 fromext = subprocess.check_output(
119 fromext = subprocess.check_output(
111 [
120 [
112 "hg",
121 "hg",
113 "--config",
122 "--config",
114 "extensions.releasenotes=",
123 "extensions.releasenotes=",
115 "releasenotes",
124 "releasenotes",
116 "-r",
125 "-r",
117 "%s::%s" % (args.startrev[0], args.stoprev[0]),
126 "only(%s, %s)" % (args.stoprev, args.startrev),
118 ]
127 ]
119 ).decode("utf-8")
128 ).decode("utf-8")
120 # Find all release notes from un-relnotes-flagged commits.
129 # Find all release notes from un-relnotes-flagged commits.
121 for entry in sorted(
130 for entry in sorted(
122 subprocess.check_output(
131 subprocess.check_output(
123 [
132 [
124 "hg",
133 "hg",
125 "log",
134 "log",
126 "-r",
135 "-r",
127 r'%s::%s - merge() - grep("\n\.\. (%s)::")'
136 "only(%s, %s) - merge()" % (args.stoprev, args.startrev),
128 % (args.startrev[0], args.stoprev[0], "|".join(rnsections)),
129 "-T",
137 "-T",
130 r"{desc|firstline}\n",
138 r"{desc|firstline}\n",
131 ]
139 ]
132 )
140 )
133 .decode("utf-8")
141 .decode("utf-8")
134 .splitlines()
142 .splitlines()
135 ):
143 ):
136 desc = entry.replace("`", "'")
144 desc = entry.replace("`", "'")
137
145
138 score = 0
146 score = 0
139 for rule, val in rules.items():
147 for rule, val in rules.items():
140 if re.search(rule, desc):
148 if re.search(rule, desc):
141 score += val
149 score += val
142
150
143 desc = desc.replace("(issue", "(Bts:issue")
151 desc = desc.replace("(issue", "(Bts:issue")
144
152
145 if score >= cutoff:
153 if score >= cutoff:
146 commits.append(desc)
154 commits.append(desc)
147 # Group unflagged notes.
155 # Group unflagged notes.
148 groups = {}
156 groups = {}
149 bcs = []
157 bcs = []
150 apis = []
158 apis = []
151
159
152 for d in commits:
160 for d in commits:
153 if "(BC)" in d:
161 if "(BC)" in d:
154 bcs.append(d)
162 bcs.append(d)
155 if "(API)" in d:
163 if "(API)" in d:
156 apis.append(d)
164 apis.append(d)
157 for rule, g in groupings:
165 for rule, g in groupings:
158 if re.match(rule, d):
166 if re.match(rule, d):
159 groups.setdefault(g, []).append(d)
167 groups.setdefault(g, []).append(d)
160 break
168 break
161 else:
169 else:
162 groups.setdefault("unsorted", []).append(d)
170 groups.setdefault("unsorted", []).append(d)
163 print(fromext)
171 print(fromext)
164 # print legacy release notes sections
172 # print legacy release notes sections
165 for g in sorted(groups):
173 for g in sorted(groups):
166 print("\n=== %s ===" % g)
174 print("\n=== %s ===" % g)
167 for d in sorted(groups[g]):
175 for d in sorted(groups[g]):
168 print(" * %s" % d)
176 print(" * %s" % d)
169
177
170 print("\n=== BC ===\n")
178 if bcs:
179 print("\n=== Behavior Changes ===\n")
171
180
172 for d in sorted(bcs):
181 for d in sorted(bcs):
173 print(" * %s" % d)
182 print(" * %s" % d)
174
183
175 print("\n=== API Changes ===\n")
184 if apis:
185 print("\n=== Internal API Changes ===\n")
176
186
177 for d in sorted(apis):
187 for d in sorted(apis):
178 print(" * %s" % d)
188 print(" * %s" % d)
179
189
180 if __name__ == "__main__":
190 if __name__ == "__main__":
181 main()
191 main()
@@ -1,291 +1,317 b''
1 #require test-repo py3exe
1 #require test-repo py3exe
2 $ . "$TESTDIR/helpers-testrepo.sh"
2 $ . "$TESTDIR/helpers-testrepo.sh"
3
3
4 $ cd $TESTDIR/..
4 $ cd $TESTDIR/..
5 $ python3 contrib/relnotes 4.4 --stoprev 4.5
5 $ python3 contrib/relnotes 4.4 --stoprev 4.5
6 changeset 3398603c5621: unexpected block in release notes directive feature
6 changeset 3398603c5621: unexpected block in release notes directive feature
7 New Features
7 New Features
8 ============
8 ============
9
9
10 revert --interactive
10 revert --interactive
11 --------------------
11 --------------------
12
12
13 The revert command now accepts the flag --interactive to allow reverting only
13 The revert command now accepts the flag --interactive to allow reverting only
14 some of the changes to the specified files.
14 some of the changes to the specified files.
15
15
16 Rebase with different destination per source revision
16 Rebase with different destination per source revision
17 -----------------------------------------------------
17 -----------------------------------------------------
18
18
19 Previously, rebase only supports one unique destination. Now "SRC" and
19 Previously, rebase only supports one unique destination. Now "SRC" and
20 "ALLSRC" can be used in rebase destination revset to precisely define
20 "ALLSRC" can be used in rebase destination revset to precisely define
21 destination per each individual source revision.
21 destination per each individual source revision.
22
22
23 For example, the following command could move some orphaned changesets to
23 For example, the following command could move some orphaned changesets to
24 reasonable new places so they become no longer orphaned:
24 reasonable new places so they become no longer orphaned:
25
25
26 hg rebase -r 'orphan()-obsolete()' -d 'max((successors(max(roots(ALLSRC) &
26 hg rebase -r 'orphan()-obsolete()' -d 'max((successors(max(roots(ALLSRC) &
27 ::SRC)^)-obsolete())::)'
27 ::SRC)^)-obsolete())::)'
28
28
29 Accessing hidden changesets
29 Accessing hidden changesets
30 ---------------------------
30 ---------------------------
31
31
32 Set config option 'experimental.directaccess = True' to access hidden
32 Set config option 'experimental.directaccess = True' to access hidden
33 changesets from read only commands.
33 changesets from read only commands.
34
34
35 githelp extension
35 githelp extension
36 -----------------
36 -----------------
37
37
38 The "githelp" extension provides the "hg githelp" command. This command
38 The "githelp" extension provides the "hg githelp" command. This command
39 attempts to convert a "git" command to its Mercurial equivalent. The extension
39 attempts to convert a "git" command to its Mercurial equivalent. The extension
40 can be useful to Git users new to Mercurial.
40 can be useful to Git users new to Mercurial.
41
41
42 Other Changes
42 Other Changes
43 -------------
43 -------------
44
44
45 * When interactive revert is run against a revision other than the working
45 * When interactive revert is run against a revision other than the working
46 directory parent, the diff shown is the diff to *apply* to the working
46 directory parent, the diff shown is the diff to *apply* to the working
47 directory, rather than the diff to *discard* from the working copy. This is
47 directory, rather than the diff to *discard* from the working copy. This is
48 in line with related user experiences with 'git' and appears to be less
48 in line with related user experiences with 'git' and appears to be less
49 confusing with 'ui.interface=curses'.
49 confusing with 'ui.interface=curses'.
50
50
51 * Let 'hg rebase' avoid content-divergence by skipping obsolete changesets
51 * Let 'hg rebase' avoid content-divergence by skipping obsolete changesets
52 (and their descendants) when they are present in the rebase set along with
52 (and their descendants) when they are present in the rebase set along with
53 one of their successors but none of their successors is in destination.
53 one of their successors but none of their successors is in destination.
54
54
55 * hgweb now displays phases of non-public changesets
55 * hgweb now displays phases of non-public changesets
56
56
57 * The "HGPLAINEXCEPT" environment variable can now include "color" to allow
57 * The "HGPLAINEXCEPT" environment variable can now include "color" to allow
58 automatic output colorization in otherwise automated environments.
58 automatic output colorization in otherwise automated environments.
59
59
60 * A new unamend command in uncommit extension which undoes the effect of the
60 * A new unamend command in uncommit extension which undoes the effect of the
61 amend command by creating a new changeset which was there before amend and
61 amend command by creating a new changeset which was there before amend and
62 moving the changes that were amended to the working directory.
62 moving the changes that were amended to the working directory.
63
63
64 * A '--abort' flag to merge command to abort the ongoing merge.
64 * A '--abort' flag to merge command to abort the ongoing merge.
65
65
66 * An experimental flag '--rev' to 'hg branch' which can be used to change
66 * An experimental flag '--rev' to 'hg branch' which can be used to change
67 branch of changesets.
67 branch of changesets.
68
68
69 Backwards Compatibility Changes
69 Backwards Compatibility Changes
70 ===============================
70 ===============================
71
71
72 * "log --follow-first -rREV", which is deprecated, now follows the first
72 * "log --follow-first -rREV", which is deprecated, now follows the first
73 parent of merge revisions from the specified "REV" just like "log --follow
73 parent of merge revisions from the specified "REV" just like "log --follow
74 -rREV".
74 -rREV".
75
75
76 * "log --follow -rREV FILE.." now follows file history across copies and
76 * "log --follow -rREV FILE.." now follows file history across copies and
77 renames.
77 renames.
78
78
79 Bug Fixes
79 Bug Fixes
80 =========
80 =========
81
81
82 Issue 5165
82 Issue 5165
83 ----------
83 ----------
84
84
85 Bookmark, whose name is longer than 255, can again be exchanged again between
85 Bookmark, whose name is longer than 255, can again be exchanged again between
86 4.4+ client and servers.
86 4.4+ client and servers.
87
87
88 Performance Improvements
88 Performance Improvements
89 ========================
89 ========================
90
90
91 * bundle2 read I/O throughput significantly increased.
91 * bundle2 read I/O throughput significantly increased.
92
92
93 * Significant memory use reductions when reading from bundle2 bundles.
93 * Significant memory use reductions when reading from bundle2 bundles.
94
94
95 On the BSD repository, peak RSS during changegroup application decreased by
95 On the BSD repository, peak RSS during changegroup application decreased by
96 ~185 MB from ~752 MB to ~567 MB.
96 ~185 MB from ~752 MB to ~567 MB.
97
97
98 API Changes
98 API Changes
99 ===========
99 ===========
100
100
101 * bundlerepo.bundlerepository.bundle and
101 * bundlerepo.bundlerepository.bundle and
102 bundlerepo.bundlerepository.bundlefile are now prefixed with an underscore.
102 bundlerepo.bundlerepository.bundlefile are now prefixed with an underscore.
103
103
104 * Rename bundlerepo.bundlerepository.bundlefilespos to _cgfilespos.
104 * Rename bundlerepo.bundlerepository.bundlefilespos to _cgfilespos.
105
105
106 * dirstate no longer provides a 'dirs()' method. To test for the existence of
106 * dirstate no longer provides a 'dirs()' method. To test for the existence of
107 a directory in the dirstate, use 'dirstate.hasdir(dirname)'.
107 a directory in the dirstate, use 'dirstate.hasdir(dirname)'.
108
108
109 * bundle2 parts are no longer seekable by default.
109 * bundle2 parts are no longer seekable by default.
110
110
111 * mapping does not contain all template resources. use context.resource() in
111 * mapping does not contain all template resources. use context.resource() in
112 template functions.
112 template functions.
113
113
114 * "text=False|True" option is dropped from the vfs interface because of Python
114 * "text=False|True" option is dropped from the vfs interface because of Python
115 3 compatibility issue. Use "util.tonativeeol/fromnativeeol()" to convert EOL
115 3 compatibility issue. Use "util.tonativeeol/fromnativeeol()" to convert EOL
116 manually.
116 manually.
117
117
118 * wireproto.streamres.__init__ no longer accepts a "reader" argument. Use the
118 * wireproto.streamres.__init__ no longer accepts a "reader" argument. Use the
119 "gen" argument instead.
119 "gen" argument instead.
120
120
121 * exchange.getbundlechunks() now returns a 2-tuple instead of just an
121 * exchange.getbundlechunks() now returns a 2-tuple instead of just an
122 iterator.
122 iterator.
123
123
124
124
125 === commands ===
125 === commands ===
126 * amend: do not drop missing files (Bts:issue5732)
126 * amend: do not drop missing files (Bts:issue5732)
127 * amend: do not take untracked files as modified or clean (Bts:issue5732)
127 * amend: do not take untracked files as modified or clean (Bts:issue5732)
128 * amend: update .hgsubstate before committing a memctx (Bts:issue5677)
128 * amend: update .hgsubstate before committing a memctx (Bts:issue5677)
129 * annotate: add support to specify hidden revs if directaccess config is set
129 * annotate: add support to specify hidden revs if directaccess config is set
130 * bookmark: add methods to binary encode and decode bookmark values
130 * bookmark: add methods to binary encode and decode bookmark values
131 * bookmark: deprecate direct update of a bookmark value
131 * bookmark: deprecate direct update of a bookmark value
132 * bookmark: introduce a 'bookmarks' part
132 * bookmark: introduce a 'bookmarks' part
133 * bookmark: introduce in advance a variant of the exchange test
133 * bookmark: introduce in advance a variant of the exchange test
134 * bookmark: run 'pushkey' hooks after bookmark move, not 'prepushkey'
134 * bookmark: run 'pushkey' hooks after bookmark move, not 'prepushkey'
135 * bookmark: use the 'bookmarks' bundle2 part to push bookmark update (Bts:issue5165)
135 * bookmarks: add bookmarks to hidden revs if directaccess config is set
136 * bookmarks: add bookmarks to hidden revs if directaccess config is set
136 * bookmarks: calculate visibility exceptions only once
137 * bookmarks: calculate visibility exceptions only once
137 * bookmarks: display the obsfate of hidden revision we create a bookmark on
138 * bookmarks: display the obsfate of hidden revision we create a bookmark on
138 * bookmarks: fix pushkey compatibility mode (Bts:issue5777)
139 * bookmarks: fix pushkey compatibility mode (Bts:issue5777)
139 * bookmarks: use context managers for lock and transaction in update()
140 * bookmarks: use context managers for lock and transaction in update()
140 * bookmarks: use context managers for locks and transaction in pushbookmark()
141 * bookmarks: use context managers for locks and transaction in pushbookmark()
142 * branch: add a --rev flag to change branch name of given revisions
141 * branch: allow changing branch name to existing name if possible
143 * branch: allow changing branch name to existing name if possible
142 * clone: add support for storing remotenames while cloning
144 * clone: add support for storing remotenames while cloning
143 * clone: use utility function to write hgrc
145 * clone: use utility function to write hgrc
144 * clonebundle: make it possible to retrieve the initial bundle through largefile
146 * clonebundle: make it possible to retrieve the initial bundle through largefile
147 * commands: use the new API to access hidden changesets in various commands
145 * commandserver: restore cwd in case of exception
148 * commandserver: restore cwd in case of exception
146 * commandserver: unblock SIGCHLD
149 * commandserver: unblock SIGCHLD
150 * fileset: do not crash by unary negate operation
147 * help: deprecate ui.slash in favor of slashpath template filter (Bts:issue5572)
151 * help: deprecate ui.slash in favor of slashpath template filter (Bts:issue5572)
148 * log: allow matchfn to be non-null even if both --patch/--stat are off
152 * log: allow matchfn to be non-null even if both --patch/--stat are off
149 * log: build follow-log filematcher at once
153 * log: build follow-log filematcher at once
150 * log: don't expand aliases in revset built from command options
154 * log: don't expand aliases in revset built from command options
155 * log: follow file history across copies even with -rREV (BC) (Bts:issue4959)
151 * log: make "slowpath" condition slightly more readable
156 * log: make "slowpath" condition slightly more readable
152 * log: make opt2revset table a module constant
157 * log: make opt2revset table a module constant
153 * log: merge getlogrevs() and getgraphlogrevs()
158 * log: merge getlogrevs() and getgraphlogrevs()
154 * log: remove temporary variable 'date' used only once
159 * log: remove temporary variable 'date' used only once
155 * log: resolve --follow thoroughly in getlogrevs()
160 * log: resolve --follow thoroughly in getlogrevs()
156 * log: resolve --follow with -rREV in cmdutil.getlogrevs()
161 * log: resolve --follow with -rREV in cmdutil.getlogrevs()
162 * log: rewrite --follow-first -rREV like --follow for consistency (BC)
157 * log: simplify 'x or ancestors(x)' expression
163 * log: simplify 'x or ancestors(x)' expression
158 * log: translate column labels at once (Bts:issue5750)
164 * log: translate column labels at once (Bts:issue5750)
159 * log: use revsetlang.formatspec() thoroughly
165 * log: use revsetlang.formatspec() thoroughly
160 * log: use revsetlang.formatspec() to concatenate list expression
166 * log: use revsetlang.formatspec() to concatenate list expression
161 * log: use smartset.slice() to limit number of revisions to be displayed
167 * log: use smartset.slice() to limit number of revisions to be displayed
162 * merge: cache unknown dir checks (Bts:issue5716)
168 * merge: cache unknown dir checks (Bts:issue5716)
163 * merge: check created file dirs for path conflicts only once (Bts:issue5716)
169 * merge: check created file dirs for path conflicts only once (Bts:issue5716)
164 * patch: add within-line color diff capacity
170 * patch: add within-line color diff capacity
165 * patch: catch unexpected case in _inlinediff
171 * patch: catch unexpected case in _inlinediff
166 * patch: do not break up multibyte character when highlighting word
172 * patch: do not break up multibyte character when highlighting word
167 * patch: improve heuristics to not take the word "diff" as header (Bts:issue1879)
173 * patch: improve heuristics to not take the word "diff" as header (Bts:issue1879)
168 * patch: reverse _inlinediff output for consistency
174 * patch: reverse _inlinediff output for consistency
169 * pull: clarify that -u only updates linearly
175 * pull: clarify that -u only updates linearly
170 * pull: hold wlock for the full operation when --update is used
176 * pull: hold wlock for the full operation when --update is used
171 * pull: retrieve bookmarks through the binary part when possible
177 * pull: retrieve bookmarks through the binary part when possible
172 * pull: store binary node in pullop.remotebookmarks
178 * pull: store binary node in pullop.remotebookmarks
173 * push: include a 'check:bookmarks' part when possible
179 * push: include a 'check:bookmarks' part when possible
174 * push: restrict common discovery to the pushed set
180 * push: restrict common discovery to the pushed set
181 * revert: do not reverse hunks in interactive when REV is not parent (Bts:issue5096)
175 * revert: support reverting to hidden cset if directaccess config is set
182 * revert: support reverting to hidden cset if directaccess config is set
176
183
177 === core ===
184 === core ===
185 * color: respect HGPLAINEXCEPT=color to allow colors while scripting (Bts:issue5749)
186 * dirstate: add explicit methods for querying directories (API)
187 * dispatch: abort if early boolean options can't be parsed
188 * dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
189 * dispatch: add option to not strip command args parsed by _earlygetopt()
190 * dispatch: alias --repo to --repository while parsing early options
191 * dispatch: fix early parsing of short option with value like -R=foo
192 * dispatch: handle IOError when writing to stderr
193 * dispatch: stop parsing of early boolean option at "--"
194 * dispatch: verify result of early command parsing
195 * exchange: return bundle info from getbundlechunks() (API)
178 * filelog: add the ability to report the user facing name
196 * filelog: add the ability to report the user facing name
197 * localrepo: specify optional callback parameter to pathauditor as a keyword
179 * revlog: choose between ifh and dfh once for all
198 * revlog: choose between ifh and dfh once for all
180 * revlog: don't use slicing to return parents
199 * revlog: don't use slicing to return parents
181 * revlog: group delta computation methods under _deltacomputer object
200 * revlog: group delta computation methods under _deltacomputer object
182 * revlog: group revision info into a dedicated structure
201 * revlog: group revision info into a dedicated structure
183 * revlog: introduce 'deltainfo' to distinguish from 'delta'
202 * revlog: introduce 'deltainfo' to distinguish from 'delta'
184 * revlog: rename 'rev' to 'base', as it is the base revision
203 * revlog: rename 'rev' to 'base', as it is the base revision
185 * revlog: separate diff computation from the collection of other info
204 * revlog: separate diff computation from the collection of other info
186 * revset: evaluate filesets against each revision for 'file()' (Bts:issue5778)
205 * revset: evaluate filesets against each revision for 'file()' (Bts:issue5778)
187 * revset: parse x^:: as (x^):: (Bts:issue5764)
206 * revset: parse x^:: as (x^):: (Bts:issue5764)
207 * streamclone: add support for bundle2 based stream clone
208 * streamclone: add support for cloning non append-only file
209 * streamclone: also stream caches to the client
210 * streamclone: define first iteration of version 2 of stream format
211 * streamclone: move wire protocol status code from wireproto command
212 * streamclone: rework canperformstreamclone
213 * streamclone: tests phase exchange during stream clone
214 * streamclone: use readexactly when reading stream v2
215 * templater: fix crash by empty group expression
216 * templater: keep default resources per template engine (API)
188 * templater: look up symbols/resources as if they were separated (Bts:issue5699)
217 * templater: look up symbols/resources as if they were separated (Bts:issue5699)
189 * transaction: register summary callbacks only at start of transaction (BC)
218 * transaction: register summary callbacks only at start of transaction (BC)
190 * util: whitelist NTFS for hardlink creation (Bts:issue4580)
219 * util: whitelist NTFS for hardlink creation (Bts:issue4580)
220 * vfs: drop text mode flag (API)
221 * wireproto: drop support for reader interface from streamres (API)
191
222
192 === extensions ===
223 === extensions ===
193 * convert: restore the ability to use bzr < 2.6.0 (Bts:issue5733)
224 * convert: restore the ability to use bzr < 2.6.0 (Bts:issue5733)
194 * histedit: add support to output nodechanges using formatter
225 * histedit: add support to output nodechanges using formatter
195 * largefiles: add a 'debuglfput' command to put largefile into the store
226 * largefiles: add a 'debuglfput' command to put largefile into the store
196 * largefiles: add support for 'largefiles://' url scheme
227 * largefiles: add support for 'largefiles://' url scheme
197 * largefiles: allow to run 'debugupgraderepo' on repo with largefiles
228 * largefiles: allow to run 'debugupgraderepo' on repo with largefiles
198 * largefiles: convert EOL of hgrc before appending to bytes IO
199 * largefiles: explicitly set the source and sink types to 'hg' for lfconvert
229 * largefiles: explicitly set the source and sink types to 'hg' for lfconvert
200 * largefiles: modernize how capabilities are added to the wire protocol
230 * largefiles: modernize how capabilities are added to the wire protocol
201 * largefiles: pay attention to dropped standin files when updating largefiles
231 * largefiles: pay attention to dropped standin files when updating largefiles
202 * rebase: add concludememorynode(), and call it when rebasing in-memory
232 * rebase: add concludememorynode(), and call it when rebasing in-memory
203 * rebase: add the --inmemory option flag; assign a wctx object for the rebase
233 * rebase: add the --inmemory option flag; assign a wctx object for the rebase
204 * rebase: add ui.log calls for whether IMM used, whether rebasing WCP
234 * rebase: add ui.log calls for whether IMM used, whether rebasing WCP
205 * rebase: disable 'inmemory' if the rebaseset contains the working copy
235 * rebase: disable 'inmemory' if the rebaseset contains the working copy
206 * rebase: do not bail on uncomitted changes if rebasing in-memory
236 * rebase: do not bail on uncomitted changes if rebasing in-memory
207 * rebase: do not update if IMM; instead, set the overlaywctx's parents
237 * rebase: do not update if IMM; instead, set the overlaywctx's parents
208 * rebase: don't run IMM if running rebase in a transaction
238 * rebase: don't run IMM if running rebase in a transaction
209 * rebase: don't take out a dirstate guard for in-memory rebase
239 * rebase: don't take out a dirstate guard for in-memory rebase
210 * rebase: drop --style option
240 * rebase: drop --style option
241 * rebase: enable multidest by default
242 * rebase: exclude descendants of obsoletes w/o a successor in dest (Bts:issue5300)
211 * rebase: fix for hgsubversion
243 * rebase: fix for hgsubversion
212 * rebase: pass the wctx object (IMM or on-disk) to merge.update
244 * rebase: pass the wctx object (IMM or on-disk) to merge.update
213 * rebase: pass wctx to rebasenode()
245 * rebase: pass wctx to rebasenode()
214 * rebase: rerun a rebase on-disk if IMM merge conflicts arise
246 * rebase: rerun a rebase on-disk if IMM merge conflicts arise
215 * rebase: switch ui.log calls to common style
247 * rebase: switch ui.log calls to common style
216 * rebase: use fm.formatlist() and fm.formatdict() to support user template
248 * rebase: use fm.formatlist() and fm.formatdict() to support user template
217
249
218 === hgweb ===
250 === hgweb ===
219 * hgweb: disable diff.noprefix option for diffstat
251 * hgweb: disable diff.noprefix option for diffstat
220 * hgweb: drop support of browsers that don't understand <canvas> (BC)
252 * hgweb: drop support of browsers that don't understand <canvas> (BC)
221 * hgweb: only include graph-related data in jsdata variable on /graph pages (BC)
253 * hgweb: only include graph-related data in jsdata variable on /graph pages (BC)
222 * hgweb: stop adding strings to innerHTML of #graphnodes and #nodebgs (BC)
254 * hgweb: stop adding strings to innerHTML of #graphnodes and #nodebgs (BC)
223
255
224 === unsorted ===
256 === unsorted ===
225 * archive: add support to specify hidden revs if directaccess config is set
257 * archive: add support to specify hidden revs if directaccess config is set
226 * atomicupdate: add an experimental option to use atomictemp when updating
258 * atomicupdate: add an experimental option to use atomictemp when updating
259 * bundle2: don't use seekable bundle2 parts by default (Bts:issue5691)
227 * bundle: allow bundlerepo to support alternative manifest implementations
260 * bundle: allow bundlerepo to support alternative manifest implementations
228 * changelog: introduce a 'tiprev' method
261 * changelog: introduce a 'tiprev' method
229 * changelog: use 'tiprev()' in 'tip()'
262 * changelog: use 'tiprev()' in 'tip()'
230 * completion: add support for new "amend" command
263 * completion: add support for new "amend" command
264 * crecord: fix revert -ir '.^' crash caused by 3649c3f2cd
231 * debugssl: convert port number to int (Bts:issue5757)
265 * debugssl: convert port number to int (Bts:issue5757)
232 * diff: disable diff.noprefix option for diffstat (Bts:issue5759)
266 * diff: disable diff.noprefix option for diffstat (Bts:issue5759)
233 * dispatch: abort if early boolean options can't be parsed
234 * dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
235 * dispatch: add option to not strip command args parsed by _earlygetopt()
236 * dispatch: alias --repo to --repository while parsing early options
237 * dispatch: convert non-list option parsed by _earlygetopt() to string
238 * dispatch: fix early parsing of short option with value like -R=foo
239 * dispatch: handle IOError when writing to stderr
240 * dispatch: stop parsing of early boolean option at "--"
241 * dispatch: verify result of early command parsing
242 * evolution: make reporting of new unstable changesets optional
267 * evolution: make reporting of new unstable changesets optional
243 * extdata: abort if external command exits with non-zero status (BC)
268 * extdata: abort if external command exits with non-zero status (BC)
244 * fancyopts: add early-options parser compatible with getopt()
269 * fancyopts: add early-options parser compatible with getopt()
245 * graphlog: add another graph node type, unstable, using character "*" (BC)
270 * graphlog: add another graph node type, unstable, using character "*" (BC)
246 * hgdemandimport: use correct hyperlink to python-bug in comments (Bts:issue5765)
271 * hgdemandimport: use correct hyperlink to python-bug in comments (Bts:issue5765)
247 * httppeer: add support for tracing all http request made by the peer
272 * httppeer: add support for tracing all http request made by the peer
248 * identify: document -r. explicitly how to disable wdir scanning (Bts:issue5622)
273 * identify: document -r. explicitly how to disable wdir scanning (Bts:issue5622)
249 * lfs: register config options
274 * lfs: register config options
250 * localrepo: specify optional callback parameter to pathauditor as a keyword
251 * match: do not weirdly include explicit files excluded by -X option
275 * match: do not weirdly include explicit files excluded by -X option
252 * memfilectx: make changectx argument mandatory in constructor (API)
276 * memfilectx: make changectx argument mandatory in constructor (API)
253 * morestatus: don't crash with different drive letters for repo.root and CWD
277 * morestatus: don't crash with different drive letters for repo.root and CWD
254 * outgoing: respect ":pushurl" paths (Bts:issue5365)
278 * outgoing: respect ":pushurl" paths (Bts:issue5365)
255 * remove: print message for each file in verbose mode only while using '-A' (BC)
279 * remove: print message for each file in verbose mode only while using '-A' (BC)
256 * rewriteutil: use precheck() in uncommit and amend commands
280 * rewriteutil: use precheck() in uncommit and amend commands
257 * scmutil: don't try to delete origbackup symlinks to directories (Bts:issue5731)
281 * scmutil: don't try to delete origbackup symlinks to directories (Bts:issue5731)
258 * sshpeer: add support for request tracing
282 * sshpeer: add support for request tracing
259 * streamclone: add support for bundle2 based stream clone
260 * streamclone: add support for cloning non append-only file
261 * streamclone: also stream caches to the client
262 * streamclone: define first iteration of version 2 of stream format
263 * streamclone: move wire protocol status code from wireproto command
264 * streamclone: rework canperformstreamclone
265 * streamclone: tests phase exchange during stream clone
266 * streamclone: use readexactly when reading stream v2
267 * subrepo: add config option to reject any subrepo operations (SEC)
283 * subrepo: add config option to reject any subrepo operations (SEC)
268 * subrepo: disable git and svn subrepos by default (BC) (SEC)
284 * subrepo: disable git and svn subrepos by default (BC) (SEC)
269 * subrepo: extend config option to disable subrepos by type (SEC)
285 * subrepo: extend config option to disable subrepos by type (SEC)
270 * subrepo: handle 'C:' style paths on the command line (Bts:issue5770)
286 * subrepo: handle 'C:' style paths on the command line (Bts:issue5770)
271 * subrepo: use per-type config options to enable subrepos
287 * subrepo: use per-type config options to enable subrepos
272 * svnsubrepo: check if subrepo is missing when checking dirty state (Bts:issue5657)
288 * svnsubrepo: check if subrepo is missing when checking dirty state (Bts:issue5657)
289 * test-bookmarks-pushpull: stabilize for Windows
290 * test-run-tests: stabilize the test (Bts:issue5735)
273 * tr-summary: keep a weakref to the unfiltered repository
291 * tr-summary: keep a weakref to the unfiltered repository
274 * unamend: fix command summary line
292 * unamend: fix command summary line
275 * uncommit: unify functions _uncommitdirstate and _unamenddirstate to one
293 * uncommit: unify functions _uncommitdirstate and _unamenddirstate to one
294 * update: fix crash on bare update when directaccess is enabled
276 * update: support updating to hidden cset if directaccess config is set
295 * update: support updating to hidden cset if directaccess config is set
277
296
278 === BC ===
297 === Behavior Changes ===
279
298
280 * extdata: abort if external command exits with non-zero status (BC)
299 * extdata: abort if external command exits with non-zero status (BC)
281 * graphlog: add another graph node type, unstable, using character "*" (BC)
300 * graphlog: add another graph node type, unstable, using character "*" (BC)
282 * hgweb: drop support of browsers that don't understand <canvas> (BC)
301 * hgweb: drop support of browsers that don't understand <canvas> (BC)
283 * hgweb: only include graph-related data in jsdata variable on /graph pages (BC)
302 * hgweb: only include graph-related data in jsdata variable on /graph pages (BC)
284 * hgweb: stop adding strings to innerHTML of #graphnodes and #nodebgs (BC)
303 * hgweb: stop adding strings to innerHTML of #graphnodes and #nodebgs (BC)
304 * log: follow file history across copies even with -rREV (BC) (Bts:issue4959)
305 * log: rewrite --follow-first -rREV like --follow for consistency (BC)
285 * remove: print message for each file in verbose mode only while using '-A' (BC)
306 * remove: print message for each file in verbose mode only while using '-A' (BC)
286 * subrepo: disable git and svn subrepos by default (BC) (SEC)
307 * subrepo: disable git and svn subrepos by default (BC) (SEC)
287 * transaction: register summary callbacks only at start of transaction (BC)
308 * transaction: register summary callbacks only at start of transaction (BC)
288
309
289 === API Changes ===
310 === Internal API Changes ===
290
311
312 * dirstate: add explicit methods for querying directories (API)
313 * exchange: return bundle info from getbundlechunks() (API)
291 * memfilectx: make changectx argument mandatory in constructor (API)
314 * memfilectx: make changectx argument mandatory in constructor (API)
315 * templater: keep default resources per template engine (API)
316 * vfs: drop text mode flag (API)
317 * wireproto: drop support for reader interface from streamres (API)
General Comments 0
You need to be logged in to leave comments. Login now