##// END OF EJS Templates
relnotes: more improvements
av6 -
r41590:2a42a632 default draft
parent child Browse files
Show More
@@ -1,191 +1,204
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 rules = {
12 rules = {
13 # keep
13 # keep
14 r"\(issue": 100,
14 r"\(issue": 100,
15 r"\(BC\)": 100,
15 r"\(BC\)": 100,
16 r"\(API\)": 100,
16 r"\(API\)": 100,
17 r"\(SEC\)": 100,
17 # core commands, bump up
18 # core commands, bump up
18 r"(commit|files|log|pull|push|patch|status|tag|summary)(|s|es):": 20,
19 r"(commit|files|log|pull|push|patch|status|tag|summary)(|s|es):": 20,
19 r"(annotate|alias|branch|bookmark|clone|graft|import|verify).*:": 20,
20 r"(annotate|alias|branch|bookmark|clone|graft|import|verify).*:": 20,
20 # extensions, bump up
21 # extensions, bump up
21 r"(mq|shelve|rebase):": 20,
22 r"(mq|shelve|rebase):": 20,
22 # newsy
23 # newsy
23 r": deprecate": 20,
24 r": deprecate": 20,
25 r": new.*(extension|flag|module)": 10,
24 r"( ability|command|feature|option|support)": 10,
26 r"( ability|command|feature|option|support)": 10,
25 # experimental
27 # experimental
26 r"hg-experimental": 20,
28 r"hg-experimental": 20,
27 r"(from|graduate).*experimental": 15,
29 r"(from|graduate).*experimental": 15,
28 r"(hide|mark).*experimental": -10,
30 r"(hide|mark).*experimental": -10,
29 # bug-like?
31 # bug-like?
30 r"(fix|don't break|improve)": 7,
32 r"(fix|don't break|improve)": 7,
31 r"(not|n't|avoid|fix|prevent).*crash": 10,
33 r"(not|n't|avoid|fix|prevent).*crash": 10,
34 r"vulnerab": 10,
32 # boring stuff, bump down
35 # boring stuff, bump down
33 r"^contrib": -5,
36 r"^contrib": -5,
34 r"debug": -5,
37 r"debug": -5,
35 r"help": -5,
38 r"help": -5,
39 r"minor": -5,
36 r"(doc|metavar|bundle2|obsolete|obsmarker|rpm|setup|debug\S+:)": -15,
40 r"(doc|metavar|bundle2|obsolete|obsmarker|rpm|setup|debug\S+:)": -15,
37 r"(check-code|check-commit|check-config|import-checker)": -20,
41 r"(check-code|check-commit|check-config|import-checker)": -20,
38 r"(flake8|lintian|pyflakes|pylint)": -20,
42 r"(flake8|lintian|pyflakes|pylint)": -20,
39 # cleanups and refactoring
43 # cleanups and refactoring
40 r"(cleanup|white ?space|spelling|quoting)": -20,
44 r"(clean ?up|white ?space|spelling|quoting)": -20,
41 r"(flatten|dedent|indent|nesting|unnest)": -20,
45 r"(flatten|dedent|indent|nesting|unnest)": -20,
42 r"(typo|hint|note|comment|TODO|FIXME)": -20,
46 r"(typo|hint|note|comment|TODO|FIXME)": -20,
43 r"(style:|convention|one-?liner)": -20,
47 r"(style:|convention|one-?liner)": -20,
44 r"_": -10,
45 r"(argument|absolute_import|attribute|assignment|mutable)": -15,
48 r"(argument|absolute_import|attribute|assignment|mutable)": -15,
46 r"(scope|True|False)": -10,
49 r"(scope|True|False)": -10,
47 r"(unused|useless|unnecessary|superfluous|duplicate|deprecated)": -10,
50 r"(unused|useless|unnecessar|superfluous|duplicate|deprecated)": -10,
48 r"(redundant|pointless|confusing|uninitialized|meaningless|dead)": -10,
51 r"(redundant|pointless|confusing|uninitialized|meaningless|dead)": -10,
49 r": (drop|remove|delete|rip out)": -10,
52 r": (drop|remove|delete|rip out)": -10,
50 r": (inherit|rename|simplify|naming|inline)": -10,
53 r": (inherit|rename|simplify|naming|inline)": -10,
51 r"(correct doc|docstring|document .* method)": -20,
54 r"(correct doc|docstring|document .* method)": -20,
52 r"(abstract|factor|extract|prepare|split|replace| import)": -20,
55 r"(abstract|factor|extract|prepare|split|replace| import)": -20,
53 r": add.*(function|method|implementation|example)": -10,
56 r": add.*(function|method|implementation|example)": -10,
54 r": (move|extract) .* (to|into|from|out of)": -20,
57 r": (move|extract) .* (to|into|from|out of)": -20,
55 r": implement ": -5,
58 r": implement ": -5,
56 r": use .* implementation": -20,
59 r": use .* implementation": -20,
60 r": use .* instead of": -20,
61 # code
62 r"_": -10,
63 r"__": -5,
64 r"\(\)": -5,
57 r"\S\S\S+\.\S\S\S\S+": -5,
65 r"\S\S\S+\.\S\S\S\S+": -5,
58 r": use .* instead of": -20,
59 r"__": -5,
60 # dumb keywords
66 # dumb keywords
61 r"\S+/\S+:": -10,
67 r"\S+/\S+:": -10,
62 r"\S+\.\S+:": -10,
68 r"\S+\.\S+:": -10,
63 # python compatibility
69 # python compatibility
64 r"[Pp]y(|thon) ?[23]": -20,
70 r"[Pp]y(|thon) ?[23]": -20,
65 r"pycompat": -20,
71 r"pycompat": -20,
66 r"(coerce|convert|encode) .*to (byte|sys|)(s|str|string)": -20,
72 r"(coerce|convert|encode) .*to (byte|sys|)(s|str|string)": -20,
67 # tests
73 # tests
68 r"^test(|s|ing|runner|-\S+):": -20,
74 r"^test(|s|ing|runner|-\S+):": -20,
69 r"^(f|hghave|run-tests):": -20,
75 r"^(f|hghave|run-tests):": -20,
70 r"add.* tests?": -20,
76 r"add.* tests?": -20,
71 r"(buildbot|fuzz|mock|ratchet)": -10,
77 r"(buildbot|fuzz|mock|ratchet)": -10,
72 # drop
78 # drop
73 r"^i18n-": -50,
79 r"^i18n-": -50,
74 r"^i18n:.*(hint|comment)": -50,
80 r"^i18n:.*(hint|comment)": -50,
75 r"perf:": -50,
81 r"perf:": -50,
76 r"Added.*for changeset": -50,
82 r"Added.*for changeset": -50,
77 r"^_": -50,
83 r"^_": -50,
78 }
84 }
79
85
80 cutoff = 10
86 cutoff = 10
81 commits = []
87 commits = []
82
88
83 groupings = [
89 groupings = [
84 (r"util|parsers|repo|ctx|context|revlog|filelog|alias|cmdutil", "core"),
90 (r"util|parsers|repo|ctx|context|revlog|filelog|alias|cmdutil", "core"),
85 (r"revset|template|ui|dirstate|hook|i18n|transaction|wire|vfs", "core"),
91 (r"revset|template|ui|dirstate|hook|i18n|transaction|wire|vfs", "core"),
86 (r"dispatch|exchange|localrepo|streamclone|color|pager", "core"),
92 (r"dispatch|exchange|localrepo|streamclone|color|pager", "core"),
87 (r"hgweb|paper|coal|gitweb|monoblue|spartan", "hgweb"),
93 (r"hgweb|paper|coal|gitweb|monoblue|spartan", "hgweb"),
88 (r"pull|push|revert|resolve|annotate|bookmark|branch|clone", "commands"),
94 (r"pull|push|revert|resolve|annotate|bookmark|branch|clone", "commands"),
89 (r"commands|commit|config|files|graft|import|log|merge|patch", "commands"),
95 (r"commands|commit|config|files|graft|import|log|merge|patch", "commands"),
90 (r"phases|status|summary|amend|tag|help|verify", "commands"),
96 (r"phases|status|summary|amend|tag|help|verify", "commands"),
91 (r"rebase|mq|convert|eol|histedit|largefiles", "extensions"),
97 (r"rebase|mq|convert|eol|histedit|largefiles", "extensions"),
92 (r"shelve|unshelve", "extensions"),
98 (r"shelve|unshelve", "extensions"),
93 ]
99 ]
94
100
101 def wikify(desc):
102 desc = desc.replace("(issue", "(Bts:issue")
103 desc = re.sub(r"\b([0-9a-f]{12})\b", r"Cset:\1", desc)
104 # stop ParseError from being recognized as a (nonexistent) wiki page
105 desc = re.sub(r" ([A-Z][a-z]+[A-Z][a-z]+)\b", r" !\1", desc)
106 # prevent wiki markup of magic methods
107 desc = re.sub(r"\b(\S*__\S*)\b", r"`\1`", desc)
108 return desc
109
95 def main():
110 def main():
96 desc = "example: %(prog)s 4.7.2 --stoprev 4.8rc0"
111 desc = "example: %(prog)s 4.7.2 --stoprev 4.8rc0"
97 ap = argparse.ArgumentParser(description=desc)
112 ap = argparse.ArgumentParser(description=desc)
98 ap.add_argument(
113 ap.add_argument(
99 "startrev",
114 "startrev",
100 metavar="REV",
115 metavar="REV",
101 type=str,
116 type=str,
102 help=(
117 help=(
103 "Starting revision for the release notes. This revision "
118 "Starting revision for the release notes. This revision "
104 "won't be included, but later revisions will."
119 "won't be included, but later revisions will."
105 ),
120 ),
106 )
121 )
107 ap.add_argument(
122 ap.add_argument(
108 "--stoprev",
123 "--stoprev",
109 metavar="REV",
124 metavar="REV",
110 type=str,
125 type=str,
111 default="@",
126 default="@",
112 help=(
127 help=(
113 "Stop revision for release notes. This revision will be included,"
128 "Stop revision for release notes. This revision will be included,"
114 " but no later revisions will. This revision needs to be "
129 " but no later revisions will. This revision needs to be "
115 "a descendant of startrev."
130 "a descendant of startrev."
116 ),
131 ),
117 )
132 )
118 args = ap.parse_args()
133 args = ap.parse_args()
119 fromext = subprocess.check_output(
134 fromext = subprocess.check_output(
120 [
135 [
121 "hg",
136 "hg",
122 "--config",
137 "--config",
123 "extensions.releasenotes=",
138 "extensions.releasenotes=",
124 "releasenotes",
139 "releasenotes",
125 "-r",
140 "-r",
126 "only(%s, %s)" % (args.stoprev, args.startrev),
141 "only(%s, %s)" % (args.stoprev, args.startrev),
127 ]
142 ]
128 ).decode("utf-8")
143 ).decode("utf-8")
129 # Find all release notes from un-relnotes-flagged commits.
144 # Find all release notes from un-relnotes-flagged commits.
130 for entry in sorted(
145 for entry in sorted(
131 subprocess.check_output(
146 subprocess.check_output(
132 [
147 [
133 "hg",
148 "hg",
134 "log",
149 "log",
135 "-r",
150 "-r",
136 "only(%s, %s) - merge()" % (args.stoprev, args.startrev),
151 "only(%s, %s) - merge()" % (args.stoprev, args.startrev),
137 "-T",
152 "-T",
138 r"{desc|firstline}\n",
153 r"{desc|firstline}\n",
139 ]
154 ]
140 )
155 )
141 .decode("utf-8")
156 .decode("utf-8")
142 .splitlines()
157 .splitlines()
143 ):
158 ):
144 desc = entry.replace("`", "'")
159 desc = entry.replace("`", "'")
145
160
146 score = 0
161 score = 0
147 for rule, val in rules.items():
162 for rule, val in rules.items():
148 if re.search(rule, desc):
163 if re.search(rule, desc):
149 score += val
164 score += val
150
165
151 desc = desc.replace("(issue", "(Bts:issue")
152
153 if score >= cutoff:
166 if score >= cutoff:
154 commits.append(desc)
167 commits.append(wikify(desc))
155 # Group unflagged notes.
168 # Group unflagged notes.
156 groups = {}
169 groups = {}
157 bcs = []
170 bcs = []
158 apis = []
171 apis = []
159
172
160 for d in commits:
173 for d in commits:
161 if "(BC)" in d:
174 if "(BC)" in d:
162 bcs.append(d)
175 bcs.append(d)
163 if "(API)" in d:
176 if "(API)" in d:
164 apis.append(d)
177 apis.append(d)
165 for rule, g in groupings:
178 for rule, g in groupings:
166 if re.match(rule, d):
179 if re.match(rule, d):
167 groups.setdefault(g, []).append(d)
180 groups.setdefault(g, []).append(d)
168 break
181 break
169 else:
182 else:
170 groups.setdefault("unsorted", []).append(d)
183 groups.setdefault("unsorted", []).append(d)
171 print(fromext)
184 print(fromext)
172 # print legacy release notes sections
185 # print legacy release notes sections
173 for g in sorted(groups):
186 for g in sorted(groups):
174 print("\n=== %s ===" % g)
187 print("\n=== %s ===" % g)
175 for d in sorted(groups[g]):
188 for d in sorted(groups[g]):
176 print(" * %s" % d)
189 print(" * %s" % d)
177
190
178 if bcs:
191 if bcs:
179 print("\n=== Behavior Changes ===\n")
192 print("\n=== Behavior Changes ===\n")
180
193
181 for d in sorted(bcs):
194 for d in sorted(bcs):
182 print(" * %s" % d)
195 print(" * %s" % d)
183
196
184 if apis:
197 if apis:
185 print("\n=== Internal API Changes ===\n")
198 print("\n=== Internal API Changes ===\n")
186
199
187 for d in sorted(apis):
200 for d in sorted(apis):
188 print(" * %s" % d)
201 print(" * %s" % d)
189
202
190 if __name__ == "__main__":
203 if __name__ == "__main__":
191 main()
204 main()
@@ -1,317 +1,317
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 * bookmark: use the 'bookmarks' bundle2 part to push bookmark update (Bts:issue5165)
136 * bookmarks: add bookmarks to hidden revs if directaccess config is set
136 * bookmarks: add bookmarks to hidden revs if directaccess config is set
137 * bookmarks: calculate visibility exceptions only once
137 * bookmarks: calculate visibility exceptions only once
138 * 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
139 * bookmarks: fix pushkey compatibility mode (Bts:issue5777)
139 * bookmarks: fix pushkey compatibility mode (Bts:issue5777)
140 * bookmarks: use context managers for lock and transaction in update()
140 * bookmarks: use context managers for lock and transaction in update()
141 * 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
142 * branch: add a --rev flag to change branch name of given revisions
143 * branch: allow changing branch name to existing name if possible
143 * branch: allow changing branch name to existing name if possible
144 * clone: add support for storing remotenames while cloning
144 * clone: add support for storing remotenames while cloning
145 * clone: use utility function to write hgrc
145 * clone: use utility function to write hgrc
146 * 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
147 * commands: use the new API to access hidden changesets in various commands
148 * commandserver: restore cwd in case of exception
148 * commandserver: restore cwd in case of exception
149 * commandserver: unblock SIGCHLD
149 * commandserver: unblock SIGCHLD
150 * fileset: do not crash by unary negate operation
150 * fileset: do not crash by unary negate operation
151 * 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)
152 * 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
153 * log: build follow-log filematcher at once
153 * log: build follow-log filematcher at once
154 * 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)
155 * log: follow file history across copies even with -rREV (BC) (Bts:issue4959)
156 * log: make "slowpath" condition slightly more readable
156 * log: make "slowpath" condition slightly more readable
157 * log: make opt2revset table a module constant
157 * log: make opt2revset table a module constant
158 * log: merge getlogrevs() and getgraphlogrevs()
158 * log: merge getlogrevs() and getgraphlogrevs()
159 * log: remove temporary variable 'date' used only once
159 * log: remove temporary variable 'date' used only once
160 * log: resolve --follow thoroughly in getlogrevs()
160 * log: resolve --follow thoroughly in getlogrevs()
161 * 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)
162 * log: rewrite --follow-first -rREV like --follow for consistency (BC)
163 * log: simplify 'x or ancestors(x)' expression
163 * log: simplify 'x or ancestors(x)' expression
164 * log: translate column labels at once (Bts:issue5750)
164 * log: translate column labels at once (Bts:issue5750)
165 * log: use revsetlang.formatspec() thoroughly
165 * log: use revsetlang.formatspec() thoroughly
166 * log: use revsetlang.formatspec() to concatenate list expression
166 * log: use revsetlang.formatspec() to concatenate list expression
167 * 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
168 * merge: cache unknown dir checks (Bts:issue5716)
168 * merge: cache unknown dir checks (Bts:issue5716)
169 * 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)
170 * patch: add within-line color diff capacity
170 * patch: add within-line color diff capacity
171 * patch: catch unexpected case in _inlinediff
171 * patch: catch unexpected case in _inlinediff
172 * patch: do not break up multibyte character when highlighting word
172 * patch: do not break up multibyte character when highlighting word
173 * 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)
174 * patch: reverse _inlinediff output for consistency
174 * patch: reverse _inlinediff output for consistency
175 * pull: clarify that -u only updates linearly
175 * pull: clarify that -u only updates linearly
176 * pull: hold wlock for the full operation when --update is used
176 * pull: hold wlock for the full operation when --update is used
177 * pull: retrieve bookmarks through the binary part when possible
177 * pull: retrieve bookmarks through the binary part when possible
178 * pull: store binary node in pullop.remotebookmarks
178 * pull: store binary node in pullop.remotebookmarks
179 * push: include a 'check:bookmarks' part when possible
179 * push: include a 'check:bookmarks' part when possible
180 * 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)
181 * revert: do not reverse hunks in interactive when REV is not parent (Bts:issue5096)
182 * revert: support reverting to hidden cset if directaccess config is set
182 * revert: support reverting to hidden cset if directaccess config is set
183
183
184 === core ===
184 === core ===
185 * color: respect HGPLAINEXCEPT=color to allow colors while scripting (Bts:issue5749)
185 * color: respect HGPLAINEXCEPT=color to allow colors while scripting (Bts:issue5749)
186 * dirstate: add explicit methods for querying directories (API)
186 * dirstate: add explicit methods for querying directories (API)
187 * dispatch: abort if early boolean options can't be parsed
187 * dispatch: abort if early boolean options can't be parsed
188 * dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
188 * dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
189 * dispatch: add option to not strip command args parsed by _earlygetopt()
189 * dispatch: add option to not strip command args parsed by _earlygetopt()
190 * dispatch: alias --repo to --repository while parsing early options
190 * dispatch: alias --repo to --repository while parsing early options
191 * dispatch: fix early parsing of short option with value like -R=foo
191 * dispatch: fix early parsing of short option with value like -R=foo
192 * dispatch: handle IOError when writing to stderr
192 * dispatch: handle IOError when writing to stderr
193 * dispatch: stop parsing of early boolean option at "--"
193 * dispatch: stop parsing of early boolean option at "--"
194 * dispatch: verify result of early command parsing
194 * dispatch: verify result of early command parsing
195 * exchange: return bundle info from getbundlechunks() (API)
195 * exchange: return bundle info from getbundlechunks() (API)
196 * 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
197 * localrepo: specify optional callback parameter to pathauditor as a keyword
198 * revlog: choose between ifh and dfh once for all
198 * revlog: choose between ifh and dfh once for all
199 * revlog: don't use slicing to return parents
199 * revlog: don't use slicing to return parents
200 * revlog: group delta computation methods under _deltacomputer object
200 * revlog: group delta computation methods under _deltacomputer object
201 * revlog: group revision info into a dedicated structure
201 * revlog: group revision info into a dedicated structure
202 * revlog: introduce 'deltainfo' to distinguish from 'delta'
202 * revlog: introduce 'deltainfo' to distinguish from 'delta'
203 * revlog: rename 'rev' to 'base', as it is the base revision
203 * revlog: rename 'rev' to 'base', as it is the base revision
204 * revlog: separate diff computation from the collection of other info
204 * revlog: separate diff computation from the collection of other info
205 * revset: evaluate filesets against each revision for 'file()' (Bts:issue5778)
205 * revset: evaluate filesets against each revision for 'file()' (Bts:issue5778)
206 * revset: parse x^:: as (x^):: (Bts:issue5764)
206 * revset: parse x^:: as (x^):: (Bts:issue5764)
207 * streamclone: add support for bundle2 based stream clone
207 * streamclone: add support for bundle2 based stream clone
208 * streamclone: add support for cloning non append-only file
208 * streamclone: add support for cloning non append-only file
209 * streamclone: also stream caches to the client
209 * streamclone: also stream caches to the client
210 * streamclone: define first iteration of version 2 of stream format
210 * streamclone: define first iteration of version 2 of stream format
211 * streamclone: move wire protocol status code from wireproto command
211 * streamclone: move wire protocol status code from wireproto command
212 * streamclone: rework canperformstreamclone
212 * streamclone: rework canperformstreamclone
213 * streamclone: tests phase exchange during stream clone
213 * streamclone: tests phase exchange during stream clone
214 * streamclone: use readexactly when reading stream v2
214 * streamclone: use readexactly when reading stream v2
215 * templater: fix crash by empty group expression
215 * templater: fix crash by empty group expression
216 * templater: keep default resources per template engine (API)
216 * templater: keep default resources per template engine (API)
217 * 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)
218 * transaction: register summary callbacks only at start of transaction (BC)
218 * transaction: register summary callbacks only at start of transaction (BC)
219 * util: whitelist NTFS for hardlink creation (Bts:issue4580)
219 * util: whitelist NTFS for hardlink creation (Bts:issue4580)
220 * vfs: drop text mode flag (API)
220 * vfs: drop text mode flag (API)
221 * wireproto: drop support for reader interface from streamres (API)
221 * wireproto: drop support for reader interface from streamres (API)
222
222
223 === extensions ===
223 === extensions ===
224 * 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)
225 * histedit: add support to output nodechanges using formatter
225 * histedit: add support to output nodechanges using formatter
226 * largefiles: add a 'debuglfput' command to put largefile into the store
226 * largefiles: add a 'debuglfput' command to put largefile into the store
227 * largefiles: add support for 'largefiles://' url scheme
227 * largefiles: add support for 'largefiles://' url scheme
228 * largefiles: allow to run 'debugupgraderepo' on repo with largefiles
228 * largefiles: allow to run 'debugupgraderepo' on repo with largefiles
229 * 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
230 * largefiles: modernize how capabilities are added to the wire protocol
230 * largefiles: modernize how capabilities are added to the wire protocol
231 * largefiles: pay attention to dropped standin files when updating largefiles
231 * largefiles: pay attention to dropped standin files when updating largefiles
232 * rebase: add concludememorynode(), and call it when rebasing in-memory
232 * rebase: add concludememorynode(), and call it when rebasing in-memory
233 * 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
234 * 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
235 * rebase: disable 'inmemory' if the rebaseset contains the working copy
235 * rebase: disable 'inmemory' if the rebaseset contains the working copy
236 * rebase: do not bail on uncomitted changes if rebasing in-memory
236 * rebase: do not bail on uncomitted changes if rebasing in-memory
237 * 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
238 * rebase: don't run IMM if running rebase in a transaction
238 * rebase: don't run IMM if running rebase in a transaction
239 * 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
240 * rebase: drop --style option
240 * rebase: drop --style option
241 * rebase: enable multidest by default
241 * rebase: enable multidest by default
242 * rebase: exclude descendants of obsoletes w/o a successor in dest (Bts:issue5300)
242 * rebase: exclude descendants of obsoletes w/o a successor in dest (Bts:issue5300)
243 * rebase: fix for hgsubversion
243 * rebase: fix for hgsubversion
244 * 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
245 * rebase: pass wctx to rebasenode()
245 * rebase: pass wctx to rebasenode()
246 * rebase: rerun a rebase on-disk if IMM merge conflicts arise
246 * rebase: rerun a rebase on-disk if IMM merge conflicts arise
247 * rebase: switch ui.log calls to common style
247 * rebase: switch ui.log calls to common style
248 * rebase: use fm.formatlist() and fm.formatdict() to support user template
248 * rebase: use fm.formatlist() and fm.formatdict() to support user template
249
249
250 === hgweb ===
250 === hgweb ===
251 * hgweb: disable diff.noprefix option for diffstat
251 * hgweb: disable diff.noprefix option for diffstat
252 * hgweb: drop support of browsers that don't understand <canvas> (BC)
252 * hgweb: drop support of browsers that don't understand <canvas> (BC)
253 * 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)
254 * hgweb: stop adding strings to innerHTML of #graphnodes and #nodebgs (BC)
254 * hgweb: stop adding strings to innerHTML of #graphnodes and #nodebgs (BC)
255
255
256 === unsorted ===
256 === unsorted ===
257 * 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
258 * 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)
259 * bundle2: don't use seekable bundle2 parts by default (Bts:issue5691)
260 * bundle: allow bundlerepo to support alternative manifest implementations
260 * bundle: allow bundlerepo to support alternative manifest implementations
261 * changelog: introduce a 'tiprev' method
261 * changelog: introduce a 'tiprev' method
262 * changelog: use 'tiprev()' in 'tip()'
262 * changelog: use 'tiprev()' in 'tip()'
263 * completion: add support for new "amend" command
263 * completion: add support for new "amend" command
264 * crecord: fix revert -ir '.^' crash caused by 3649c3f2cd
264 * crecord: fix revert -ir '.^' crash caused by 3649c3f2cd
265 * debugssl: convert port number to int (Bts:issue5757)
265 * debugssl: convert port number to int (Bts:issue5757)
266 * diff: disable diff.noprefix option for diffstat (Bts:issue5759)
266 * diff: disable diff.noprefix option for diffstat (Bts:issue5759)
267 * evolution: make reporting of new unstable changesets optional
267 * evolution: make reporting of new unstable changesets optional
268 * extdata: abort if external command exits with non-zero status (BC)
268 * extdata: abort if external command exits with non-zero status (BC)
269 * fancyopts: add early-options parser compatible with getopt()
270 * graphlog: add another graph node type, unstable, using character "*" (BC)
269 * graphlog: add another graph node type, unstable, using character "*" (BC)
271 * hgdemandimport: use correct hyperlink to python-bug in comments (Bts:issue5765)
270 * hgdemandimport: use correct hyperlink to python-bug in comments (Bts:issue5765)
272 * httppeer: add support for tracing all http request made by the peer
271 * httppeer: add support for tracing all http request made by the peer
273 * identify: document -r. explicitly how to disable wdir scanning (Bts:issue5622)
272 * identify: document -r. explicitly how to disable wdir scanning (Bts:issue5622)
274 * lfs: register config options
273 * lfs: register config options
275 * match: do not weirdly include explicit files excluded by -X option
274 * match: do not weirdly include explicit files excluded by -X option
276 * memfilectx: make changectx argument mandatory in constructor (API)
275 * memfilectx: make changectx argument mandatory in constructor (API)
277 * morestatus: don't crash with different drive letters for repo.root and CWD
276 * morestatus: don't crash with different drive letters for repo.root and CWD
278 * outgoing: respect ":pushurl" paths (Bts:issue5365)
277 * outgoing: respect ":pushurl" paths (Bts:issue5365)
279 * remove: print message for each file in verbose mode only while using '-A' (BC)
278 * remove: print message for each file in verbose mode only while using '-A' (BC)
280 * rewriteutil: use precheck() in uncommit and amend commands
281 * scmutil: don't try to delete origbackup symlinks to directories (Bts:issue5731)
279 * scmutil: don't try to delete origbackup symlinks to directories (Bts:issue5731)
282 * sshpeer: add support for request tracing
280 * sshpeer: add support for request tracing
283 * subrepo: add config option to reject any subrepo operations (SEC)
281 * subrepo: add config option to reject any subrepo operations (SEC)
284 * subrepo: disable git and svn subrepos by default (BC) (SEC)
282 * subrepo: disable git and svn subrepos by default (BC) (SEC)
283 * subrepo: disallow symlink traversal across subrepo mount point (SEC)
285 * subrepo: extend config option to disable subrepos by type (SEC)
284 * subrepo: extend config option to disable subrepos by type (SEC)
286 * subrepo: handle 'C:' style paths on the command line (Bts:issue5770)
285 * subrepo: handle 'C:' style paths on the command line (Bts:issue5770)
287 * subrepo: use per-type config options to enable subrepos
286 * subrepo: use per-type config options to enable subrepos
288 * svnsubrepo: check if subrepo is missing when checking dirty state (Bts:issue5657)
287 * svnsubrepo: check if subrepo is missing when checking dirty state (Bts:issue5657)
289 * test-bookmarks-pushpull: stabilize for Windows
288 * test-bookmarks-pushpull: stabilize for Windows
290 * test-run-tests: stabilize the test (Bts:issue5735)
289 * test-run-tests: stabilize the test (Bts:issue5735)
290 * tests: show symlink traversal across subrepo mount point (SEC)
291 * tr-summary: keep a weakref to the unfiltered repository
291 * tr-summary: keep a weakref to the unfiltered repository
292 * unamend: fix command summary line
292 * unamend: fix command summary line
293 * 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
294 * update: fix crash on bare update when directaccess is enabled
295 * update: support updating to hidden cset if directaccess config is set
295 * update: support updating to hidden cset if directaccess config is set
296
296
297 === Behavior Changes ===
297 === Behavior Changes ===
298
298
299 * extdata: abort if external command exits with non-zero status (BC)
299 * extdata: abort if external command exits with non-zero status (BC)
300 * graphlog: add another graph node type, unstable, using character "*" (BC)
300 * graphlog: add another graph node type, unstable, using character "*" (BC)
301 * hgweb: drop support of browsers that don't understand <canvas> (BC)
301 * hgweb: drop support of browsers that don't understand <canvas> (BC)
302 * 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)
303 * 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)
304 * log: follow file history across copies even with -rREV (BC) (Bts:issue4959)
305 * log: rewrite --follow-first -rREV like --follow for consistency (BC)
305 * log: rewrite --follow-first -rREV like --follow for consistency (BC)
306 * 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)
307 * subrepo: disable git and svn subrepos by default (BC) (SEC)
307 * subrepo: disable git and svn subrepos by default (BC) (SEC)
308 * transaction: register summary callbacks only at start of transaction (BC)
308 * transaction: register summary callbacks only at start of transaction (BC)
309
309
310 === Internal API Changes ===
310 === Internal API Changes ===
311
311
312 * dirstate: add explicit methods for querying directories (API)
312 * dirstate: add explicit methods for querying directories (API)
313 * exchange: return bundle info from getbundlechunks() (API)
313 * exchange: return bundle info from getbundlechunks() (API)
314 * 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)
315 * templater: keep default resources per template engine (API)
316 * vfs: drop text mode flag (API)
316 * vfs: drop text mode flag (API)
317 * wireproto: drop support for reader interface from streamres (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